Original Feature Importance Explainer for MOJO Models (Naive Shapley method) Demo
This example demonstrates how to interpret a Driverless AI MOJO model using the H2O Sonar library and retrieve the data and plot with original features importances.
[1]:
import os
import logging
import datatable
import daimojo
import webbrowser
from h2o_sonar import interpret
from h2o_sonar.lib.api import commons
from h2o_sonar.lib.api import explainers
from h2o_sonar.explainers import fi_naive_shapley_explainer as explainer
from h2o_sonar.lib.api.models import ModelApi
[2]:
# explainer description
interpret.describe_explainer(explainer.NaiveShapleyMojoFeatureImportanceExplainer)
[2]:
{'id': 'h2o_sonar.explainers.fi_naive_shapley_explainer.NaiveShapleyMojoFeatureImportanceExplainer',
'name': 'NaiveShapleyMojoFeatureImportanceExplainer',
'display_name': 'Shapley Values for Original Features of MOJO Models (Naive Method)',
'tagline': 'NaiveShapleyMojoFeatureImportanceExplainer.',
'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.',
'brief_description': 'NaiveShapleyMojoFeatureImportanceExplainer.',
'model_types': ['iid'],
'can_explain': ['regression', 'binomial', 'multinomial'],
'explanation_scopes': ['global_scope', 'local_scope'],
'explanations': [{'explanation_type': 'global-feature-importance',
'name': 'GlobalFeatImpExplanation',
'category': '',
'scope': 'global',
'has_local': '',
'formats': []},
{'explanation_type': 'local-feature-importance',
'name': 'LocalFeatImpExplanation',
'category': '',
'scope': 'local',
'has_local': '',
'formats': []}],
'keywords': ['run-by-default',
'explains-original-feature-importance',
'is_fast',
'h2o-sonar'],
'parameters': [{'name': 'sample_size',
'description': 'Sample size.',
'comment': '',
'type': 'int',
'val': 100000,
'predefined': [],
'tags': [],
'min_': 0.0,
'max_': 0.0,
'category': ''},
{'name': 'fast_approx_contribs',
'description': 'Speed up predictions with fast contributions predictions approximation.',
'comment': '',
'type': 'bool',
'val': True,
'predefined': [],
'tags': [],
'min_': 0.0,
'max_': 0.0,
'category': ''},
{'name': 'leakage_warning_threshold',
'description': 'The threshold above which to report a potentially detected feature importance leak problem.',
'comment': '',
'type': 'float',
'val': 0.95,
'predefined': [],
'tags': [],
'min_': 0.0,
'max_': 0.0,
'category': ''}],
'metrics_meta': []}
Interpretation
[3]:
# dataset
dataset_path = "../../data/predictive/creditcard.csv"
target_col = "default payment next month"
# model
mojo_path = "../../data/predictive/models/creditcard-binomial.mojo"
mojo_model = daimojo.model(mojo_path)
model = ModelApi().create_model(
model_src=mojo_model,
target_col=target_col,
used_features=list(mojo_model.feature_names),
)
# results
results_location = "./results"
os.makedirs(results_location, exist_ok=True)
[4]:
%%capture
interpretation = interpret.run_interpretation(
dataset=dataset_path,
model=model,
target_col=target_col,
results_location=results_location,
explainers=[explainer.NaiveShapleyMojoFeatureImportanceExplainer.explainer_id()],
log_level=logging.INFO,
)
/home/user/h/mli/git/h2o-sonar-FLOSS/.venv/lib/python3.11/site-packages/ragas/metrics/__init__.py:1: LangChainDeprecationWarning: As of langchain-core 0.3.0, LangChain uses pydantic v2 internally. The langchain_core.pydantic_v1 module was a compatibility shim for pydantic v1, and should no longer be used. Please update the code to import from Pydantic directly.
For example, replace imports like: `from langchain_core.pydantic_v1 import BaseModel`
with: `from pydantic import BaseModel`
or the v1 compatibility namespace if you are working in a code base that has not been fully upgraded to pydantic 2 yet. from pydantic.v1 import BaseModel
from ragas.metrics._answer_correctness import AnswerCorrectness, answer_correctness
/home/user/h/mli/git/h2o-sonar-FLOSS/.venv/lib/python3.11/site-packages/ragas/metrics/__init__.py:4: LangChainDeprecationWarning: As of langchain-core 0.3.0, LangChain uses pydantic v2 internally. The langchain.pydantic_v1 module was a compatibility shim for pydantic v1, and should no longer be used. Please update the code to import from Pydantic directly.
For example, replace imports like: `from langchain.pydantic_v1 import BaseModel`
with: `from pydantic import BaseModel`
or the v1 compatibility namespace if you are working in a code base that has not been fully upgraded to pydantic 2 yet. from pydantic.v1 import BaseModel
from ragas.metrics._context_entities_recall import (
Explainer Result
[5]:
# retrieve the result
result = interpretation.get_explainer_result(
explainer.NaiveShapleyMojoFeatureImportanceExplainer.explainer_id()
)
[6]:
# open interpretation HTML report in web browser
webbrowser.open(interpretation.result.get_html_report_location())
[6]:
True
[7]:
# summary
result.summary()
[7]:
{'id': 'h2o_sonar.explainers.fi_naive_shapley_explainer.NaiveShapleyMojoFeatureImportanceExplainer',
'name': 'NaiveShapleyMojoFeatureImportanceExplainer',
'display_name': 'Shapley Values for Original Features of MOJO Models (Naive Method)',
'tagline': 'NaiveShapleyMojoFeatureImportanceExplainer.',
'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.',
'brief_description': 'NaiveShapleyMojoFeatureImportanceExplainer.',
'model_types': ['iid'],
'can_explain': ['regression', 'binomial', 'multinomial'],
'explanation_scopes': ['global_scope', 'local_scope'],
'explanations': [{'explanation_type': 'global-feature-importance',
'name': 'Shapley Values for Original Features of MOJO Models (Naive Method)',
'category': 'DAI MODEL',
'scope': 'global',
'has_local': 'local-feature-importance',
'formats': ['application/vnd.h2oai.json+datatable.jay',
'application/vnd.h2oai.json+csv',
'application/json']},
{'explanation_type': 'local-feature-importance',
'name': 'Shapley Values for Original Features of MOJO Models (Naive Method)',
'category': 'DAI MODEL',
'scope': 'local',
'has_local': None,
'formats': ['application/vnd.h2oai.json+datatable.jay']},
{'explanation_type': 'global-html-fragment',
'name': 'Shapley Values for Original Features of MOJO Models (Naive Method)',
'category': 'DAI MODEL',
'scope': 'global',
'has_local': None,
'formats': ['text/html']}],
'keywords': ['run-by-default',
'explains-original-feature-importance',
'is_fast',
'h2o-sonar'],
'parameters': [{'name': 'sample_size',
'description': 'Sample size.',
'comment': '',
'type': 'int',
'val': 100000,
'predefined': [],
'tags': [],
'min_': 0.0,
'max_': 0.0,
'category': ''},
{'name': 'fast_approx_contribs',
'description': 'Speed up predictions with fast contributions predictions approximation.',
'comment': '',
'type': 'bool',
'val': True,
'predefined': [],
'tags': [],
'min_': 0.0,
'max_': 0.0,
'category': ''},
{'name': 'leakage_warning_threshold',
'description': 'The threshold above which to report a potentially detected feature importance leak problem.',
'comment': '',
'type': 'float',
'val': 0.95,
'predefined': [],
'tags': [],
'min_': 0.0,
'max_': 0.0,
'category': ''}],
'metrics_meta': []}
[8]:
# parameters
result.params()
[8]:
{'sample_size': 100000,
'fast_approx_contribs': True,
'leakage_warning_threshold': 0.95}
Display Data
[9]:
result.data()
[9]:
| feature | importance | |
|---|---|---|
| ▪▪▪▪ | ▪▪▪▪▪▪▪▪ | |
| 0 | PAY_0 | 0.592187 |
| 1 | PAY_2 | 0.224423 |
| 2 | LIMIT_BAL | 0.159352 |
| 3 | PAY_AMT4 | 0.14868 |
| 4 | PAY_AMT2 | 0.125437 |
| 5 | BILL_AMT1 | 0.101179 |
| 6 | PAY_3 | 0.0576715 |
| 7 | PAY_AMT3 | 0.0495318 |
| 8 | PAY_6 | 0.0453093 |
| 9 | PAY_4 | 0.0391064 |
| 10 | BILL_AMT2 | 0.0371473 |
| 11 | BILL_AMT6 | 0.0298867 |
| 12 | PAY_5 | 0.0270603 |
| 13 | PAY_AMT1 | 0.01873 |
| 14 | EDUCATION | 0.0131732 |
| 15 | AGE | 0.0110948 |
| 16 | MARRIAGE | 0.00884818 |
| 17 | PAY_AMT6 | 0.00759522 |
| 18 | PAY_AMT5 | 0.00719935 |
| 19 | BILL_AMT5 | 0.00589392 |
| 20 | BILL_AMT4 | 0.00189465 |
| 21 | BILL_AMT3 | 0.00108067 |
Plot Feature Importance Data
[10]:
result.plot()
Save Explainer Log and Data
[11]:
# save the explainer log
log_file_path = "./feature-importance-demo.log"
result.log(path=log_file_path)
[12]:
!cat $log_file_path
[13]:
# save the explainer data
result.zip(file_path="./feature-importance-demo-archive.zip")
[14]:
!unzip -l feature-importance-demo-archive.zip
Archive: feature-importance-demo-archive.zip
Length Date Time Name
--------- ---------- ----- ----
3553 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/result_descriptor.json
2 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/problems/problems_and_actions.json
110 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_html_fragment/text_html.meta
4561 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_html_fragment/text_html/explanation.html
25126 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_html_fragment/text_html/fi-class-0.png
0 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/log/explainer_run_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc.log
1762120 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/work/shapley.orig.feat.bin
1903889 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/work/shapley_formatted_orig_feat.zip
4674153 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/work/shapley.orig.feat.csv
40216 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/work/y_hat.bin
2 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/insights/insights_and_actions.json
185 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_feature_importance/application_vnd_h2oai_json_datatable_jay.meta
143 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_feature_importance/application_json.meta
163 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_feature_importance/application_vnd_h2oai_json_csv.meta
1277 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_feature_importance/application_vnd_h2oai_json_datatable_jay/explanation.json
880 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_feature_importance/application_vnd_h2oai_json_datatable_jay/feature_importance_class_0.jay
594 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_feature_importance/application_json/explanation.json
1588 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_feature_importance/application_json/feature_importance_class_0.json
593 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_feature_importance/application_vnd_h2oai_json_csv/explanation.json
720 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/global_feature_importance/application_vnd_h2oai_json_csv/feature_importance_class_0.csv
201 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/local_feature_importance/application_vnd_h2oai_json_datatable_jay.meta
863 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/local_feature_importance/application_vnd_h2oai_json_datatable_jay/explanation.json
40216 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/local_feature_importance/application_vnd_h2oai_json_datatable_jay/y_hat.bin
1762120 2026-01-29 15:52 explainer_h2o_sonar_explainers_fi_naive_shapley_explainer_NaiveShapleyMojoFeatureImportanceExplainer_a2ab0c8f-1dd5-4679-98f1-62d88f782ebc/local_feature_importance/application_vnd_h2oai_json_datatable_jay/feature_importance_class_0.jay
--------- -------
10223275 24 files
[ ]: