violin
summary plot (小提琴汇总图)
本笔记本旨在演示(并因此记录)如何使用 shap.plots.violin
函数。
它使用在 scikit-learn 库提供的玩具糖尿病数据集上训练的 XGBoost 模型(源 URL:https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html)。
更多信息请参见:https://scikit-learn.cn/stable/datasets/toy_dataset.html#diabetes-dataset。
[10]:
import xgboost
import shap
# train xgboost model on diabetes data:
X, y = shap.datasets.diabetes()
bst = xgboost.train({"learning_rate": 0.01}, xgboost.DMatrix(X, label=y), 100)
# explain the model's prediction using SHAP values
shap_values = shap.TreeExplainer(bst).shap_values(X)
type(shap_values)
[10]:
numpy.ndarray
一个简单的小提琴汇总图
小提琴汇总图紧凑地表示每个特征的 SHAP 值的分布和变异性。各个小提琴图根据特定特征对模型输出的重要性(每个特征的 SHAP 值绝对值之和)堆叠排列。
小提琴图使用“小提琴形状”的图形来显示其各自特征的 SHAP 值的分布和密度。因此,小提琴图可以提供关于特定特征的 SHAP 值分布的范围、变异性、偏度、对称性和多模态性的见解。
总体小提琴汇总图允许比较特征的重要性。更宽的小提琴表示更高的密度和更频繁的值,从而提供关于每个特征相对于模型输出的相对重要性的见解。
[11]:
shap.plots.violin(shap_values)

糖尿病数据集中有 10 个特征可用。
默认情况下,shap.plots.violin
显示的最大特征数为 20。
小提琴汇总图显示的特征数量可以通过 max_display
参数进行调整。
[12]:
shap.plots.violin(shap_values, max_display=3)

默认情况下,标准小提琴汇总图的颜色为蓝色,但可以使用 color
参数更改。
[13]:
shap.plots.violin(shap_values, color="red")

将特征名称作为列表提供有助于汇总图的可视化和解释。
[14]:
feat_names = list(X.columns)
shap.plots.violin(shap_values, feature_names=feat_names)

分层小提琴汇总图
目前支持两种小提琴图类型:“violin”和“layered_violin”。您可以通过 plot_type
参数控制这一点。
分层小提琴汇总图与小提琴汇总图相同,只是不将异常值绘制为散点,并且它提供了关于数据中特征值(高/低)对输出影响的见解。
让我们以糖尿病示例为例。
我们想要基于我们的数据 (X) 和计算出的 shap_values 为我们的案例绘制分层小提琴汇总图。
我们传递的参数包括:- 我们的 shap_values
:shap_values - 我们的 features
:X - feature_names
:feat_names(为了可读性)- 以及感兴趣的 plot_type
:“layered_violin”。
[15]:
shap.plots.violin(shap_values, features=X, feature_names=feat_names, plot_type="layered_violin")

我们可以看到,在这种情况下,与标准小提琴图类似,s5
是最重要的变量,并且通常会导致预测发生较大的正向或负向变化。
但是,我们现在也可以了解数据中影响的方向。红色代表变量的大值,蓝色代表所考虑特征的小值。
因此,可以清楚地看到,例如,s5
的大值会增加预测,反之亦然。我们还可以看到,其他特征(如 s6
)的分布非常均匀,这表明虽然总体而言它们仍然很重要,但它们的相互作用取决于其他变量。(毕竟,像 xgboost 这样的树模型的全部意义在于捕获这些交互作用,所以我们不能期望在一个维度中看到所有内容!)
绘图尺寸
最后,使用 plot_size
参数,您可以控制汇总图的大小。默认情况下,大小会根据显示的特征数量自动缩放。
传递单个浮点数将使每行的高度为该英寸数。
传递一对浮点数将按该英寸数缩放绘图。
如果传递 None,则当前图形的大小将保持不变。
[16]:
# auto-scaled:
shap.plots.violin(shap_values, feature_names=feat_names)

[17]:
# each plot is 0.1 inches
shap.plots.violin(shap_values, feature_names=feat_names, plot_size=0.1)

[18]:
# scale: 1x3 inches
shap.plots.violin(shap_values, feature_names=feat_names, plot_size=(1, 3))

有更多有用的示例的想法吗?欢迎提交拉取请求以添加到此文档笔记本!