来源:大邓和他的Python

SHAP机器学习模型解释库

想象一下,你正试图训练一个机器学习模型来预测广告是否被特定的人点击。在收到关于某人的一些信息后,模型预测某人会不会点击广告。

但是为什么模型会输出这样的预测结果呢?每个特征对预测的贡献有多大?如果您能看到一个图表,显示每个特征对预测的贡献程度,如下所示,不是很好吗?

Shapley值就能起到特征权重测度的作用。

Shapley值是什么?

Shapley值是博弈论中使用的一种方法,它涉及公平地将收益和成本分配给在联盟中工作的行动者。由于每个行动者对联盟的贡献是不同的,Shapley值保证每个行动者根据贡献的多少获得公平的份额。

小案例

Shapley值被广泛地应用于求解群体中每个工人(特征)的贡献问题。要理解Shapley值的作用,让我们想象一下贵公司刚刚做了A/B测试,他们在测试广告策略的不同组合。

每个策略在特定月份的收入是:

  • 无广告:150美元

  • 社交媒体:300美元

  • 谷歌广告:200美元

  • 电子邮件营销:350美元

  • 社交媒体和谷歌广告:320美元

  • 社交媒体和电子邮件营销:400美元

  • 谷歌广告和电子邮件营销:350美元

  • 电子邮件营销,谷歌广告和社交媒体:450美元

使用三则广告与不使用广告的收入相差300美元,每则广告对这一差异有多大的贡献?

我们可以通过计算每一类广告的Shapley值来计算谷歌广告对公司收入的总贡献入手,通过公式可以计算出Google广告的总贡献:

让我们找到Google广告的边际贡献及其权重。

寻找谷歌广告的边际贡献

第一,我们将发现谷歌广告对以下群体的边际贡献:

  • 无广告

  • 谷歌广告+社交媒体

  • 谷歌广告+电子邮件营销

  • 谷歌广告+电子邮件营销+社交媒体

Google广告 对 无广告 的边际贡献是:

谷歌广告 对 谷歌广告&社交媒体组合 的边际贡献是:

谷歌广告 对 谷歌广告&电子邮件营销组合 的边际贡献是:

谷歌广告 对 谷歌广告、电子邮件营销和社交媒体组合 的边际贡献是:

发现权重

为了发现权重,我们将把不同广告策略的组合组织成如下多个层次,每个层次对应于每个组合中广告策略的数量。

然后根据每个层次的边数分配权重,我们看到了这一点:

  • 第一级包含3条边,因此每个边的权重为1/3

  • 第二级包含6条边,因此每条边的权重将为1/6

  • 第三级包含3条边,因此每条边的权重将为1/3

发现Google广告的总贡献

根据前面的权重和边际贡献,我们已经可以找到Google广告的总贡献!

酷!所以谷歌广告在使用3种广告策略与不使用广告的总收入差异中贡献了36.67美元。36.67是Google广告的Shapey值。

重复以上步骤,对于另外两种广告策略,我们可以看出:

  • 电子邮件营销贡献151.67美元

  • 社交媒体贡献116.67美元

  • 谷歌广告贡献36.67美元

他们共同出资300美元,用于使用3种不同类型的广告与不使用广告的区别!挺酷的,不是吗? 既然我们理解了Shapley值,那么让我们看看如何使用它来解释机器学习模型。

SHAP-在Python中解释机器学习模型

SHAP是一个Python库,它使用Shapley值来解释任何机器学习模型的输出。

安装SHAP

!pip3 install shap

训练模型

为了理解SHAP工作原理,我们使用Kaggle平台内的advertising广告数据集。

import pandas as pd df = pd.read_csv("advertising.csv")
df.head()

我们将建立一个机器学习模型, 该模型根据用户个人特质信息来预测其是否点击广告。

我们使用Patsy将DataFrame转换为一组特征和一组目标值:

from patsy import dmatrices
from sklearn.model_selection import train_test_splity, X = dmatrices("clicked_on_ad ~ daily_time_spent_on_site + age + area_income + daily_internet_usage  + male -1",data=df,
)X_frame = pd.DataFrame(data=X, columns=X.design_info.column_names)

把数据分为测试集和训练接

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)

接下来使用XGBoost训练模型,并做预测

import xgboost
model = xgboost.XGBClassifier().fit(X_train, y_train)
y_predicted = model.predict(X_test)

为了查看模型表现,我们使用F1得分

from sklearn.metrics import f1_scoref1 = f1_score(y_test, y_predicted)
f1
0.9619047619047619

太好了!

解释该模型

该模型很好地预测了用户是否点击广告。但它是如何得出这样的预测的? 每个特征对最终预测与平均预测的差异贡献了多少?

注意,这个问题与我们在文章开头论述的问题非常相似。

因此,寻找每个特征的Shapley值可以帮助我们确定它们的贡献。得到特征i的重要性的步骤与之前类似,其中i是特征的索引:

  • 获取所有不包含特征i的子集

  • 找出特征i对这些子集中每个子集的边际贡献

  • 聚合所有边际贡献来计算特征i的贡献

若要使用SHAP查找Shapley值,只需将训练好的模型插入shap.Explainer

import shapexplainer = shap.Explainer(model)
shap_values = explainer(X_frame)
ntree_limit is deprecated, use `iteration_range` or model slicing instead.

SHAP瀑布图

可视化第一个预测的解释:

#第一条记录是未点击
shap.plots.waterfall(shap_values[0])

啊哈!现在我们知道每个特征对第一次预测的贡献。对上图的解释:

  • 蓝色条显示某一特定特征在多大程度上降低了预测的值。

  • 红条显示了一个特定的特征在多大程度上增加了预测值。

  • 负值意味着该人点击广告的概率小于0.5

我们应该期望总贡献等于预测与均值预测的差值。我们来验证一下:

总贡献等于预测与均值预测的差值.png)

酷!他们是平等的。

可视化第二个预测的解释:

#第二条记录也是未点击
shap.plots.waterfall(shap_values[1])

SHAP摘要图

我们可以使用SHAP摘要图,而不是查看每个单独的实例,来可视化这些特性对多个实例的整体影响:

shap.summary_plot(shap_values, X)

SHAP摘要图告诉我们数据集上最重要的特征及其影响范围。

从上面的情节中,我们可以对模型的预测获得一些有趣的见解:

  • 用户的 daily_internet_usage 对该用户是否点击广告的影响最大。

  • 随着daily_time_spent_on_site的增加,用户点击广告的可能性降低。

  • 随着area_income的增加,用户点击广告的可能性降低。

  • 随着age的增长,用户更容易点击广告。

  • 如果用户是male,则该用户点击广告的可能性较小。

SHAP条形图

我们还可以使用SHAP条形图得到全局特征重要性图。

shap.plots.bar(shap_values)

很酷!

结论

恭喜你!您刚刚了解了Shapey值以及如何使用它来解释一个机器学习模型。希望本文将提供您使用Python来解释自己的机器学习模型的基本知识。

下载代码

链接:https://pan.baidu.com/s/1R8i-9F7n8IhqdvXkpYIMCg  密码:iqkt

原文作者: khuyentran

原文链接 https://towardsdatascience.com/shap-explain-any-machine-learning-model-in-python-24207127cad7

---------End---------

顺便给大家推荐下我的微信视频号「Python数据之道」,欢迎扫码关注。

SHAP | 机器学习模型解释库相关推荐

  1. 【机器学习】机器学习模型解释神器:Shapash

    什么是 Shapash 模型可解释性和可理解性一直是许多研究论文和开源项目的关注的重点.并且很多项目中都配备了数据专家和训练有素的专业人员.Shapash 是一个 Python 库,用于描述 AI 模 ...

  2. python 博弈论 库_6个Python库解释机器学习模型并建立信任

    在机器学习模型中建立信任的案例 全球道路上大约有12亿辆汽车.这是一个令人毛骨悚然的问题-您认为实际上有多少驾驶员了解车辆的内部运行情况? 正如您可能已经猜到的,答案只有少数几个人.我们不需要了解驾驶 ...

  3. 【机器学习】SHAP- 机器学习模型解释可视化工具

    SHAP 是机器学习模型解释可视化工具.在此示例中,使用 SHAP 计算使用 Python 和 scikit-learn 的神经网络的特征影响 .对于这个例子,使用 scikit-learn 的 糖尿 ...

  4. Facebook开源模型可解释库Captum,这次改模型有依据了

    作者 | Narine Kokhlikyan, Vivek Miglani, Edward Wang, Orion Reblitz-Richardson 译者 | Rachel 出品 | AI科技大本 ...

  5. 独家 | 在R中使用LIME解释机器学习模型

    作者:PURVAHUILGOL 翻译:陈丹 校对:欧阳锦 本文约3200字,建议阅读15分钟 本文为大家介绍如何在R中使用LIME来解释机器学习模型,并提供了相关代码. 关键词:机器学习模型解释.R语 ...

  6. 【赠书】金融领域可解释机器学习模型与实践

    ‍‍ 今天要给大家介绍的书是<可解释机器学习:模型.方法与实践>,涵盖了可解释机器学习前沿的研究成果及行业成功应用经验. 本书内容 本书分为三部分: 第一部分为背景,阐述黑盒模型存在的问题 ...

  7. 【机器学习】关于机器学习模型可解释(XAI),再分享一招!

    随着时间的推移,学习模型变得越来越复杂,很难直观地分析它们.人们经常听说机器学习模型是"黑匣子",从某种意义上说,它们可以做出很好的预测,但我们无法理解这些预测背后的逻辑.这种说法 ...

  8. R语言机器学习mlr3:模型解释

    获取更多R语言和生信知识,请欢迎关注公众号:医学和生信笔记 医学和生信笔记 公众号主要分享:1.医学小知识.肛肠科小知识:2.R语言和Python相关的数据分析.可视化.机器学习等:3.生物信息学学习 ...

  9. 机器学习模型可解释性进行到底 —— SHAP值理论(一)

    最近在系统性的学习AUTOML一些细节,本篇单纯从实现与解读的角度入手, 因为最近SHAP版本与之前的调用方式有蛮多差异,就从新版本出发,进行解读. 不会过多解读SHAP值理论部分,相关理论可参考: ...

最新文章

  1. Python脚本:聚类小分子数据集
  2. 我们部署个额外域控制器
  3. Zabbix监控web项目
  4. 北理工校友发明文言文“填词大师”,断句、造词都能做,高考文言文满分靠它了...
  5. 如何做流数据分析,Byron Ellis来告诉你...
  6. ORA-01092: ORACLE 例程终止 强行断开连接
  7. linux /proc 详解
  8. 字符串输出为什么第一个没了_「课堂笔记」Python基础语法:变量和输入输出
  9. 服气!蹭热点无敌,麦当劳发布“5G”新品:真香
  10. [20个项目学会BBC micro:bit编程] 15-超声波测距实验
  11. 开课吧:怎样才能做软件架构师?
  12. Java字节码浅析(二)
  13. 火焰之纹章java武器代码_《火焰纹章回声:另一个英雄王》金手指全代码一览 代码大全...
  14. 机械设计基础课程设计【1】
  15. win10操作系统上编译assimp库
  16. Centos安装显卡驱动
  17. ceph 删除 osd
  18. 利用matlab实现pid控制,利用Matlab实现PID控制仿真
  19. java bigdecimal.round_down,java BigDecimal 的 setScale() 方法的 BigDecimal.ROUND_DOWN 舍入模式的BUG,坑...
  20. 不同的国家/地区与语言缩写代码

热门文章

  1. 关于/dev/null 和 /dev/zero文件详解以及误删/dev/null和/dev/zero的解决方法和利用/dev/zero进行磁盘IO测试方法
  2. 纯CSS3口袋妖怪弹跳球js特效
  3. Android(一)使用eclipse开发一个Android拨号器
  4. 深入浅出了解BPM、BPMN、BPMN2.0
  5. 浙江高中地理历史计算机,2018年浙江省新高考录取政策、录取数据深度分析
  6. 当下的力量 读书笔记
  7. Mac版QQ 无法截图处理方法
  8. 贴膜机程序(MCGS触摸屏+4台欧姆龙CP1H+2台雅马哈机械手臂
  9. 注解@Autowired与@Resource的区别
  10. 计算机应用中的过程控制,计算机在过程控制中的应用