原文:
www.kdnuggets.com/2022/11/shap-explain-machine-learning-model-python.html
1. Google 网络安全证书 - 快速进入网络安全职业道路。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织进行 IT 工作
假设你正在训练一个机器学习模型,预测某个人是否会点击广告。在接收到有关某个人的一些信息后,模型预测该人不会点击广告。
图片由作者提供
但为什么模型会有这样的预测?每个特征对预测的贡献有多大?如果能看到一个图示,展示每个特征对预测的贡献情况,会不会很不错呢?
图片由作者提供
这时 Shapley 值就派上用场了。
Shapley 值是一种游戏理论方法,涉及在联盟中公平地分配收益和成本。
由于每个参与者对联盟的贡献不同,Shapley 值确保每个参与者根据他们的贡献获得公平的份额。
图片由作者提供
Shapley 值用于解决各种问题,涉及对每个工作者/特征在一个小组中的贡献进行质疑。为了理解 Shapley 值如何工作,假设你的公司刚刚进行了 A/B 测试,测试了不同的广告策略组合。
每种策略在特定月份的收入如下:
-
无广告:$150
-
社交媒体:$300
-
谷歌广告:$200
-
邮件营销:$350
-
社交媒体和谷歌广告 $320
-
社交媒体和邮件营销:$400
-
谷歌广告和邮件营销:$350
-
邮件营销、谷歌广告和社交媒体:$450
图片由作者提供
使用三种广告与不使用广告之间的收入差为 $300。每种广告对这一差异的贡献有多少?
图片由作者提供
我们可以通过计算每种广告类型的 Shapley 值来找出结果。这篇文章提供了一种出色的计算 Shap 值的方法。我将在这里总结。
我们首先计算 Google 广告对公司收入的总贡献。Google 广告的总贡献可以通过以下公式计算:
图片由作者提供
让我们找出 Google 广告的边际贡献及其权重。
首先,我们将找到 Google 广告对以下组合的边际贡献:
-
无广告
-
Google 广告 + 社交媒体
-
Google 广告 + 邮件营销
-
Google 广告 + 邮件营销 + 社交媒体
图片由作者提供
Google 广告对无广告的边际贡献是:
图片由作者提供
Google 广告对 Google 广告和社交媒体组合的边际贡献是:
图片由作者提供
Google 广告对 Google 广告和邮件营销组合的边际贡献是:
图片由作者提供
Google 广告对 Google 广告、邮件营销和社交媒体组合的边际贡献是:
图片由作者提供
为了找到权重,我们将不同广告策略的组合组织成如下多个层级。每个层级对应每个组合中的广告策略数量。
然后我们将根据每个层级中的边数分配权重。我们看到:
-
第一层包含3 条边,所以每条边的权重将是1/3
-
第二层包含6 条边,所以每条边的权重将是1/6
-
第三层包含3 条边,所以每条边的权重将是1/3
图片由作者提供
现在我们准备好根据之前找到的权重和边际贡献来找出 Google 广告的总贡献!
图片由作者提供
图片由作者提供
太棒了!所以 Google 广告对使用三种广告策略和不使用广告之间的总收入差异贡献了 $36.67。36.67 是 Google 广告的 Shapley 值。
图片由作者提供
对另外两种广告策略重复上述步骤,我们可以看到:
-
电子邮件营销贡献了 $151.67
-
社交媒体贡献了 $111.67
-
Google 广告贡献了 $36.67
图片由作者提供
它们总共贡献了 $300,来说明使用三种不同广告类型和不使用广告之间的差异!很酷,对吧?
现在我们了解了 Shapley 值,让我们看看如何使用它来解释机器学习模型。
SHAP 是一个使用 Shapley 值来解释任何机器学习模型输出的 Python 库。
要安装 SHAP,请输入:
pip install shap
为了理解 SHAP 的工作原理,我们将使用一个 广告数据集 进行实验:
我们将构建一个机器学习模型来预测用户是否点击了广告,基于关于该用户的一些信息。
我们将使用 Patsy 将 DataFrame 转换为特征数组和目标值数组:
将数据分成训练集和测试集:
接下来,我们将使用 XGBoost 构建一个模型并进行预测:
为了查看模型的表现,我们将使用 F1 分数:
0.9619047619047619
非常好!
模型在预测用户是否点击了广告方面表现良好。但它是如何得出这些预测的? 每个特征对最终预测和平均预测之间的差异贡献了多少?
请注意,这个问题与我们在文章开头讨论的问题非常相似。
这就是为什么找出每个特征的 Shapley 值可以帮助我们确定它们的贡献。获得特征 i 重要性的步骤,与之前类似,其中 i 是特征的索引。
-
获取所有不包含特征 i 的子集
-
找出特征 i 对每个子集的边际贡献
-
聚合所有边际贡献以计算特征 i 的贡献
要使用 SHAP 找到 Shapley 值,只需将训练好的模型插入到 shap.Explainer
中:
可视化第一次预测的解释:
图片由作者提供
哦!现在我们知道了每个特征对第一次预测的贡献。以上图表的解释如下:
图片由作者提供
-
蓝色条形图显示了某个特征降低预测值的程度。
-
红色条形图显示了某一特征对预测值的影响程度。
-
负值表示点击广告的概率小于 0.5
对于这些子集,SHAP 不会移除某个特征再重新训练模型,而是将该特征替换为该特征的平均值,然后生成预测。
我们应当期望总贡献等于预测与均值预测之间的差值。让我们来检查一下:
图片由作者提供
太棒了!它们是相等的。
可视化第二次预测的解释:
图片由作者提供
我们可以使用 SHAP 总结图可视化这些特征在多个实例中的整体影响,而不是查看每个个体实例。
图片由作者提供
SHAP 总结图告诉我们数据集中最重要的特征及其影响范围。
从上图中,我们可以获得一些关于模型预测的有趣见解:
-
用户的每日互联网使用对是否点击广告有最强的影响。
-
随着每日互联网使用的增加,用户不太可能点击广告**。
-
随着每日网站使用时间的增加,用户不太可能点击广告**。**
-
随着区域收入的增加,用户不太可能点击广告**。**
-
随着年龄增加,用户更可能点击广告**。**
-
如果用户是男性,那么该用户不太可能点击广告**。**
我们还可以使用 SHAP 条形图获取全局特征重要性图。
图片由作者提供
我们可以使用 SHAP 依赖散点图观察单个特征对所有模型预测的影响。
每日互联网使用特征的散点图:
图片由作者提供
从上图中,我们可以看到,随着每日互联网使用时间的增加,SHAP 值下降。这验证了我们在之前图中看到的情况。
我们还可以通过在同一图中添加 color=shap_values
来观察每日互联网使用特征与其他特征之间的交互。
散点图将尝试挑选出与每日互联网使用最强交互的特征列,即每日网站使用时间。
作者提供的图片
酷!从上面的图表中,我们可以看到,使用互联网每天 150 分钟且每天在网站上花费时间较少的人更有可能点击广告。
让我们看看其他特征的散点图:
作者提供的图片
作者提供的图片
作者提供的图片
作者提供的图片
你还可以通过 SHAP 交互值汇总图观察特征之间的交互矩阵。在这个图中,主要效应位于对角线上,而交互效应则位于对角线之外。
作者提供的图片
非常酷!
恭喜!你刚刚学习了 Shapey 值以及如何使用它来解释机器学习模型。希望这篇文章能为你提供必要的知识,以便用 Python 解释你自己的机器学习模型。
我建议查看SHAP 的文档,以了解 SHAP 的其他应用。
Mazzanti, S. (2021 年 4 月 21 日)。SHAP 以我希望有人向我解释的方式进行了说明。Medium。于 2021 年 9 月 23 日获取,来源:towardsdatascience.com/shap-explained-the-way-i-wish-someone-explained-it-to-me-ab81cc69ef30.
Khuyen Tran 是一位高产的数据科学作家,撰写了一系列令人印象深刻的有用数据科学主题以及代码和文章。Khuyen 目前正在寻找 Bay Area 的机器学习工程师角色、数据科学家角色或开发者推广者角色,预计从 2022 年 5 月开始,如果你在寻找具备她技能的人才,请联系她。
原文。经许可转载。