heatmap

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

[3]:
import xgboost

import shap

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

# compute SHAP values
explainer = shap.Explainer(model, X)
shap_values = explainer(X[:1000])

将SHAP值矩阵传递给热图绘制函数会创建一个图,其中实例在x轴上,模型输入在y轴上,SHAP值通过颜色刻度编码。默认情况下,样本使用 shap.order.hclust 进行排序,该方法根据解释相似性对样本进行层次聚类排序。这导致具有相同模型输出的样本因为相同的原因被分组在一起(如下图中资本收益影响较大的人群)。

模型的输出显示在热力图矩阵上方(围绕解释的 .base_value 中心),每个模型输入的全局重要性以条形图的形式显示在图的右侧(默认情况下,这是整体重要性的 shap.order.abs.mean 度量)。

[6]:
shap.plots.heatmap(shap_values)
../../../_images/example_notebooks_api_examples_plots_heatmap_3_0.png

增加 max_display 参数可以显示更多特征:

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

更改排序顺序和全局特征重要性值

我们可以通过向 feature_values 参数传递一组值来改变特征整体重要性的衡量方式(从而也改变它们的排序顺序)。默认情况下 feature_values=shap.Explanation.abs.mean(0),但下面我们展示了如何改为按所有样本中特征的最大绝对值排序:

[4]:
shap.plots.heatmap(shap_values, feature_values=shap_values.abs.max(0))
../../../_images/example_notebooks_api_examples_plots_heatmap_7_0.png

我们还可以使用 instance_order 参数来控制实例的排序。默认情况下,它设置为 shap.Explanation.hclust(0) 以将具有相似解释的样本分组在一起。下面我们展示如何通过所有特征的 SHAP 值之和进行排序,从而为数据提供一个补充的视角:

[5]:
shap.plots.heatmap(shap_values, instance_order=shap_values.sum(1))
../../../_images/example_notebooks_api_examples_plots_heatmap_9_0.png

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