Morris Sensitivity Analysis Explainer Demo

[13]:
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
[14]:
# explainer description
interpret.describe_explainer(explainer.MorrisSensitivityAnalysisExplainer)
[14]:
{'id': 'h2o_sonar.explainers.morris_sa_explainer.MorrisSensitivityAnalysisExplainer',
 'name': 'MorrisSensitivityAnalysisExplainer',
 'display_name': 'Morris Sensitivity Analysis',
 'tagline': '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',
 'brief_description': 'MorrisSensitivityAnalysisExplainer.',
 'model_types': ['iid'],
 'can_explain': ['regression', 'binomial'],
 'explanation_scopes': ['global_scope'],
 'explanations': [{'explanation_type': 'global-feature-importance',
   'name': 'GlobalFeatImpExplanation',
   'category': '',
   'scope': 'global',
   'has_local': '',
   'formats': []}],
 'keywords': ['explains-original-feature-importance', 'h2o-sonar'],
 'parameters': [{'name': 'leakage_warning_threshold',
   'description': 'The threshold above which to report a potentially detectedfeature importance leak problem.',
   'comment': '',
   'type': 'float',
   'val': 0.95,
   'predefined': [],
   'tags': [],
   'min_': 0.0,
   'max_': 0.0,
   'category': ''}],
 'metrics_meta': []}

Interpretation

[15]:
# dataset
dataset_path = "../../data/predictive/pd_ice_creditcard_train.csv"
target_col = "LIMIT_BAL"

# model
mojo_path = "../../data/predictive/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)
[16]:
# check explainer compatibility before running interpretation
morris_explainer = explainer.MorrisSensitivityAnalysisExplainer()
morris_explainer.logger = logging.getLogger("morris_compatibility_check")

params = commons.CommonInterpretationParams(
    model=model,
    models=[],
    dataset=dataset_path,
    target_col=target_col,
)

is_compatible = morris_explainer.check_compatibility(params=params, model=model)

if not is_compatible:
    error_msg = "Morris Sensitivity Analysis explainer is NOT compatible with this model/dataset.\n\n"
    error_msg += "Possible reasons:\n"
    error_msg += "1. Missing dependencies: interpret==0.1.20 or gevent==1.5.0\n"
    error_msg += "   Install with: pip install interpret==0.1.20 gevent==1.5.0\n"
    error_msg += "2. Model type not supported (H2O-3 models are not compatible)\n"
    error_msg += "3. Model must be regression or binary classification\n\n"
    error_msg += "Cannot continue with interpretation. Please resolve compatibility issues first."
    raise RuntimeError(error_msg)
else:
    print("✓ Morris Sensitivity Analysis explainer is compatible with this model/dataset")
✓ Morris Sensitivity Analysis explainer is compatible with this model/dataset
[17]:
%%capture
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,
)

Explainer Result

[18]:
# retrieve the result
result = interpretation.get_explainer_result(
    explainer.MorrisSensitivityAnalysisExplainer.explainer_id()
)

Display Data

[19]:
result.data()
[19]:
featureimportance
▪▪▪▪▪▪▪▪▪▪▪▪
0PAY_AMT2576582
1BILL_AMT1483290
2PAY_AMT6315424
3PAY_AMT1262665
4PAY_AMT3250634
5PAY_AMT5229284
6BILL_AMT3227349
7PAY_AMT4226623
8BILL_AMT4216030
9BILL_AMT5144456
10BILL_AMT6140663
11AGE85044.2
12PAY_370326.1
13PAY_550648.5
14PAY_236126.8
15EDUCATION28226.3
16PAY_116431.9
17MARRIAGE15073.3
18PAY_414440.6
19PAY_613579.2
20SEX5472.43
21BILL_AMT24649.54

Plot Sensitivity Analysis Data

[20]:
result.plot()
../_images/notebooks_h2o-sonar-morris-sa-explainer_12_0.png

Save Explainer Log and Data

[21]:
# save the explainer log
log_file_path = "./morris-sa-demo.log"
result.log(path=log_file_path)
[22]:
!cat $log_file_path
[23]:
# save the explainer data
result.zip(file_path="./morris-sa-demo-archive.zip")
[24]:
!unzip -l morris-sa-demo-archive.zip
Archive:  morris-sa-demo-archive.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     2217  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/result_descriptor.json
        2  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/problems/problems_and_actions.json
      110  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/global_html_fragment/text_html.meta
      373  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/global_html_fragment/text_html/explanation.html
    27808  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/global_html_fragment/text_html/fi-class-0.png
        0  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/log/explainer_run_ae200700-113e-45dd-9c07-325067173db7.log
        2  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/insights/insights_and_actions.json
      185  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/global_feature_importance/application_vnd_h2oai_json_datatable_jay.meta
      143  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/global_feature_importance/application_json.meta
      669  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/global_feature_importance/application_vnd_h2oai_json_datatable_jay/explanation.json
      872  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/global_feature_importance/application_vnd_h2oai_json_datatable_jay/feature_importance_class_0.jay
      619  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/global_feature_importance/application_json/explanation.json
     1504  2026-01-29 16:21   explainer_h2o_sonar_explainers_morris_sa_explainer_MorrisSensitivityAnalysisExplainer_ae200700-113e-45dd-9c07-325067173db7/global_feature_importance/application_json/feature_importance_class_0.json
---------                     -------
    34504                     13 files
[ ]: