{ "cells": [ { "cell_type": "markdown", "id": "6c4d4faf-ab84-4a72-a80e-535b211747cd", "metadata": { "tags": [] }, "source": [ "# H2O Sonar Demo of Driverless AI MOJO Models" ] }, { "cell_type": "code", "execution_count": 15, "id": "69f414e3-bc88-478b-bed5-890352b1041a", "metadata": {}, "outputs": [], "source": [ "import os\n", "import logging\n", "\n", "import datatable\n", "import daimojo\n", "import webbrowser\n", "\n", "from h2o_sonar import interpret\n", "from h2o_sonar.lib.api import commons\n", "from h2o_sonar.lib.api import explainers\n", "from h2o_sonar.explainers import fi_naive_shapley_explainer as explainer\n", "from h2o_sonar.lib.api.models import ModelApi" ] }, { "cell_type": "code", "execution_count": 16, "id": "bbe0ca51", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'id': 'h2o_sonar.explainers.fi_naive_shapley_explainer.NaiveShapleyMojoFeatureImportanceExplainer',\n", " 'name': 'NaiveShapleyMojoFeatureImportanceExplainer',\n", " 'display_name': 'Shapley Values for Original Features of MOJO Models (Naive Method)',\n", " 'tagline': 'NaiveShapleyMojoFeatureImportanceExplainer.',\n", " 'description': 'Shapley values for original features of (Driverless AI) MOJO models are approximated from the accompanying Shapley values for transformed features with the Naive Shapley method. This method makes the assumption that input features to a transformer are independent. For example, if the transformed feature, feature1_feature2, has a Shapley value of 0.5, then the Shapley value of the original features feature1 and feature2 will be 0.25 each.',\n", " 'brief_description': 'NaiveShapleyMojoFeatureImportanceExplainer.',\n", " 'model_types': ['iid'],\n", " 'can_explain': ['regression', 'binomial', 'multinomial'],\n", " 'explanation_scopes': ['global_scope', 'local_scope'],\n", " 'explanations': [{'explanation_type': 'global-feature-importance',\n", " 'name': 'GlobalFeatImpExplanation',\n", " 'category': '',\n", " 'scope': 'global',\n", " 'has_local': '',\n", " 'formats': []},\n", " {'explanation_type': 'local-feature-importance',\n", " 'name': 'LocalFeatImpExplanation',\n", " 'category': '',\n", " 'scope': 'local',\n", " 'has_local': '',\n", " 'formats': []}],\n", " 'keywords': ['run-by-default',\n", " 'explains-original-feature-importance',\n", " 'is_fast',\n", " 'h2o-sonar'],\n", " 'parameters': [{'name': 'sample_size',\n", " 'description': 'Sample size.',\n", " 'comment': '',\n", " 'type': 'int',\n", " 'val': 100000,\n", " 'predefined': [],\n", " 'tags': [],\n", " 'min_': 0.0,\n", " 'max_': 0.0,\n", " 'category': ''},\n", " {'name': 'fast_approx_contribs',\n", " 'description': 'Speed up predictions with fast contributions predictions approximation.',\n", " 'comment': '',\n", " 'type': 'bool',\n", " 'val': True,\n", " 'predefined': [],\n", " 'tags': [],\n", " 'min_': 0.0,\n", " 'max_': 0.0,\n", " 'category': ''},\n", " {'name': 'leakage_warning_threshold',\n", " 'description': 'The threshold above which to report a potentially detected feature importance leak problem.',\n", " 'comment': '',\n", " 'type': 'float',\n", " 'val': 0.95,\n", " 'predefined': [],\n", " 'tags': [],\n", " 'min_': 0.0,\n", " 'max_': 0.0,\n", " 'category': ''}],\n", " 'metrics_meta': []}" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# explainer description\n", "interpret.describe_explainer(explainer.NaiveShapleyMojoFeatureImportanceExplainer)" ] }, { "cell_type": "markdown", "id": "90d401d2-14cd-4686-982f-3cac9e9f5eb7", "metadata": { "tags": [] }, "source": [ "## Interpretation" ] }, { "cell_type": "code", "execution_count": 17, "id": "15201d08-873b-45c3-82ad-052266f0526c", "metadata": {}, "outputs": [], "source": [ "# dataset\n", "dataset_path = \"../../data/predictive/creditcard.csv\"\n", "target_col = \"default payment next month\"\n", "\n", "# model\n", "mojo_path = \"../../data/predictive/models/creditcard-binomial.mojo\"\n", "mojo_model = daimojo.model(mojo_path)\n", "model = ModelApi().create_model(\n", " model_src=mojo_model,\n", " target_col=target_col,\n", " used_features=list(mojo_model.feature_names),\n", ")\n", "\n", "# results\n", "results_location = \"./results\"\n", "os.makedirs(results_location, exist_ok=True)" ] }, { "cell_type": "code", "execution_count": 18, "id": "0ba8f0aa-2e0e-4a0a-93ab-77ce9e968fa0", "metadata": { "tags": [] }, "outputs": [], "source": [ "%%capture\n", "interpretation = interpret.run_interpretation(\n", " dataset=dataset_path,\n", " model=model,\n", " target_col=target_col,\n", " results_location=results_location,\n", " explainers=[explainer.NaiveShapleyMojoFeatureImportanceExplainer.explainer_id()],\n", " log_level=logging.INFO,\n", ")" ] }, { "cell_type": "markdown", "id": "ff9df4be-d4da-44db-a479-7d8d7f45c29d", "metadata": { "tags": [] }, "source": [ "## Explainer Result" ] }, { "cell_type": "code", "execution_count": 19, "id": "25556ca5-8239-4201-8a23-1ace2b3a46d4", "metadata": { "tags": [] }, "outputs": [], "source": [ "# retrieve the result\n", "result = interpretation.get_explainer_result(\n", " explainer.NaiveShapleyMojoFeatureImportanceExplainer.explainer_id()\n", ")" ] }, { "cell_type": "code", "execution_count": 20, "id": "fb71aafe-543d-49dd-aa20-bae7753af62e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# open interpretation HTML report in web browser\n", "webbrowser.open(interpretation.result.get_html_report_location())" ] }, { "cell_type": "code", "execution_count": 21, "id": "122fa09a-f552-4945-8b17-6b2c91fc64eb", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "{'id': 'h2o_sonar.explainers.fi_naive_shapley_explainer.NaiveShapleyMojoFeatureImportanceExplainer',\n", " 'name': 'NaiveShapleyMojoFeatureImportanceExplainer',\n", " 'display_name': 'Shapley Values for Original Features of MOJO Models (Naive Method)',\n", " 'tagline': 'NaiveShapleyMojoFeatureImportanceExplainer.',\n", " 'description': 'Shapley values for original features of (Driverless AI) MOJO models are approximated from the accompanying Shapley values for transformed features with the Naive Shapley method. This method makes the assumption that input features to a transformer are independent. For example, if the transformed feature, feature1_feature2, has a Shapley value of 0.5, then the Shapley value of the original features feature1 and feature2 will be 0.25 each.',\n", " 'brief_description': 'NaiveShapleyMojoFeatureImportanceExplainer.',\n", " 'model_types': ['iid'],\n", " 'can_explain': ['regression', 'binomial', 'multinomial'],\n", " 'explanation_scopes': ['global_scope', 'local_scope'],\n", " 'explanations': [{'explanation_type': 'global-feature-importance',\n", " 'name': 'Shapley Values for Original Features of MOJO Models (Naive Method)',\n", " 'category': 'DAI MODEL',\n", " 'scope': 'global',\n", " 'has_local': 'local-feature-importance',\n", " 'formats': ['application/vnd.h2oai.json+datatable.jay',\n", " 'application/vnd.h2oai.json+csv',\n", " 'application/json']},\n", " {'explanation_type': 'local-feature-importance',\n", " 'name': 'Shapley Values for Original Features of MOJO Models (Naive Method)',\n", " 'category': 'DAI MODEL',\n", " 'scope': 'local',\n", " 'has_local': None,\n", " 'formats': ['application/vnd.h2oai.json+datatable.jay']},\n", " {'explanation_type': 'global-html-fragment',\n", " 'name': 'Shapley Values for Original Features of MOJO Models (Naive Method)',\n", " 'category': 'DAI MODEL',\n", " 'scope': 'global',\n", " 'has_local': None,\n", " 'formats': ['text/html']}],\n", " 'keywords': ['run-by-default',\n", " 'explains-original-feature-importance',\n", " 'is_fast',\n", " 'h2o-sonar'],\n", " 'parameters': [{'name': 'sample_size',\n", " 'description': 'Sample size.',\n", " 'comment': '',\n", " 'type': 'int',\n", " 'val': 100000,\n", " 'predefined': [],\n", " 'tags': [],\n", " 'min_': 0.0,\n", " 'max_': 0.0,\n", " 'category': ''},\n", " {'name': 'fast_approx_contribs',\n", " 'description': 'Speed up predictions with fast contributions predictions approximation.',\n", " 'comment': '',\n", " 'type': 'bool',\n", " 'val': True,\n", " 'predefined': [],\n", " 'tags': [],\n", " 'min_': 0.0,\n", " 'max_': 0.0,\n", " 'category': ''},\n", " {'name': 'leakage_warning_threshold',\n", " 'description': 'The threshold above which to report a potentially detected feature importance leak problem.',\n", " 'comment': '',\n", " 'type': 'float',\n", " 'val': 0.95,\n", " 'predefined': [],\n", " 'tags': [],\n", " 'min_': 0.0,\n", " 'max_': 0.0,\n", " 'category': ''}],\n", " 'metrics_meta': []}" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# summary\n", "result.summary()" ] }, { "cell_type": "code", "execution_count": 22, "id": "4a40f000-8120-4898-82d7-ca0ad9c3425b", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "{'sample_size': 100000,\n", " 'fast_approx_contribs': True,\n", " 'leakage_warning_threshold': 0.95}" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Parameters\n", "result.params()" ] }, { "cell_type": "markdown", "id": "490d132b-b7e2-48a2-8ec4-dbd71886edf9", "metadata": { "tags": [] }, "source": [ "### Display Data" ] }, { "cell_type": "code", "execution_count": 23, "id": "2aa6274e-79d5-49b1-b29a-2263db5cb8a8", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
featureimportance
▪▪▪▪▪▪▪▪▪▪▪▪
0PAY_00.592187
1PAY_20.224423
2LIMIT_BAL0.159352
3PAY_AMT40.14868
4PAY_AMT20.125437
5BILL_AMT10.101179
6PAY_30.0576715
7PAY_AMT30.0495318
8PAY_60.0453093
9PAY_40.0391064
10BILL_AMT20.0371473
11BILL_AMT60.0298867
12PAY_50.0270603
13PAY_AMT10.01873
14EDUCATION0.0131732
15AGE0.0110948
16MARRIAGE0.00884818
17PAY_AMT60.00759522
18PAY_AMT50.00719935
19BILL_AMT50.00589392
20BILL_AMT40.00189465
21BILL_AMT30.00108067
\n", " \n", "
\n" ], "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result.data()" ] }, { "cell_type": "markdown", "id": "df8a083b-3b88-4349-bb63-28551c24cc4f", "metadata": {}, "source": [ "### Plot Feature Importance Data" ] }, { "cell_type": "code", "execution_count": 24, "id": "5a9d8262-574e-4073-a282-567d4fd1209c", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/png": "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5q1fv14AELt37861PgAxceLEXPM9PT1FWFiY5nNsbKwAIBo3biyeP3+umf/w4UPh6OgoBg4cqLV9cnKycHBwyDU/v+Oxfv16zbycv+ugQYM0854/fy4qVKggFAqFmDFjhmb+/fv3hbW1tVZdc8osX768yMjI0Mz/8ccfBQAxf/58IYQQWVlZomzZsqJWrVri33//1ay3ZcsWAUBMmDBBMy8sLEwAEGPGjMm1D+3btxeenp655j9//lxkZmZqzbt//75wdXUV/fr108zLaTvOzs7i3r17mvm//PKLACA2b96smde0aVNhZ2cnbty4oVXuy22lf//+wt3dXdy5c0drnR49eggHB4c82w2R3PGnWCIJZWRkAPivp+NlzZs3R5kyZTTTwoUL8y3nt99+AwBERERozf/0008BAFu3btWaX65cOXTu3Fnz2d7eHqGhoTh+/DiSk5MBAJaWlpr7+rKzs3H37l3Y2tqiatWqOHbsmK67qjFhwgTs3LlTa3Jzc0NiYiIuXbqEXr164e7du7hz5w7u3LmDx48fo1WrVti3bx/UajUAaHqdAODZs2e4e/cufHx84OjoqFfdCjJw4ECoVCrN5507d+LBgwfo2bOnpq537tyBSqVCgwYNcv3sqIsBAwZo/l+lUiEgIABCCPTv318z39HREVWrVsXVq1dzbR8aGgo7OzvN565du8Ld3V3TTo4ePYrU1FQMHToUVlZWmvXat2+PatWq5WovADBkyJBC11+lUsHCwgIAoFarce/ePTx//hwBAQF5/n26d+8OJycnzecmTZoAgGbf0tLSsG/fPvTr1w8VK1bU2jZn2B8hBH766Sd07NgRQgitv0lISAjS09ON1jaIijP+FEskoZx/fB89epRr2XfffYeHDx8iJSUFvXv3LrCcGzduQKlUwsfHR2u+m5sbHB0dcePGDa35Pj4+ucbB8/X1BfDivic3Nzeo1WrMnz8f3377La5du4bs7GzNus7OzoXfyVe89dZbCA4OzjX/0qVLAICwsLB8t01PT4eTkxP+/fdfREZGIjY2Fn///TeEEFrrGIO3t3ee9W3ZsmWe69vb2xc51qvJi4ODA6ysrODi4pJr/t27d3NtX6VKFa3PCoUCPj4+mnsQc9pD1apVc21brVo17N+/X2uemZmZ1n2FhbFixQrMmTMH58+fx7NnzzTzXz2OQO79zUny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depUlLBEREREVACdE7t169YhIiICEydOxLFjx1CnTh2EhIQgNTW1wO2uX7+OkSNHokmTJkWuLBERERHlT+fEbu7cuRg4cCDCw8NRo0YNREdHw8bGBjExMfluk52djQ8++ACTJ09GpUqV9KowEREREeVNp8QuKysLCQkJCA4O/q8ApRLBwcGIj4/Pd7spU6agbNmy6N+/f6HiZGZmIiMjQ2siIiIiooLplNjduXMH2dnZcHV11Zrv6uqK5OTkPLfZv38/li1bhiVLlhQ6TmRkJBwcHDSTh4eHLtUkIiIieiMZ9anYhw8fok+fPliyZAlcXFwKvd3YsWORnp6umW7evGnEWhIRERHJg5kuK7u4uEClUiElJUVrfkpKCtzc3HKtf+XKFVy/fh0dO3bUzFOr1S8Cm5nhwoULqFy5cq7tLC0tYWlpqUvViIiIiN54OvXYWVhYwN/fH3FxcZp5arUacXFxCAoKyrV+tWrVcOrUKSQmJmqmd955By1atEBiYiJ/YiUiIiIyIJ167AAgIiICYWFhCAgIQGBgIKKiovD48WOEh4cDAEJDQ1G+fHlERkbCysoKtWrV0tre0dERAHLNJyIiIiL96JzYde/eHWlpaZgwYQKSk5Ph5+eH7du3ax6oSEpKglLJF1oQERERSU0hhBCmrsTrZGRkwMHBAenp6bC3t9daJg776lyeIvCioapGREREZFQF5UGvYtcaERERkUwwsSMiIiKSCSZ2RERERDLBxI6IiIhIJpjYEREREckEEzsiIiIimWBiR0RERCQTTOyIiIiIZIKJHREREZFMMLEjIiIikgkmdkREREQywcSOiIiISCaY2BERERHJBBM7IiIiIplgYkdEREQkE0zsiIiIiGSCiR0RERGRTDCxIyIiIpIJJnZEREREMsHEjoiIiEgmmNgRERERyQQTOyIiIiKZYGJHREREJBNM7IiIiIhkgokdERERkUwwsSMiIiKSCSZ2RERERDLBxI6IiIhIJpjYEREREckEEzsiIiIimWBiR0RERCQTTOyIiIiIZIKJHREREZFMMLEjIiIikgkmdkREREQywcSOiIiISCaY2BERERHJBBM7IiIiIplgYkdEREQkE0zsiIiIiGSiSIndwoUL4eXlBSsrKzRo0ACHDx/Od92NGzciICAAjo6OKFWqFPz8/LBq1aoiV5iIiIiI8qZzYrdu3TpERERg4sSJOHbsGOrUqYOQkBCkpqbmuX7p0qXx+eefIz4+HidPnkR4eDjCw8OxY8cOvStPRERERP9RCCGELhs0aNAA9evXx4IFCwAAarUaHh4eGD58OMaMGVOoMurVq4f27dtj6tSphVo/IyMDDg4OSE9Ph729vdYycdhXl+oDABSBF3XehoiIiMgUCsqDXqVTj11WVhYSEhIQHBz8XwFKJYKDgxEfH//a7YUQiIuLw4ULF9C0adN818vMzERGRobWREREREQF0ymxu3PnDrKzs+Hq6qo139XVFcnJyflul56eDltbW1hYWKB9+/b45ptv0Lp163zXj4yMhIODg2by8PDQpZpEREREbyRJnoq1s7NDYmIijhw5gmnTpiEiIgJ79uzJd/2xY8ciPT1dM928eVOKahIRERGVaGa6rOzi4gKVSoWUlBSt+SkpKXBzc8t3O6VSCR8fHwCAn58fzp07h8jISDRv3jzP9S0tLWFpaalL1YiIiIjeeDr12FlYWMDf3x9xcXGaeWq1GnFxcQgKCip0OWq1GpmZmbqEJiIiIqLX0KnHDgAiIiIQFhaGgIAABAYGIioqCo8fP0Z4eDgAIDQ0FOXLl0dkZCSAF/fLBQQEoHLlysjMzMRvv/2GVatWYdGiRYbdEyIiIqI3nM6JXffu3ZGWloYJEyYgOTkZfn5+2L59u+aBiqSkJCiV/3UEPn78GEOHDsWtW7dgbW2NatWq4fvvv0f37t0NtxdEREREpPs4dqbAceyIiIjoTWW0ceyIiIiIqPhiYkdEREQkE0zsiIiIiGSCiR0RERGRTDCxIyIiIpIJJnZEREREMsHEjoiIiEgmmNgRERERyQQTOyIiIiKZYGJHREREJBNM7IiIiIhkgokdERERkUwwsSMiIiKSCSZ2RERERDLBxI6IiIhIJpjYEREREckEEzsiIiIimWBiR0RERCQTTOyIiIiIZIKJHREREZFMMLEjIiIikgkmdkREREQywcSOiIiISCaY2BERERHJBBM7IiIiIplgYkdEREQkE0zsiIiIiGSCiR0RERGRTDCxIyIiIpIJJnZEREREMsHEjoiIiEgmmNgRERERyYSZqStQkojDvjpvowi8aISaEBEREeXGHjsiIiIimWBiR0RERCQTTOyIiIiIZIKJHREREZFMMLEjIiIikgkmdkREREQywcSOiIiISCaKlNgtXLgQXl5esLKyQoMGDXD48OF8112yZAmaNGkCJycnODk5ITg4uMD1iYiIiKhodE7s1q1bh4iICEycOBHHjh1DnTp1EBISgtTU1DzX37NnD3r27Indu3cjPj4eHh4e+L//+z/8/fffeleeiIiIiP6jEEIIXTZo0KAB6tevjwULFgAA1Go1PDw8MHz4cIwZM+a122dnZ8PJyQkLFixAaGhooWJmZGTAwcEB6enpsLe311om5dsg+OYJIiIiklpBedCrdOqxy8rKQkJCAoKDg/8rQKlEcHAw4uPjC1XGkydP8OzZM5QuXTrfdTIzM5GRkaE1EREREVHBdErs7ty5g+zsbLi6umrNd3V1RXJycqHKGD16NMqVK6eVHL4qMjISDg4OmsnDw0OXahIRERG9kSR9KnbGjBlYu3Ytfv75Z1hZWeW73tixY5Genq6Zbt68KWEtiYiIiEomM11WdnFxgUqlQkpKitb8lJQUuLm5Fbjt7NmzMWPGDOzatQu1a9cucF1LS0tYWlrqUjUiIiKiN55OPXYWFhbw9/dHXFycZp5arUZcXByCgoLy3e6rr77C1KlTsX37dgQEBBS9tkRERESUL5167AAgIiICYWFhCAgIQGBgIKKiovD48WOEh4cDAEJDQ1G+fHlERkYCAGbOnIkJEyZg9erV8PLy0tyLZ2trC1tbWwPuChEREdGbTefErnv37khLS8OECROQnJwMPz8/bN++XfNARVJSEpTK/zoCFy1ahKysLHTt2lWrnIkTJ2LSpEn61Z6IiIiINHQex84UOI4dERERvamMNo4dERERERVfTOyIiIiIZIKJHREREZFMMLEjIiIikgkmdkREREQywcSOiIiISCaY2BERERHJBBM7IiIiIplgYkdEREQkE0zsiIiIiGSCiR0RERGRTDCxIyIiIpIJJnZEREREMsHEjoiIiEgmzExdAcpNHPbVeRtF4EUj1ISIiIhKEvbYEREREckEEzsiIiIimWBiR0RERCQTTOyIiIiIZIIPT7zB+JAGERGRvLDHjoiIiEgmmNgRERERyQQTOyIiIiKZYGJHREREJBNM7IiIiIhkgokdERERkUwwsSMiIiKSCSZ2RERERDLBxI6IiIhIJpjYEREREckEEzsiIiIimeC7YsnoivJOWoDvpSUiItIVe+yIiIiIZIKJHREREZFMMLEjIiIikgkmdkREREQywcSOiIiISCaY2BERERHJBBM7IiIiIplgYkdEREQkE0VK7BYuXAgvLy9YWVmhQYMGOHz4cL7rnjlzBl26dIGXlxcUCgWioqKKWlciIiIiKoDOid26desQERGBiRMn4tixY6hTpw5CQkKQmpqa5/pPnjxBpUqVMGPGDLi5ueldYSIiIiLKm86J3dy5czFw4ECEh4ejRo0aiI6Oho2NDWJiYvJcv379+pg1axZ69OgBS0tLvStMRERERHnTKbHLyspCQkICgoOD/ytAqURwcDDi4+MNVqnMzExkZGRoTURERERUMDNdVr5z5w6ys7Ph6uqqNd/V1RXnz583WKUiIyMxefJkg5VHbw5x2FfnbRSBF41QEyIiIukVy6dix44di/T0dM108+ZNU1eJiIiIqNjTqcfOxcUFKpUKKSkpWvNTUlIM+mCEpaUl78cjIiIi0pFOPXYWFhbw9/dHXFycZp5arUZcXByCgoIMXjkiIiIiKjydeuwAICIiAmFhYQgICEBgYCCioqLw+PFjhIeHAwBCQ0NRvnx5REZGAnjxwMXZs2c1///3338jMTERtra28PHxMeCuEBEREb3ZdE7sunfvjrS0NEyYMAHJycnw8/PD9u3bNQ9UJCUlQan8ryPwn3/+Qd26dTWfZ8+ejdmzZ6NZs2bYs2eP/ntARERERACKkNgBwLBhwzBs2LA8l72arHl5eUEIUZQwRERERKSDYvlULBERERHpjokdERERkUwwsSMiIiKSCSZ2RERERDLBxI6IiIhIJpjYEREREckEEzsiIiIimWBiR0RERCQTTOyIiIiIZIKJHREREZFMMLEjIiIikgkmdkREREQywcSOiIiISCaY2BERERHJBBM7IiIiIpkwM3UFiEoicdhX520UgReNUBMiIqL/sMeOiIiISCaY2BERERHJBBM7IiIiIpngPXZExRjv5SMiIl2wx46IiIhIJthjR0QA2DtIRCQH7LEjIiIikgkmdkREREQywZ9iiUhS/MmXiMh4mNgRkSwxgSSiNxF/iiUiIiKSCSZ2RERERDLBxI6IiIhIJniPHRGRHopyLx/A+/mIyDiY2BERlRB8IISIXoc/xRIRERHJBBM7IiIiIplgYkdEREQkE0zsiIiIiGSCD08QEZEWPqRBVHKxx46IiIhIJpjYEREREckEf4olIiKT4E++RIbHxI6I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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "result.plot()" ] }, { "cell_type": "markdown", "id": "a493b092-6236-419f-906c-16d52c47674f", "metadata": {}, "source": [ "### Save Explainer Log and Data" ] }, { "cell_type": "code", "execution_count": 25, "id": "7c638a2c-6b01-4228-aa0f-93fd8dd7feab", "metadata": {}, "outputs": [], "source": [ "# save the explainer log\n", "log_file_path = \"./feature-importance-demo.log\"\n", "result.log(path=log_file_path)" ] }, { "cell_type": "code", "execution_count": 26, "id": "f5d91240-09ff-4893-b652-b0259a8f222a", "metadata": {}, "outputs": [], "source": [ "!cat $log_file_path" ] }, { "cell_type": "code", "execution_count": 27, "id": "da4e2b28-96d7-440e-bfea-41cb694a52d4", "metadata": {}, "outputs": [], "source": [ "# save the explainer data\n", "result.zip(file_path=\"./feature-importance-demo-archive.zip\")" ] }, { "cell_type": "code", "execution_count": 28, "id": "c0540819-f896-481a-b470-b9d53a243b0a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Archive: feature-importance-demo-archive.zip\n", " Length Date Time Name\n", "--------- ---------- ----- ----\n", " 3553 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/result_descriptor.json\n", " 2 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/problems/problems_and_actions.json\n", " 110 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_html_fragment/text_html.meta\n", " 4566 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_html_fragment/text_html/explanation.html\n", " 25126 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_html_fragment/text_html/fi-class-0.png\n", " 0 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/log/explainer_run_d911afc4-5dac-49f7-9c36-bf892bcd05da.log\n", " 1762120 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/work/shapley.orig.feat.bin\n", " 1903889 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/work/shapley_formatted_orig_feat.zip\n", " 4674153 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/work/shapley.orig.feat.csv\n", " 40216 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/work/y_hat.bin\n", " 2 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/insights/insights_and_actions.json\n", " 185 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_feature_importance/application_vnd_h2oai_json_datatable_jay.meta\n", " 143 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_feature_importance/application_json.meta\n", " 163 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_feature_importance/application_vnd_h2oai_json_csv.meta\n", " 1277 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_feature_importance/application_vnd_h2oai_json_datatable_jay/explanation.json\n", " 880 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_feature_importance/application_vnd_h2oai_json_datatable_jay/feature_importance_class_0.jay\n", " 594 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_feature_importance/application_json/explanation.json\n", " 1593 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_feature_importance/application_json/feature_importance_class_0.json\n", " 593 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_feature_importance/application_vnd_h2oai_json_csv/explanation.json\n", " 725 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/global_feature_importance/application_vnd_h2oai_json_csv/feature_importance_class_0.csv\n", " 201 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/local_feature_importance/application_vnd_h2oai_json_datatable_jay.meta\n", " 863 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/local_feature_importance/application_vnd_h2oai_json_datatable_jay/explanation.json\n", " 40216 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/local_feature_importance/application_vnd_h2oai_json_datatable_jay/y_hat.bin\n", " 1762120 2026-01-29 15:51 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_d911afc4-5dac-49f7-9c36-bf892bcd05da/local_feature_importance/application_vnd_h2oai_json_datatable_jay/feature_importance_class_0.jay\n", "--------- -------\n", " 10223290 24 files\n" ] } ], "source": [ "!unzip -l feature-importance-demo-archive.zip" ] }, { "cell_type": "code", "execution_count": null, "id": "72ae2b2f-5817-4ccc-a7d0-3cbc70d3eaa5", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "H2O Sonar", "language": "python", "name": "h2o-sonar" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.11" } }, "nbformat": 4, "nbformat_minor": 5 }