本文中有多篇计划文章,后期会补充相关链接。鉴于公众号内无法后期修改文章,请关注原文链接。
如何创建和解释 SHAP 图:瀑布图、力图、平均 SHAP 图、蜂群图和依赖图
可直接在橱窗里购买,或者到文末领取优惠后购买:
SHAP 是用于理解和调试模型的最强大的 Python 包。它可以告诉我们每个模型特征对单个预测的贡献。通过汇总 SHAP 值,我们还可以了解多个预测的趋势。只需几行代码,我们就能识别和可视化模型中的重要关系。
我们将介绍用于计算和显示 SHAP 值的代码。其中包括对以下 SHAP 图的解释:
- Waterfall Plot
- Force Plot
- Mean SHAP Plot
- Beeswarm Plot
- Dependence Plot
我们针对预测连续目标变量的模型执行此操作。如果你需要分类的解释,日后会专门写相关文章,届时可以参阅 [[二元和多类目标变量的 SHAP]],你可以在 GitHub1 上找到完整的项目。
数据集
为了演示 SHAP 包,我们将使用包含 4,177 个观测值的「鲍鱼数据集」2。下面,你可以看到我们的数据集的快照。鲍鱼是一种贝类美食。我们想使用数据集来预测它们的年龄。更具体地说,我们的目标变量是鲍鱼壳中的环数。我们将使用shell length
、shell diameter
和鲍鱼的 whole weight
等特征。
在下图中,我们直观地展示了一些特征与目标变量之间的关系。 Shucked weight
是鲍鱼肉的重量(即从壳中取出后的重量)。我们可以看到,去壳重量增加时,环的数量往往会增加。这是有道理的,因为我们认为年龄较大的鲍鱼会更大,肉也更多。
我们还可视化了鲍鱼的性别,这是一个分类特征。在模型中使用此功能之前,我们需要使用 One-Hot 编码对其进行转换。正如你所看到的,这会导致每个生成的二进制特征都有一个单独的 SHAP 值。这使得很难理解原始分类特征的整体贡献。我们将在后面专门写一篇文章「[[分类特征的 SHAP]]」探讨一种解决方案。
对于最后一点数据探索,我们为连续特征创建一个相关矩阵。 可以看到,我们正在处理高度相关的特征。 长度和直径完全相关。 同样,全重与其他重量测量值也高度相关。 例如肉的重量(去壳重量)和除去肉的外壳重量(外壳重量)。
包
我们在下面导入必要的 Python 包。我们有一些用于管理和可视化数据的标准库(第 4-9 行)。XGBoost 用于对目标变量进行建模(第 13 行),我们导入一些包来评估我们的模型(第 14 行)。最后,我们导入 SHAP 包(第 16 行)。我们初始化包(第 17 行)。这样我们就可以在笔记本中显示一些 SHAP 图。
import warnings
warnings.filterwarnings("ignore")import pandas as pd
import numpy as npimport matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('default')import seaborn as snsimport xgboost as xgb
from sklearn.metrics import accuracy_score,confusion_matriximport shap
shap.initjs()import os
dp = os.environ.get('pub_data')
建模
我们使用数据探索来指导特征工程。首先,我们从 X 特征矩阵中删除长度和整体重量(第 10-11 行)。我们发现这些与其他特征完美相关。
# import dataset
df = pd.read_csv(dp +
'Abalone dataset/abalone.data',
names=[
"sex",