SHAP:最受欢迎、最有效的可解释人工智能工具包
在许多情况下,机器学习模型比传统线性模型更受欢迎,因为它们具有更好的预测性能和处理复杂非线性数据的能力。然而,机器学习模型的一个常见问题是它们缺乏可解释性。
例如,集成方法如XGBoost和随机森林将许多个体学习器的结果组合起来生成结果。尽管这通常会带来更好的性能,但它使得难以知道数据集中每个特征对输出的贡献。
为了解决这个问题,可解释人工智能(explainable AI, xAI)被提出并越来越受欢迎。xAI领域旨在解释这些不可解释的模型(所谓的黑匣子模型)如何进行预测,实现最佳的预测准确性和可解释性。这样做的动机在于,许多机器学习的真实应用场景不仅需要良好的预测性能,还要解释生成结果的方式。
例如,在医疗领域,可能会根据模型做出的决策而失去或挽救生命,因此了解决策的驱动因素非常重要。此外,能够识别重要变量对于识别机制或治疗途径也很有帮助。最受欢迎、最有效的xAI技术之一是SHAP。
文章源码及数据,想实战的可以按照如下方式获取
技术交流
独学而无优则孤陋而寡闻,技术要学会交流、分享,不建议闭门造车。
技术交流与答疑、源码获取,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。
方式①、微信搜索公众号:Python学习与数据挖掘,后台回复:资料
方式②、添加微信号:dkl88194,备注:资料
资料1

资料2
我们打造了《数据分析实战案例宝典》,特点:从0到1轻松学习,方法论及原理、代码、案例应有尽有,所有案例都是按照这样的节奏进行表述。

1. 介绍
SHAP概念由Lundberg & Lee于2017年提出,但实际上是基于早在此之前存在的博弈论Shapley值。
简而言之,SHAP值通过计算每个特征的边际贡献来工作,方法是在许多有和没有该特征的模型中查看(每个观察值的)预测,根据每个这些减少特征集模型中的权重计算这种贡献,然后总结所有这些实例的加权贡献。
在这里,简单地说:对于一个观察值而言,SHAP值的绝对值越大,影响预测的作用就越大。因此,对于给定特征的所有观察值的绝对SHAP值的平均值越大,该特征就越重要。
使用SHAP库在Python中实现SHAP值很容易,许多在线教程已经解释了如何实现。然而,我发现所有整合SHAP值到Python代码的指南都存在两个主要缺陷。
第一点是:大多数指南在基本的训练/测试拆分上使用SHAP值,但**不在交叉验证上使用(见图1)**
使用交叉验证可以更好地了解结果的普适性,而基本的训练/测试拆分的结果很容易受到数据划分方式的影响而发生剧烈变化。正如我在最近的“营养研究中的机器学习”(https://doi.org/10.1093/advances/nmac103)文章中所解释的那样,除非你处理的数据集非常庞大,否则交叉验证几乎总是优于训练/测试拆分。

图1. 机器学习中的不同评估程序。
另一个缺点是:我遇到的所有指南都**没有使用多次交叉验证来推导其SHAP值**
虽然交叉验证比简单的训练/测试拆分有很大的改进,但最好每次都使用不同的数据拆分来重复多次。特别是在数据集较小的情况下,结果可能会因数据如何拆分而大为不同。这就是为什么经常建议重复100次交叉验证以对结果有信心的原因。
为了解决这些缺点,我决定编写一些代码来实现它。本文将向您展示如何获取多次重复交叉验证的SHAP值,并结合嵌套交叉验证方案。对于我们的模型数据集,我们将使用波士顿住房数据集,并选择功能强大但不可解释的随机森林算法。
2. SHAP实践
2.1. SHAP值的基本实现
无论何时,当使用各种循环构建代码时,通常最好从最内部的循环开始向外工作。试图从外部开始构建代码,按运行顺序构建代码,容易混淆且在出现问题时更难进行故障排除。
因此,我们从SHAP值的基本实现开始。
我假设您熟悉SHAP的一般用途和其实现代码的外观,因此我不会花太长时间进行说明。
我会在代码中添加注释,因此您可以检查这些注释,如果您仍然不确定,那么请查看介绍中的链接或库的文档。我还会在需要时导入库,而不是在开始时一次性导入所有库,这样有助于理解。

2.2. 将交叉验证与SHAP值相结合
我们经常使用sklearn的cross_val_score或类似方法自动实现交叉验证。
但是这种方法的问题在于所有过程都在后台进行,我们无法访问每个fold中的数据。
当然,如果我们想获得所有数据点的SHAP值,则需要访问每个数据点(请记住,每个数据点在测试集中仅用一次,在训练中使用k-1次)。为了解决这个问题,我们可以将KFold与.split结合使用。

通过循环遍历我们的KFold对象,并使用.split方法,我们可以获取每个折叠的训练和测试索引。
在这里,折叠是一个元组,其中fold[0]是每个折叠的训练索引,fold[1]是测试索引。
现在,我们可以使用此方法从原始数据帧中自己选择训练和测试数据,从而提取所需的信息。
我们通过创建新的循环来完成此操作,获取每个折叠的训练和测试索引,然后像通常一样执行回归和 SHAP 过程。
然后,我们只需在循环外添加一个空列表来跟踪每个样本的 SHAP 值,然后在循环结束时将其添加到列表中。我使用 #-#-# 来表示这些新添加的内容。

现在,我们针对每个样本都有SHAP值,而不仅仅是数据的一个测试分割样本,我们可以使用SHAP库轻松绘制这些值。
我们首先需要更新X的索引,以匹配它们出现在每个折叠的每个测试集中的顺序,否则颜色编码的特征值会全部错误。
请注意,我们在summary_plot函数中重新排序X,以便我们不保存我们对原始X数据帧的更改。

上面,是带交叉验证的SHAP,包括所有数据点,所以比之前的点密集。
从图中可以看出,与仅使用训练/测试拆分时相比,现在有更多的数据点(实际上是全部数据点)。
这样,我们的过程已经得到了改善,因为我们可以利用整个数据集而不仅仅是一部分。
但我们仍然不清楚稳定性。即,如果数据被分割得不同,结果会如何改变。
幸运的是,我们可以在下面编写代码来解决这个问题。
2.3. 重复交叉验证
使用交叉验证可以大大提高工作的鲁棒性,尤其是在数据集较小的情况下。然而,如果我们真的想做好数据科学,交叉验证应该在许多不同的数据拆分上重复执行。
首先,我们现在需要考虑的不仅仅是每个折叠的SHAP值,还需要考虑每个重复和每个折叠的SHAP值,然后将它们合并到一个图表中进行绘制。
在Python中,字典是强大的工具,这就是我们将用来跟踪每个样本在每个折叠中的SHAP值。
首先,我们决定要执行多少次交叉验证重复,并建立一个字典来存储每个重复中每个样本的SHAP值。
这是通过循环遍历数据集中的所有样本并在我们的空字典中为它们创建一个键来实现的,然后在每个样本中创建另一个键来表示交叉验证重复。

接下来,我们在现有代码中添加一些新行,使我们能够重复交叉验证过程CV_repeats次,并将每次重复的SHAP值添加到我们的字典中。
这很容易实现,只需更新代码末尾的一些行,以便我们不再将每个样本的SHAP值列表附加到列表中,而是更新字典。
注:收集每个折叠的测试分数可能也很重要,尽管我们在这里不这样做,因为重点是使用SHAP值,但这可以通过添加另一个字典轻松更新,其中CV重复是键,测试分数是值。
代码看起来像这样,其中 #-#-# 表示对现有代码的更新:

为了可视化,假设我们想要检查索引号为10的样本的第五个交叉验证重复,我们只需写:

其中第一个方括号代表样本编号,第二个代表重复次数。输出是在第五次交叉验证重复后,样本编号为10的X每列的SHAP值。
要查看一个个体所有交叉验证重复的SHAP值,只需在第一个方括号中键入数字即可:

然而,这对我们来说并没有太多用处(除了故障排除目的)。我们真正需要的是绘制一个图表来可视化这些数据。
我们首先需要对每个样本的交叉验证重复进行SHAP值的平均值计算,以便绘制一个值(如果您愿意,您也可以使用中位数或其他统计数据)。取平均值很方便,但可能会隐藏数据内部的可变性,这也是我们需要了解的。因此,虽然我们正在取平均值,但我们还将获得其他统计数据,例如最小值,最大值和标准偏差:

以上代码表示:对于原始数据框中的每个样本索引,从每个 SHAP 值列表(即每个交叉验证重复)中制作数据框。该数据框将每个交叉验证重复作为行,每个 X 变量作为列。我们现在使用相应的函数和使用 axis = 1 以列为单位执行计算,对每列取平均值、标准差、最小值和最大值。然后我们将每个转换为数据框。
现在,我们只需像绘制通常的值一样绘制平均值。我们也不需要重新排序索引,因为我们从字典中取出SHAP值,它与X的顺序相同。

上图是重复交叉验证多次后的平均SHAP值。
由于我们的结果已经经过多次交叉验证的平均化,因此它们比仅执行一次简单的训练/测试拆分更加健壮和可信。
但是,如果您比较之前和之后的图形,并且除了额外的数据点外,几乎没有什么变化,您可能会感到失望。但是不要忘记,我们使用的是一个模型数据集,该数据集非常整洁,具有良好的特性,并且与结果具有强烈的关系。在不那么理想的情况下,像重复交叉验证这样的技术将揭示实际数据在结果和特征重要性方面的不稳定性。
如果我们想要进一步增强我们的结果(当然我们想要),我们可以添加一些图表来了解我们建议的特征重要性的变异性。这很重要,因为每个样本的平均SHAP值可能会掩盖它们在数据不同分割下的变化程度。
为了做到这一点,我们必须将我们的数据帧转换为长格式,之后我们可以使用 seaborn 库来制作一个 catplot。

上图,我们可以看到每个样本的每次CV重复中的范围(最大值-最小值)。理想情况下,我们希望 轴上的值尽可能小,因为这意味着更一致的特征重要性。
我们应该谨记,这种可变性也对绝对特征重要性敏感,即被认为更重要的特征自然会具有更大范围的数据点。我们可以通过对数据进行缩放来部分地解决这个问题。

的图与 的图相似,但现在每个观测值都按每个特征的平均值缩放。
请注意LSTAT和RM这两个最重要的特征看起来有多不同。现在,我们可以更好地反映按特征的整体重要性缩放的可变性,这可能更或不更相关,具体取决于我们的研究问题。
我们可以根据我们收集的其他统计数据,例如标准差,想出类似的情节。
2.4. 嵌套交叉验证
所有这些都很好,但有一件事情缺失了:我们的随机森林是默认模式。虽然它在这个数据集上表现得很好,但在其他情况下可能不是这样。此外,为什么我们不应该尝试最大化我们的结果呢?
我们应该注意不要陷入机器学习示例中似乎很常见的陷阱,即在测试集中也存在的数据上优化模型超参数。通过简单的训练/测试拆分,我们可以轻松避免这种情况。只需在训练数据上优化超参数即可。
但是一旦交叉验证进入方程式,这个概念似乎被忘记了。实际上,人们经常使用交叉验证来优化超参数,然后使用交叉验证对模型进行评分。在这种情况下,发生了数据泄漏,我们的结果将会(即使只是稍微)过于乐观。
嵌套交叉验证是我们的解决方案。它涉及在我们正常的交叉验证方案(这里称为“外循环”)中取出每个训练折叠,并使用训练数据中的另一个交叉验证(称为“内循环”)来优化超参数。这意味着我们在训练数据上优化超参数,然后仍然可以获得有关优化模型在未见数据上表现如何的更少偏差的想法。
这个概念可能有点难以理解,但对于希望了解更多细节的人,我在上面链接的文章中进行了解释。无论如何,代码并不那么困难,阅读代码可能会有助于理解。实际上,我们在上面的过程中已经准备了大部分的代码,只需要进行一些小的调整。让我们看看它的表现。
嵌套交叉验证的主要考虑因素,特别是在我们使用许多重复时,是需要花费很多时间才能运行。因此,我们将保持参数空间较小,并使用随机搜索而不是网格搜索(尽管随机搜索通常在大多数情况下表现良好)。如果您确实想要更彻底地进行搜索,可能需要在HPC上保留一些时间。
无论如何,在我们的初始for循环之外,我们将建立参数空间:

我们随后对原始代码进行以下更改:
-
CV现在将变为cv_outer,因为我们现在有两个交叉验证,我们需要适当地引用每个交叉验证 -
在我们的
for循环中,我们循环遍历训练和测试ID,我们添加内部交叉验证方案cv_inner -
然后,我们使用
RandomizedSearchCV来优化我们的模型在inner_cv上选择我们最好的模型,然后使用最佳模型从测试数据中派生SHAP值(这里的测试数据是外部折叠测试)。
就是这样。为了演示目的,我们将CV_repeats减少到2,因为否则,我们可能要在这里一段时间。在实际情况下,您需要保持足够高的次数以保持稳健的结果,同时也要获得最佳参数,对于这些参数,您可能需要HPC(或耐心)。
请参见下面的代码,其中 #-#-# 表示新添加的内容。

3. 结论
能够解释复杂的AI模型变得越来越重要。
SHAP值是一种很好的方法,但是在较小的数据集中,单次训练/测试拆分的结果并不总是可信的。
通过多次重复(嵌套)交叉验证等程序,您可以增加结果的稳健性,并更好地评估如果基础数据也发生变化,结果可能会如何变化。
相关文章:
SHAP:最受欢迎、最有效的可解释人工智能工具包
在许多情况下,机器学习模型比传统线性模型更受欢迎,因为它们具有更好的预测性能和处理复杂非线性数据的能力。然而,机器学习模型的一个常见问题是它们缺乏可解释性。 例如,集成方法如XGBoost和随机森林将许多个体学习器的结果组合…...
语境化语言表示模型-ELMO、BERT、GPT、XLnet
一.语境化语言表示模型介绍 语境化语言表示模型(Contextualized Language Representation Models)是一类在自然语言处理领域中取得显著成功的模型,其主要特点是能够根据上下文动态地学习词汇和短语的表示。这些模型利用了上下文信息…...
和MATLAB相关的设置断点的快捷键
一个朋友在修改错误的时候,有个操作震惊到我了。 他把迭代次数从1000减小到100,就可以快速仿真完。 废话不多说,直接上快捷键。 F12:设置或者清楚断点。 F5:运行 F10和F11都是步进,但是两者有区别。 …...
实人认证(人像三要素)API:加强用户身份验证
前言 在当今数字化时代,随着互联网应用的广泛普及,用户身份验证的重要性日益凸显。实人认证(人像三要素)API作为一种新型的身份验证方式,凭借其高效、安全和便捷的特性,正在成为加强用户身份验证的强大工具…...
美易官方:一路火到2024!英伟达还在创造历史
一路火到2024!英伟达还在创造历史:两周来市值增逾千亿美元 自今年8月以来,英伟达的股价一直处于快速上涨的轨道上。最近两周,英伟达的市值更是增加了超过1000亿美元,这主要得益于其数据中心业务的持续强劲表现和游戏业…...
6个免费/商用图片素材网站
推荐6个免费可商用图片素材网站,收藏走一波~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 我推荐过很多次的设计素材网站,除了设计类素材,还有很多自媒体可以用到的高清图片、背景图、插画、视频、音频素材等等。网站提供的图…...
Java使用IText生产PDF时,中文标点符号出现在行首的问题处理
Java使用IText生成PDF时,中文标点符号出现在行首的问题处理 使用itext 5进行html转成pdf时,标点符号出现在某一行的开头 但这种情况下显然不符合中文书写的规则,主要问题出在itext中的DefaultSplitCharacter类,该方法主要用来判断…...
npx和npm有什么区别,包管理器yarn的使用方法,node的版本管理工具nvm使用方法
文章目录 一、npx介绍及使用1、npx 是什么2、npx 会把远端的包下载到本地吗?3、npx 执行完成之后, 下载的包是否会被删除?4、npx和npm的区别 二、yarn介绍及使用1、Yarn是什么?2、Yarn的常见场景:3、Yarn常用命令 三、nvm介绍及使…...
【网络技术】【Kali Linux】Wireshark嗅探(九)安全HTTP协议(HTTPS协议)
一、实验目的 本次实验是基于之前的实验:Wireshark嗅探(七)(HTTP协议)进行的。本次实验使用Wireshark流量分析工具进行网络嗅探,旨在初步了解安全的HTTP协议(HTTPS协议)的工作原理。…...
POI-tl 知识整理:整理3 -> 动态生成表格
1 表格行循环 (1)需要渲染的表格的模板 说明:{{goods}} 是个标准的标签,将 {{goods}} 置于循环行的上一行,循环行设置要循环的标签和内容,注意此时的标签应该使用 [] ,以此来区别poi-tl的默认标…...
chatgpt和文心一言哪个更好用
ChatGPT和文心一言都是近年来备受关注的人工智能语言模型。它们在智能回复、语言准确性、知识库丰富度等方面都有着较高的表现。然而,它们各自也有自己的特点和优势。在本文中,我们将从这几个方面对这两个模型进行比较,以帮助您更好地了解它们…...
移动端开发进阶之蓝牙通讯(一)
移动端开发进阶之蓝牙通讯(一) 移动端进阶之蓝牙通讯需要综合考虑蓝牙版本选择、协议栈使用、服务匹配、设备连接、安全性和硬件支持等方面。 一、蓝牙版本选择 根据实际需求和应用场景选择合适的蓝牙版本; 1.0,1M/s。 2.0EDR…...
一个完整的流程表单流转
1.写在前面 一个完整的流程表单审批(起表单-->各环节审批-->回退-->重新审批-->完成),前端由Vue2jsElement UI升级为Vue3tsElement Plus,后端流程框架使用Flowable,项目参考了ruoyi-vue-pro(https://gite…...
2024杭州国际智慧城市,人工智能,安防展览会(杭州智博会)
在智能化浪潮的冲击下,我们的生活与环境正在经历一场深刻的变革。这是一场前所未有的技术革命,它以前所未有的速度和广度,改变着我们的生活方式、工作方式、思维方式和社会结构。在这场变革中,有的人选择激流勇进,拥抱…...
编程笔记 html5cssjs 031 HTML视频
编程笔记 html5&css&js 031 HTML视频 一、<video>: 视频元素二、属性三、事件四、嵌入视频页面五、练习小结 视频应用广泛,当前的互联网应用中,视频越来越重要,比如抖音、快手、腾讯视频等应用。 一、<video>: 视频元素 …...
SpringBoot外部配置文件
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot外部配置文件 📚个人知识库: Leo知识库,欢迎大家访问 1.前言☕…...
99个Python脚本实用实例
题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? #!/usr/bin/python# -*- coding: UTF-8 -*-for i in range(1,5): for j in range(1,5): for k in range(1,5): …...
HarmonyOS 工程目录介绍
工程目录 AppScope:存放应用全局所需要的资源文件 base element:文件夹主要存放公共的字符串、布局文件等资源media:存放全局公共的多媒体资源文件app.json5:应用的全局的配置文件,用于存放应用公共的配置信息 {"…...
门店管理系统驱动智慧零售升级
在当今数字化经济的大潮中,实体门店正在经历一场由内而外的深度变革。门店管理系统以其高效、便捷和全面的功能特性,为实体店提供了高效的运营解决方案。 门店管理系统拜托了传统零售业对本地化软件的依赖,它将复杂的信息技术转化为易于获取…...
Iterator迭代器操作集合元素时,不能用集合删除元素
在使用Iterator迭代器对集合中的元素进行迭代时,如果调用了集合对象的remove()方法删除元素或者调用add()方法添加元素之后,继续使用迭代器遍历元素,会出现异常(java.util.ConcurrentModificationException)。 import java.util.ArrayList; …...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
