AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
SHAP (SHapley Additive exPlanations) is a framework for interpreting machine-learning model outputs by decomposing predictions into feature-level contributions. This skill provides a structured approach to selecting explainers, defining background distributions, and validating attributions to ensure model behavior is described accurately. It emphasizes the use of the modern shap.Explanation API, explicit output selection, and rigorous additivity checks to prevent misinterpretation of model behavior.
What it does
- Selects appropriate SHAP explainers and maskers based on model type and data structure.
- Computes feature attributions for local and global model interpretation.
- Validates explanation additivity against exact model outputs.
- Handles multi-output models by selecting specific output indices or names.
- Generates visualizations including beeswarm, waterfall, and scatter plots for model analysis.
- Provides a template for deterministic, self-contained tabular reporting.
When to use it
- When you need to understand which features drive specific model predictions.
- When auditing model behavior for consistency with domain expectations.
- When comparing model performance or feature usage across different cohorts.
- When preparing documentation for model interpretability and transparency.
- When debugging unexpected model outputs or additivity failures.
Advantages
- Provides a mathematically grounded approach to feature attribution.
- Supports a wide range of models including tree ensembles, linear models, and deep learning.
- Enables both local (row-level) and global (dataset-level) analysis.
- Facilitates reproducible audits through explicit background data and masker definitions.
- Integrates with standard Python data science stacks.
Usage examples
- “Explain the predictions of my trained RandomForestClassifier using SHAP.”
- The agent will guide you to instantiate a TreeExplainer with a representative background dataset, compute the explanations, and validate the results using the model's predict_proba method.
- “How do I visualize the global feature importance for my model?”
- The agent will demonstrate how to use shap.plots.beeswarm or shap.plots.bar on an Explanation object to show the magnitude and direction of feature impacts across the dataset.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/k-dense-ai/shap/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip shap.zip -d .agents/skills
Documentation by K-Dense Inc.
SHAP
Use SHAP to describe how a fitted predictive model maps inputs to outputs. Work from the modern shap.Explanation API, make the explained output and background distribution explicit, and validate every explanation before interpreting it.
This skill is aligned with SHAP 0.52.0 (released 2026-05-28). That release requires Python 3.12 or newer.
The maintained examples were checked on Python 3.12.10 with SHAP 0.52.0, NumPy 2.5.3, pandas 3.0.6, scikit-learn 1.9.1, and matplotlib 3.11.2. Native tests cover small tree, exact, permutation, partition, linear, additive, kernel, text, and constant-image games; additional numeric XGBoost 3.4.1 smoke checks cover raw, probability, loss, and interaction outputs. Reference snippets that require a project model, framework, or data are adaptation templates; optional pretrained/deep, GPU, and distributed integrations remain illustrative and require their own runtime validation.
Operating Rules
Explain a fixed, evaluated model; do not use SHAP as a substitute for predictive validation.
Use held-out or clearly labeled analysis rows for explanations. Choose background rows only from an appropriate training or reference population.
State the explained output: regression value, raw margin, probability, log loss, logit, or another model method.
Prefer
shap.Explanationobjects andexplainer(X). Some specialized options still require.shap_values(X), including deep ranked outputs, gradient sampling budgets, and Kernel SHAPnsamples. Preserve their output indexes and baselines explicitly.For multi-output models, select one output before using tabular plots:
explanation[..., output_index].Check
base_values + values.sum(...)against the exact model output being explained.Treat SHAP as a description of model behavior under a masking/background choice. It does not establish causality, fairness, recourse, or scientific mechanism.
Never silence an additivity failure until input shape, preprocessing, model version, output space, and row ordering have been checked.
Do not load untrusted pickle, joblib, model, or explainer artifacts; those formats can execute code during deserialization.
Install
Create an isolated environment and pin the documented release:
uv venv --python 3.12
source .venv/bin/activate
uv pip install "shap[plots]==0.52.0"shap[plots] installs the plotting dependencies. Add the fitted model's package at a version compatible with the project. For older Python compatibility, read references/migration.md instead of silently installing a different SHAP release.
Confirm the environment before debugging an API mismatch:
import platform
import shap
print("Python:", platform.python_version())
print("SHAP:", shap.__version__)Standard Workflow
1. Define the explanation target
Record:
model and preprocessing version;
exact callable or model method being explained;
output name/index and units;
evaluation rows;
background/reference population;
masker and explainer algorithm;
SHAP and model-library versions.
For classifiers, decide whether the task needs raw margins or probabilities. Defaults differ by model family; never infer units from the plot color or sign.
2. Select an explainer and masker
Start with shap.Explainer(model, masker) when automatic dispatch is sufficient. Instantiate a specialized explainer when its assumptions or output controls matter.
| Situation | Preferred choice | Important constraint |
|---|---|---|
| Supported tree ensemble | TreeExplainer | model_output="probability" and "log_loss" require interventional masking and background data |
| Linear model | LinearExplainer | The masker determines interventional versus correlation-aware behavior |
| Small feature space | ExactExplainer | Cost grows quickly with unconstrained feature count |
| General tabular callable | PermutationExplainer | Budget at least one full forward/reverse permutation |
| Hierarchical feature groups, text, or image | PartitionExplainer | The partition tree changes the cooperative game |
| Differentiable neural network | DeepExplainer or GradientExplainer | Framework support, output shape, and background choice require testing |
| Legacy Kernel SHAP workflow | KernelExplainer | Usually much slower than model-specific methods |
Use the detailed decision guide in references/explainers.md. Use references/data-maskers.md when features are correlated, structured, sparse, or semantically grouped.
3. Compute a modern Explanation
This complete binary-classification example uses an explicit background and selects output index 1. In the breast-cancer dataset, class 1 means benign, so positive SHAP values below increase predicted benign probability, not cancer risk. For another dataset, resolve the requested label through model.classes_ and record its meaning before selecting an output index; column 1 is not universally the clinically positive event.
import numpy as np
import shap
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(as_frame=True, return_X_y=True)
X = X.astype(np.float32) # Match sklearn forest prediction inputs.
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.25,
stratify=y,
random_state=7,
)
model = RandomForestClassifier(
n_estimators=200,
min_samples_leaf=3,
random_state=7,
n_jobs=-1,
).fit(X_train, y_train)
X_test = X_test.iloc[:100] # Predeclared held-out explanation subset.
background = shap.sample(X_train, 100, random_state=7)
explainer = shap.Explainer(model, background, algorithm="tree")
all_outputs = explainer(X_test)
# sklearn tree classifiers expose one output per class.
positive = all_outputs[..., 1]
assert positive.values.shape == X_test.shape
reconstructed = np.asarray(positive.base_values) + positive.values.sum(axis=1)
expected = model.predict_proba(X_test)[:, 1]
np.testing.assert_allclose(reconstructed, expected, rtol=1e-5, atol=1e-6)
shap.plots.beeswarm(positive, max_display=15)
shap.plots.waterfall(positive[0], max_display=15)Output shape is model-dependent:
one tabular output:
(samples, features);multiple tabular outputs:
(samples, features, outputs);multiple model inputs: often a list of arrays or explanations;
image/text explanations: feature axes follow the input representation, with output selection on the final axis when present.
Do not use the pre-0.45 pattern values[class_index] for a modern multi-output array. Use values[..., class_index] or slice the Explanation itself.
4. Control tree output semantics when needed
For a supported tree classifier, probability-space explanations must be explicit:
background = shap.sample(X_train, 200, random_state=7)
explainer = shap.TreeExplainer(
model,
data=shap.maskers.Independent(background, max_samples=len(background)),
feature_perturbation="interventional",
model_output="probability",
)
probability_exp = explainer(X_test)A bare background frame is capped at 100 rows by the default masker. The explicit masker above retains all 200 sampled rows; inspect len(explainer.data) when reporting or comparing background sizes.
In SHAP 0.52:
feature_perturbation="auto"uses interventional semantics when background data is supplied and tree-path-dependent semantics otherwise;probability and log-loss output modes are supported only with interventional semantics;
pass
approximate=Truetoexplainer(X, approximate=True)if deliberately using the lower-fidelity tree approximation; do not pass it to the constructor.
5. Use a model-agnostic callable deliberately
Pass the exact callable whose outputs will be interpreted:
masker = shap.maskers.Independent(background, max_samples=100)
explainer = shap.Explainer(
model.predict_proba,
masker,
algorithm="permutation",
output_names=[str(label) for label in model.classes_],
seed=7,
)
budget = 2 * X_test.shape[1] + 1
all_outputs = explainer(X_test.iloc[:20], max_evals=budget)
# 0.52 selector dispatch may drop output_names for permutation.
all_outputs.output_names = [str(label) for label in model.classes_]
positive = all_outputs[..., 1]Increase max_evals to average over more permutations when estimates are unstable. Keep the seed, background sample, and evaluation budget in the report.
6. Visualize the question, not merely the available plot
| Question | Plot |
|---|---|
| Which features have the largest average attribution magnitude? | shap.plots.bar(exp) |
| How do direction, magnitude, and observed values vary globally? | shap.plots.beeswarm(exp) |
| Why did one prediction differ from its baseline? | shap.plots.waterfall(exp[i]) |
| How does one feature's attribution vary over its values? | shap.plots.scatter(exp[:, feature]) |
| Do explanations form sample-level patterns? | shap.plots.heatmap(exp) |
| How do predefined cohorts differ descriptively? | shap.plots.bar(exp.cohorts(labels).abs.mean(0)) |
| Which tokens or image regions contribute to an output? | shap.plots.text(exp) or shap.plots.image(exp) |
Read references/plots.md before customizing or saving figures.
7. Report limitations with results
At minimum, report:
output and units;
baseline/reference population;
explainer and masker;
sample count and selection;
output index/name;
additivity error or applicable approximation diagnostics;
known correlated/grouped features;
whether results are local, aggregated, or cohort-specific;
a clear non-causal statement.
Common Tasks
Global and local analysis
Use global plots to locate important patterns, scatter plots to inspect those patterns, and local plots to investigate selected rows. Do not select only visually dramatic rows without documenting the selection rule.
Multiclass models
Set output_names where possible, inspect explanation.output_names, and slice an output before plotting:
class_exp = explanation[..., list(explanation.output_names).index("class_name")]
# or
class_exp = explanation[..., class_index]In 0.52.0, the generic permutation selector may drop supplied output names, and combining an ellipsis with a string output index can fail. Verify the class mapping, set names explicitly when needed, and resolve names to integer indexes before slicing.
Never average signed attributions across classes. For cross-class comparison, preserve the same model, rows, background, output space, and aggregation.
Cohorts, subgroup analysis, and fairness
SHAP can compare how a model uses features across cohorts, but this is not a fairness test. A protected feature with small SHAP magnitude does not rule out proxy discrimination, and removing a protected feature does not establish fairness. Pair attribution analysis with performance, calibration, error-rate, and domain-appropriate fairness metrics.
See references/workflows.md for cohort construction, model comparison, error analysis, log-loss explanations, monitoring, and production records.
Text and images
Use domain maskers rather than treating tokens or pixels as ordinary independent columns:
shap.maskers.Text(tokenizer)withPartitionExplainerfor token groups;shap.maskers.Image(...)withPartitionExplainerfor image regions;restrict expensive multi-output models with
outputs=....
Read references/modalities.md for current examples and output-shape guidance.
Troubleshooting Order
Print Python, SHAP, model-library, NumPy, and framework versions.
Verify the model receives exactly the same transformed columns, order, dtype, and missing-value representation used during fitting.
Print
values.shape,base_values.shape,data.shape,feature_names, andoutput_names.Confirm the selected output and output units.
Recompute predictions on the same rows in the same order.
Test a smaller batch and representative background.
Only then investigate package-specific compatibility or approximation settings.
Use references/troubleshooting.md for additivity failures, shape mismatches, categorical features, pipelines, deep-learning frameworks, plotting, and performance.
Bundled Script
Run a deterministic, self-contained tabular example that writes importance data, metadata, and plots:
uv run --no-project --python 3.12 --with "shap[plots]==0.52.0" \
skills/shap/scripts/tabular_report.py --output-dir /tmp/shap-reportThe script labels the default output as benign probability, retains the requested background up to the training-set size, and rejects non-finite validation tolerances. Its synthetic software checks and built-in dataset demo do not validate causal or clinical claims. Some SHAP 0.52.0 forest configurations fail explicit reconstruction (including seed 3 with 150 background rows); the script rejects those without writing report artifacts. See references/troubleshooting.md.
It exports feature_importance.csv, first_row_contributions.csv, prediction_reconstruction.csv, and metadata.json, plus bar.png, beeswarm.png, waterfall-first-row.png, and scatter-top-feature.png. Plot titles identify the selected class probability.
The script does not download data or deserialize models. Read it as a template, then replace the built-in dataset and model while preserving output selection and additivity validation.
Reference Map
| File | Load when |
|---|---|
| references/explainers.md | Selecting or configuring explainers |
| references/data-maskers.md | Choosing background data, masking semantics, or feature groups |
| references/plots.md | Selecting, composing, or saving visualizations |
| references/workflows.md | Running audits, comparisons, cohorts, monitoring, or production workflows |
| references/modalities.md | Explaining text, images, or deep models |
| references/migration.md | Updating legacy SHAP code or supporting older Python |
| references/theory.md | Explaining estimands, guarantees, dependence, interactions, and limitations |
| references/troubleshooting.md | Diagnosing runtime, shape, additivity, and compatibility problems |
Primary Sources
Documentation: https://shap.readthedocs.io/en/latest/
API reference: https://shap.readthedocs.io/en/latest/api.html
Release notes: https://shap.readthedocs.io/en/latest/release_notes.html
Repository: https://github.com/shap/shap
Citing Scientific Agent Skills
This skill is part of Scientific Agent Skills by K-Dense. If it materially contributed to a manuscript, report, presentation, or code release, add the paper to the references or software section and tell the user you did so:
Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065
Always cite the current version. The DOI and https://arxiv.org/abs/2609.00065 resolve to the
latest arXiv version, so never append a version suffix such as v1. When network access is
available, fetch https://arxiv.org/abs/2609.00065 (or
http://export.arxiv.org/api/query?id_list=2609.00065) before writing the reference and take
the author list, year, and version from that record. If the record lists a journal reference
or publisher DOI, cite the published version instead.
Files
- ATTRIBUTION.mdAdded by AutoGineer898 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md16.1 KiB
- references/data-maskers.md11.6 KiB
- references/explainers.md17.5 KiB
- references/migration.md9.8 KiB
- references/modalities.md12.3 KiB
- references/plots.md12.2 KiB
- references/theory.md12.7 KiB
- references/troubleshooting.md14.3 KiB
- references/workflows.md19.3 KiB
- scripts/tabular_report.pyScript11.1 KiB
references/explainers.md
SHAP Explainers
This reference targets SHAP 0.52.0. Prefer the callable interface (explanation = explainer(X)) so results retain values, baselines, data, feature names, and output names in a shap.Explanation.
Selection Checklist
Before choosing an explainer, answer:
What exact callable or model output is being explained?
Is the model natively supported by a specialized explainer?
What does "missing" mean for each input feature?
Are features independent, correlated, grouped, sequential, or spatial?
How many model evaluations are affordable per row?
Is the output scalar or multi-output?
Is an exact result required under the chosen game, or is a sampled estimate acceptable?
Recommended Decision Path
| Model/input | First choice | Alternative | Main risk |
|---|---|---|---|
| Supported tree ensemble | TreeExplainer | GPUTreeExplainer (experimental) | Output units and feature-dependence semantics |
| Linear model | LinearExplainer | ExactExplainer | Correlation assumptions |
| Small tabular feature set | ExactExplainer | PermutationExplainer | Exponential cost without a partition tree |
| General tabular callable | PermutationExplainer | PartitionExplainer, KernelExplainer | Evaluation cost and off-manifold masks |
| Hierarchically grouped inputs | PartitionExplainer | PermutationExplainer with Partition masker | Attributions are Owen values for the constrained game |
| Differentiable TensorFlow/PyTorch model | DeepExplainer or GradientExplainer | PartitionExplainer | Operator support, background, and output shape |
| Text or image callable | PartitionExplainer with domain masker | Framework-specific deep explainer | Masking semantics dominate interpretation |
shap.Explainer
shap.Explainer combines a model, masker, link, and algorithm. With algorithm="auto", it returns a compatible specialized subclass.
explainer = shap.Explainer(
model,
masker=background,
algorithm="auto",
output_names=output_names,
feature_names=feature_names,
seed=7,
)
explanation = explainer(X_eval)The 0.52.0 selector advertises auto, permutation, partition, tree, linear, deep, exact, and additive. However, its algorithm="deep" dispatch forwards unsupported keywords to DeepExplainer and raises TypeError; construct shap.DeepExplainer(model, background) directly. auto is not a general framework detector.
Use the auto-selector when:
the model/masker pair is conventional;
default output semantics are acceptable;
no algorithm-specific parameter is needed.
Instantiate the specialized class when:
tree
model_outputorfeature_perturbationmust be explicit;a particular approximation or evaluation budget is part of the analysis;
a framework-specific deep model requires a precise input/layer form.
Passing a background matrix is shorthand for a standard tabular masker. Prefer an explicit masker when its semantics need to appear in an audit record.
TreeExplainer
Common constructor arguments (the deprecated approximate parameter and unused link controls are intentionally omitted):
shap.TreeExplainer(
model,
data=None,
model_output="raw",
feature_perturbation="auto",
feature_names=None,
)Supported families include XGBoost, LightGBM, CatBoost, PySpark trees, and most scikit-learn tree models. Support varies by model version and categorical configuration, so test a small batch after dependency changes.
Feature perturbation
feature_perturbation defines how hidden features are integrated:
"interventional"requires background data. Runtime scales approximately linearly with background size."tree_path_dependent"uses training counts stored in tree leaves and does not require a separate background."auto"uses interventional semantics whendatais supplied and tree-path-dependent semantics otherwise. This has been the default since 0.47.
These options answer different questions and can allocate credit differently for dependent features. Neither turns an ordinary predictive model into a causal model.
Output space
model_output can be:
"raw": model-specific raw tree output;"probability": transformed probability output;"log_loss": a model-specific loss transform; for supported binary margin models this is negative log likelihood, while squared-error objectives use squared loss;a supported model method name such as
"predict_proba".
"probability" and "log_loss" currently require feature_perturbation="interventional" and background data.
Raw output is model-dependent:
regression commonly uses the predicted target value;
XGBoost binary classification commonly uses a margin/log-odds value;
scikit-learn tree classifiers commonly expose one probability output per class.
Always inspect shape and verify the additive reconstruction against the exact model output.
Calling and validation
explainer = shap.TreeExplainer(
model,
data=background,
feature_perturbation="interventional",
model_output="probability",
)
all_outputs = explainer(X_eval)
class_exp = all_outputs[..., class_index]
reconstructed = class_exp.base_values + class_exp.values.sum(axis=1)
expected = model.predict_proba(X_eval)[:, class_index]
np.testing.assert_allclose(reconstructed, expected, rtol=1e-5, atol=1e-6)The built-in tree additivity check applies to raw output paths; explicitly validate probability and loss reconstructions. Loss baselines can be label-dependent callables: see the concrete loss workflow in workflows.md. A bare DataFrame background is capped at 100 rows; retain a larger selected sample with data=shap.maskers.Independent(background, max_samples=len(background)) and record the effective size.
Approximate tree values
Do not pass approximate to the constructor. If the speed/quality trade-off is intentional:
approx_exp = explainer(X_eval, approximate=True)This uses a single-ordering approximation associated with Saabas values. It does not retain the consistency guarantee of Tree SHAP and can over-weight lower tree splits. Label the result as approximate.
Interaction values
Use a separate raw, tree-path-dependent explainer for supported tree interactions:
interaction_explainer = shap.TreeExplainer(
model, feature_perturbation="tree_path_dependent", model_output="raw",
)
interaction = interaction_explainer.shap_interaction_values(X_eval)
ordinary = interaction_explainer(X_eval)
np.testing.assert_allclose(interaction.sum(axis=2), ordinary.values, atol=1e-6)Probability/log-loss explainers reject interaction calls. The interventional C++ path does not implement interactions and can emit zeros with a warning; never interpret those as absent interactions. Compare against ordinary values from this same path-dependent game, not an earlier interventional explanation. Each symmetric off-diagonal cell carries half the pair contribution.
Shapes:
one output:
(samples, features, features);multiple outputs:
(samples, features, features, outputs).
Since 0.45, multiple outputs use a NumPy array rather than a list. Interaction computation can be much larger than ordinary explanations; subset rows and features deliberately.
GPU tree explainer
GPUTreeExplainer is experimental and requires a source build with CUDA support. Validate parity against CPU TreeExplainer, especially for missing values, multiclass baselines, and categorical splits.
LinearExplainer
Use for linear or logistic models:
masker = shap.maskers.Independent(background)
explainer = shap.LinearExplainer(model, masker)
explanation = explainer(X_eval)With independent/interventional masking, a linear attribution is related to:
coefficient_i * (x_i - reference_mean_i)For correlation-aware allocation, use an Impute masker:
masker = shap.maskers.Impute(background, method="linear")
explainer = shap.LinearExplainer(model, masker)For logistic regression, these linear attributions reconstruct model.decision_function(X_eval) in log-odds units, not predict_proba or predicted class labels. Explain a probability callable with a model-agnostic method when probability-space attribution is required.
Correlation-aware values share credit among correlated inputs and can assign attribution to a feature that the fitted model does not directly use. This is a property of the conditional game, not evidence of a direct model coefficient or causal effect. SHAP 0.52 warns when the estimated covariance matrix is singular.
ExactExplainer
ExactExplainer enumerates coalitions with optimizations:
masker = shap.maskers.Independent(background)
explainer = shap.ExactExplainer(model_fn, masker)
explanation = explainer(X_eval)Use it for:
small feature spaces;
correctness checks against an approximate explainer;
partition games where the hierarchy sharply reduces evaluation cost.
Avoid it for unconstrained high-dimensional inputs.
PermutationExplainer
PermutationExplainer is the general modern model-agnostic default:
masker = shap.maskers.Independent(background, max_samples=100)
explainer = shap.PermutationExplainer(
model_fn,
masker,
feature_names=feature_names,
seed=7,
)
minimum_budget = 2 * len(feature_names) + 1
explanation = explainer(
X_eval,
max_evals=minimum_budget * 10,
error_bounds=True,
)One forward/reverse pass guarantees additivity and is exact for models with interactions no higher than second order. Repeating random permutations improves estimates for higher-order interactions.
Cost scales with:
evaluation rows;
feature count;
number of permutations;
background rows;
model latency.
Batch the model callable where possible. Preserve the seed and budget. error_bounds=True estimates variation across sampled paths; it is not a confidence interval for model correctness or biological effects.
Links and output units
For a probability callable, a supported model-agnostic link changes the additive units:
explainer = shap.Explainer(
probability_fn, background, algorithm="permutation",
link=shap.links.logit, seed=7,
)
exp = explainer(X_eval, max_evals=(2 * X_eval.shape[1] + 1) * 5)
np.testing.assert_allclose(
exp.base_values + exp.values.sum(axis=1),
shap.links.logit(probability_fn(X_eval)), atol=1e-6,
)This fragment assumes a scalar probability strictly between 0 and 1. Check finiteness on masked inputs too; exact endpoints make log-odds infinite. With default link linearization, the baseline is logit(mean(background probabilities)), not the mean background logit. Record linearize_link; applying a link inside the model callable defines a different game. This is distinct from the force plot's display-only link. TreeExplainer's link constructor arguments are unused in 0.52.0; configure its supported model_output instead.
PartitionExplainer
PartitionExplainer follows a hierarchical clustering of input features:
masker = shap.maskers.Partition(
background,
max_samples=100,
clustering="correlation",
)
explainer = shap.PartitionExplainer(
model_fn,
masker,
output_names=output_names,
)
explanation = explainer(X_eval, max_evals=1000)With a partition tree, the values are Owen values for a constrained cooperative game. This is useful when:
groups should enter a coalition together;
correlated tabular inputs should be organized hierarchically;
tokens or image regions have natural structure;
unconstrained exact enumeration is too expensive.
Do not call partition values equivalent to unconstrained Shapley values without noting the changed game.
KernelExplainer
Kernel SHAP fits a weighted linear surrogate over sampled coalitions:
explainer = shap.KernelExplainer(
model_fn,
background,
link="identity",
feature_names=feature_names,
)
legacy_values = explainer.shap_values(
X_eval, nsamples="auto", l1_reg="num_features(10)",
)Use it when:
maintaining a validated Kernel SHAP analysis;
a specific identity/logit link behavior is required;
another explainer cannot represent the model/masker combination.
KernelExplainer(X) also returns an Explanation, but its 0.52.0 call signature only exposes l1_reg and silent; use .shap_values(..., nsamples=...) for an explicit sampling budget. The default l1_reg="num_features(10)" selects at most ten features (changed in 0.47), so omitted features are not evidence of zero model use. Choose and record regularization; l1_reg=0 removes this selection when the sampled system is sufficiently determined.
For new general tabular work, consider PermutationExplainer for its direct evaluation-budget control.
Kernel SHAP can be slow and may create unrealistic masked samples. Summarizing background data changes the estimand as well as runtime.
DeepExplainer
Deep SHAP approximates attributions for supported differentiable TensorFlow and PyTorch models.
Before constructing a PyTorch explainer, switch the nn.Module to evaluation mode using its standard eval method. This is a PyTorch state change, not Python's built-in code-evaluation function.
PyTorch:
explainer = shap.DeepExplainer(model, background_tensor)
values = explainer.shap_values(test_tensor)TensorFlow/Keras:
explainer = shap.DeepExplainer(model, background_array)
values = explainer.shap_values(test_array)Model forms:
TensorFlow: a model, or an
(inputs, output)tensor pair with a single-dimensional output;PyTorch: an
nn.Module, or(model, layer)to attribute the selected layer's input.
Background cost is linear in sample count. Official guidance describes roughly 100 samples as a useful estimate and 1000 as a more accurate but costlier estimate; test convergence for the actual model.
Output shapes since 0.45:
one input, one output: inspect for
(samples, *input_shape)or a final singleton output axis; the 0.52.0 PyTorch Deep implementation stacks even a single output;one input, multiple outputs:
(samples, *input_shape, outputs);multiple inputs: a list, one array per input.
Pass ranked_outputs=k to .shap_values(...), not the constructor. It returns both values and selected output indexes. Never assume a binary model returns a two-element list.
For PyTorch, return (batch, outputs), including (batch, 1) for a scalar-output wrapper; a squeezed (batch,) result fails the Deep backend's output-axis handling. Deep explainers support only known operators and architecture patterns. Additivity failures can indicate unsupported operations rather than a tolerance problem.
GradientExplainer
GradientExplainer implements expected gradients, an extension of integrated gradients:
explainer = shap.GradientExplainer(
model,
background_tensor,
batch_size=50,
local_smoothing=0,
)
values = explainer.shap_values(test_tensor, nsamples=200, rseed=7)Use it when:
the model is differentiable;
DeepExplainer lacks an operator rule;
expected-gradients semantics are appropriate.
It remains an approximation. Report nsamples, seed, background, and any smoothing.
Other Public Explainers
AdditiveExplainer: first-order additive models with anIndependentmasker; do not use for models containing interaction terms.SamplingExplainer: Shapley sampling/IME-style approximation; mainly relevant to existing workflows.CoalitionExplainer: custom coalition-tree workflows using Winter (recursive Owen) values; itspartition_treecontract is separate fromPartitionExplainer, and text/image inputs are not implemented. Treat a new application as illustrative until checked against 0.52.0 source and a tiny known game.shap.explainers.other.*: wrappers and diagnostic baselines, not the default for a SHAP audit.
Multi-Output Handling
Modern tabular explanations normally put outputs on the final axis:
print(explanation.values.shape)
print(explanation.output_names)
one_output = explanation[..., output_index]
# If output_names were supplied:
one_output = explanation[..., list(explanation.output_names).index("output_name")]In 0.52.0, Explainer(..., algorithm="permutation", output_names=...) may discard those names during subclass dispatch. Set explanation.output_names from the verified model mapping after checking output count. Avoid ellipsis plus a string index, which can raise IndexError; resolve the name to an integer as above.
For ranked deep outputs, use the returned indexes; they can differ by sample.
Do not:
use
explanation[output_index]to select a class (that selects a row);average signed values across outputs;
compare output magnitudes in different units;
pass a 3-D multi-output tabular explanation directly to a plot requiring
(samples, features).
Sources
Explainer API: https://shap.readthedocs.io/en/latest/generated/shap.Explainer.html
TreeExplainer: https://shap.readthedocs.io/en/latest/generated/shap.TreeExplainer.html
PermutationExplainer: https://shap.readthedocs.io/en/latest/generated/shap.PermutationExplainer.html
PartitionExplainer: https://shap.readthedocs.io/en/latest/generated/shap.PartitionExplainer.html
DeepExplainer: https://shap.readthedocs.io/en/latest/generated/shap.DeepExplainer.html
API reference: https://shap.readthedocs.io/en/latest/api.html
Released source / upstream contract: https://github.com/shap/shap/blob/v0.52.0/shap/explainers/_explainer.py
Released source / upstream contract: https://github.com/shap/shap/blob/v0.52.0/shap/explainers/_kernel.py
Released source / upstream contract: https://github.com/shap/shap/blob/v0.52.0/shap/explainers/_tree.py
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Declares allowed tools, Needs network access, Needs Python
The author says: Requires Python 3.12+ and uv for SHAP 0.52.0; model-specific libraries are optional.
Security
What our scanner noticed· Low risk
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- K-Dense Inc.
- Publisher
- K-Dense (Community)
- Source
- K-Dense-AI/scientific-agent-skills · skills/shap · commit a25cf9e
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE.md)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by K-Dense Inc. or K-Dense.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download shap.zip