Morris Sensitivity Analysis Explainer Demo
[2]:
import os
import logging
import datatable
import daimojo
from h2o_sonar import interpret
from h2o_sonar.lib.api import commons
from h2o_sonar.lib.api import explainers
from h2o_sonar.explainers import morris_sa_explainer as explainer
from h2o_sonar.lib.api.models import ModelApi
[3]:
# explainer description
interpret.describe_explainer(explainer.MorrisSensitivityAnalysisExplainer)
[3]:
{'id': 'h2o_sonar.explainers.morris_sa_explainer.MorrisSensitivityAnalysisExplainer',
'name': 'MorrisSensitivityAnalysisExplainer',
'description': 'Morris sensitivity analysis (SA) explainer provides Morris sensitivity analysis based feature importance which is a measure of the contribution of an input variable to the overall predictions of the model. In applied statistics, the Morris method for global sensitivity analysis is a so-called one-step-at-a-time method (OAT), meaning that in each run only one input parameter is given a new value. This explainer is based based on InterpretML library - see http://interpret.ml',
'model_types': ['iid'],
'can_explain': ['regression', 'binomial'],
'explanation_scopes': ['global_scope'],
'explanations': [{'explanation_type': 'global-feature-importance',
'name': 'GlobalFeatImpExplanation',
'category': None,
'scope': 'global',
'has_local': None,
'formats': []}],
'parameters': [],
'keywords': []}
Interpretation
[4]:
# dataset
dataset_path = "../../data/pd_ice_creditcard_train.csv"
target_col = "LIMIT_BAL"
# model
mojo_path = "../../data/models/creditcard-regression.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)
[5]:
interpretation = interpret.run_interpretation(
dataset=dataset_path,
model=model,
target_col=target_col,
results_location=results_location,
explainers=[explainer.MorrisSensitivityAnalysisExplainer.explainer_id()],
log_level=logging.INFO,
)
/home/dvorka/h/mli/git/h2o-sonar/.venv/lib/python3.8/site-packages/tqdm/auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
from .autonotebook import tqdm as notebook_tqdm
"is" with a literal. Did you mean "=="?
"is" with a literal. Did you mean "=="?
"is" with a literal. Did you mean "=="?
"is" with a literal. Did you mean "=="?
"is not" with a literal. Did you mean "!="?
"is not" with a literal. Did you mean "!="?
ExplainableDataset cleaner: label encoded ['SEX', 'EDUCATION', 'MARRIAGE'] columns

Explainer Result
[6]:
# retrieve the result
result = interpretation.get_explainer_result(
explainer.MorrisSensitivityAnalysisExplainer.explainer_id()
)
Display Data
[7]:
result.data()
[7]:
feature | importance | |
---|---|---|
▪▪▪▪ | ▪▪▪▪▪▪▪▪ | |
0 | PAY_AMT2 | 576582 |
1 | BILL_AMT1 | 483290 |
2 | PAY_AMT6 | 315424 |
3 | PAY_AMT1 | 262665 |
4 | PAY_AMT3 | 250634 |
5 | PAY_AMT5 | 229284 |
6 | BILL_AMT3 | 227349 |
7 | PAY_AMT4 | 226623 |
8 | BILL_AMT4 | 216030 |
9 | BILL_AMT5 | 144456 |
10 | BILL_AMT6 | 140663 |
11 | AGE | 85984.4 |
12 | PAY_3 | 70828 |
13 | PAY_5 | 50576.5 |
14 | PAY_2 | 36732.7 |
15 | EDUCATION | 28038.8 |
16 | PAY_1 | 16456.3 |
17 | MARRIAGE | 15054.1 |
18 | PAY_4 | 14673.7 |
19 | PAY_6 | 13648.6 |
20 | SEX | 5494.11 |
21 | BILL_AMT2 | 4649.55 |
Plot Sensitivity Analysis Data
[8]:
result.plot()

Save Explainer Log and Data
[9]:
# save the explainer log
log_file_path = "./morris-sa-demo.log"
result.log(path=log_file_path)
[10]:
!cat $log_file_path
[12]:
# save the explainer data
result.zip(file_path="./morris-sa-demo-archive.zip")
[13]:
!unzip -l morris-sa-demo-archive.zip
Archive: morris-sa-demo-archive.zip
Length Date Time Name
--------- ---------- ----- ----
1544 2022-09-19 15:58 explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_508d6cc9-79af-4d42-be00-8db7cf404599/result_descriptor.json
110 2022-09-19 15:58 explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_508d6cc9-79af-4d42-be00-8db7cf404599/global_html_fragment/text_html.meta
367 2022-09-19 15:58 explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_508d6cc9-79af-4d42-be00-8db7cf404599/global_html_fragment/text_html/explanation.html
27825 2022-09-19 15:58 explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_508d6cc9-79af-4d42-be00-8db7cf404599/global_html_fragment/text_html/fi-class-0.png
0 2022-09-19 15:58 explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_508d6cc9-79af-4d42-be00-8db7cf404599/log/explainer_run_508d6cc9-79af-4d42-be00-8db7cf404599.log
185 2022-09-19 15:58 explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_508d6cc9-79af-4d42-be00-8db7cf404599/global_feature_importance/application_vnd_h2oai_json_datatable_jay.meta
143 2022-09-19 15:58 explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_508d6cc9-79af-4d42-be00-8db7cf404599/global_feature_importance/application_json.meta
669 2022-09-19 15:58 explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_508d6cc9-79af-4d42-be00-8db7cf404599/global_feature_importance/application_vnd_h2oai_json_datatable_jay/explanation.json
872 2022-09-19 15:58 explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_508d6cc9-79af-4d42-be00-8db7cf404599/global_feature_importance/application_vnd_h2oai_json_datatable_jay/feature_importance_class_0.jay
619 2022-09-19 15:58 explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_508d6cc9-79af-4d42-be00-8db7cf404599/global_feature_importance/application_json/explanation.json
1476 2022-09-19 15:58 explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_508d6cc9-79af-4d42-be00-8db7cf404599/global_feature_importance/application_json/feature_importance_class_0.json
--------- -------
33810 11 files
[ ]: