violin 摘要图

本笔记本旨在演示(并记录)如何使用 shap.plots.violin 函数。

它使用了一个在 scikit-learn 库提供的玩具糖尿病数据集上训练的 XGBoost 模型(源 URL: https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html)。

更多信息请参见:https://scikit-learn.org/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)
../../../_images/example_notebooks_api_examples_plots_violin_3_0.png

糖尿病数据集中有10个可用特征。

默认情况下,shap.plots.violin 显示的最大特征数量为 20。

小提琴摘要图显示的特征数量可以通过 max_display 参数进行调整:

[12]:
shap.plots.violin(shap_values, max_display=3)
../../../_images/example_notebooks_api_examples_plots_violin_5_0.png

默认情况下,标准小提琴图的颜色为蓝色,但可以使用 color 参数进行更改:

[13]:
shap.plots.violin(shap_values, color="red")
../../../_images/example_notebooks_api_examples_plots_violin_7_0.png

将特征名称作为列表提供可以帮助可视化和解释摘要图:

[14]:
feat_names = list(X.columns)
shap.plots.violin(shap_values, feature_names=feat_names)
../../../_images/example_notebooks_api_examples_plots_violin_9_0.png

分层小提琴图摘要

目前支持两种小提琴图类型:’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"
)
../../../_images/example_notebooks_api_examples_plots_violin_12_0.png

在这种情况下,与标准小提琴类似,我们可以看到 s5 是最重要的变量,并且通常它会导致预测结果发生较大的正向或负向变化。

然而,我们现在也可以从数据中感受到影响的走向。红色代表变量的大值,蓝色代表小值,针对所考虑的特征。

因此,可以看出例如 s5 的大值会增加预测,反之亦然。我们还可以看到其他特征(如 s6)的分布相当均匀,这表明尽管它们总体上仍然重要,但它们的相互作用依赖于其他变量。(毕竟,像 xgboost 这样的树模型的全部意义在于捕捉这些相互作用,所以我们不能期望在单一维度上看到所有内容!)

绘图尺寸

最后,使用 plot_size 参数,您可以控制摘要图的大小。默认情况下,大小会根据显示的特征数量自动缩放。

传递一个单一的浮点数将导致每一行的高度为该浮点数英寸。

传递一对浮点数将按该英寸数缩放绘图。

如果传递 None,则当前图形的大小将保持不变。

[16]:
# auto-scaled:
shap.plots.violin(shap_values, feature_names=feat_names)
../../../_images/example_notebooks_api_examples_plots_violin_15_0.png
[17]:
# each plot is 0.1 inches
shap.plots.violin(shap_values, feature_names=feat_names, plot_size=0.1)
../../../_images/example_notebooks_api_examples_plots_violin_16_0.png
[18]:
# scale: 1x3 inches
shap.plots.violin(shap_values, feature_names=feat_names, plot_size=(1, 3))
../../../_images/example_notebooks_api_examples_plots_violin_17_0.png

有更多有用示例的想法吗?我们鼓励提交增加此文档笔记本的拉取请求!