迁移到新的“Explanation” API

此笔记本演示了 shap API 在 shap v0.36.0 版本中引入的一些更改。

[1]:
# An example dataset and model
import xgboost

import shap

X, y = shap.datasets.adult(n_points=100)
model = xgboost.XGBClassifier().fit(X, y)
explainer = shap.TreeExplainer(model, X)

总结 API 的主要更改

[2]:
shap_values = explainer.shap_values(X)  # Old style
explanation = explainer(X)  # New style

计算解释

旧样式

在 shap v0.36.0 之前的版本中,解释表示为简单的 numpy 数组,并使用解释器的 .shap_values() 方法计算

[3]:
shap_values = explainer.shap_values(X)
shap_values[:2]  # a numpy array
[3]:
array([[-0.54854601,  0.01639348, -0.46476041,  0.85896822, -1.36168788,
        -0.64692199,  0.0254638 , -0.58422904, -0.02344483,  0.        ,
         0.1224989 ,  0.01079906],
       [-0.83802091,  0.01562196,  0.78349799, -1.10456323, -0.68524691,
        -0.84828204,  0.03734176, -0.86151311, -0.02564897,  0.        ,
        -0.56183428,  0.00415988]])

类似地,旧的绘图函数(如 shap.summary_plot)期望 shap_values 为 numpy 数组。

新样式

从 shap v0.36.0 版本开始,解释现在使用 Explanation 对象表示,并通过直接将解释器作为函数调用来创建

[4]:
explanation = explainer(X)
explanation[:2]  # a shap.Explanation object
[4]:
.values =
array([[-0.54854601,  0.01639348, -0.46476041,  0.85896822, -1.36168788,
        -0.64692199,  0.0254638 , -0.58422904, -0.02344483,  0.        ,
         0.1224989 ,  0.01079906],
       [-0.83802091,  0.01562196,  0.78349799, -1.10456323, -0.68524691,
        -0.84828204,  0.03734176, -0.86151311, -0.02564897,  0.        ,
        -0.56183428,  0.00415988]])

.base_values =
array([-2.70354599, -2.70354599])

.data =
array([[27.,  4., 10.,  0.,  1.,  1.,  4.,  0.,  0.,  0., 44., 39.],
       [27.,  4., 13.,  4., 10.,  0.,  4.,  0.,  0.,  0., 40., 39.]])

shap.Explanation 对象是一个更丰富的表示形式,它包括 shap 值(可通过 .values 属性访问),以及支持上下文信息,例如背景数据集和特征名称。

新样式的绘图函数(如 shap.plot.barshap.plots.beeswarm)接受这些 Explanation 对象,而不是 numpy 数组。