waterfall

本笔记本旨在演示(并记录)如何使用 shap.plots.waterfall 函数。它使用了一个在经典的 UCI 成人收入数据集上训练的 XGBoost 模型(这是一个分类任务,预测人们在 90 年代是否收入超过 $50k)。

[1]:
import xgboost

import shap

# train XGBoost model
X, y = shap.datasets.adult()
model = xgboost.XGBClassifier().fit(X, y)

# compute SHAP values
explainer = shap.Explainer(model, X)
shap_values = explainer(X)
 99%|===================| 32335/32561 [00:58<00:00]

瀑布图旨在显示单个预测的解释,因此它们期望将Explanation对象的单行作为输入。瀑布图的底部从模型输出的期望值开始,然后每一行显示每个特征的正(红色)或负(蓝色)贡献如何将值从背景数据集的期望模型输出移动到此预测的模型输出。

下面是一个绘制第一个解释的示例。请注意,默认情况下,SHAP 以边际输出(在逻辑链接函数之前)解释 XGBoost 分类器模型。这意味着 x 轴上的单位是 log-odds 单位,因此负值意味着该人每年收入超过 5 万美元的概率小于 0.5。特征名称前的灰色文本显示了该样本中每个特征的值。

[2]:
shap.plots.waterfall(shap_values[0])
../../../_images/example_notebooks_api_examples_plots_waterfall_3_0.png

请注意,在上述解释中,三个影响最小的特征已被合并为一个术语,以便我们在图中显示的行数不超过10行。默认的10行限制可以通过 max_display 参数进行更改:

[3]:
shap.plots.waterfall(shap_values[0], max_display=20)
../../../_images/example_notebooks_api_examples_plots_waterfall_5_0.png

有趣的是,获得 $2,174 的资本收益会显著降低这个人每年收入超过 $50k 的预测概率。由于 waterfall 图只显示单个样本的数据,我们无法看到资本收益变化的影响。为了看到这一点,我们可以使用 scatter 图,它显示了资本收益的低值对收入的负面预测作用比完全没有资本收益还要大。为什么会发生这种情况需要深入研究数据,并且还应涉及更仔细地训练模型,并使用引导重采样来量化模型构建过程中的任何不确定性。

[4]:
shap.plots.scatter(shap_values[:, "Capital Gain"])
../../../_images/example_notebooks_api_examples_plots_waterfall_7_0.png

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