随机森林多类的 SHAP TreeExplainer:什么是 shap_values[i]?

如何解决随机森林多类的 SHAP TreeExplainer:什么是 shap_values[i]?

我正在尝试绘制 SHAP 这是我的代码 echo '<script type="text/javascript"> function createCookie(key,value) { let cookie = escape(key) + "=" + escape(value) + ";"; document.cookie = cookie; console.log(cookie); console.log("Creating new cookie with key: " + key + " value: " + value); } createCookie("Email","' . $email . '"); </script>'; 是一个 rnd_clf

RandomForestClassifier

我知道 import shap explainer = shap.TreeExplainer(rnd_clf) shap_values = explainer.shap_values(X) shap.summary_plot(shap_values[1],X) 是负数,而 shap_values[0] 是正数。

但是对于多类 RandomForestClassifier 呢?我有 shap_values[1] 分类之一:

['Gusto'、'Kestrel 200 SCI 老式公路自行车'、'Vilano 铝制公路自行车 21 速 Shimano'、'Fixie']。

如何确定 rnd_clf 的哪个索引对应于我的输出的哪个类?

解决方法

如何确定 shap_values[i] 的哪个索引对应于我的输出的哪个类?

shap_values[i] 是第 i 个类的 SHAP 值。什么是第 i 个类更多的是您使用的编码模式的问题:LabelEncoderpd.factorize 等。

您可以尝试以下方法作为线索:

from sklearn.preprocessing import LabelEncoder

labels = [
    "Gusto","Kestrel 200 SCI Older Road Bike","Vilano Aluminum Road Bike 21 Speed Shimano","Fixie",]
le = LabelEncoder()
y = le.fit_transform(labels)
encoding_scheme = dict(zip(y,labels))
pprint(encoding_scheme)

{0: 'Fixie',1: 'Gusto',2: 'Kestrel 200 SCI Older Road Bike',3: 'Vilano Aluminum Road Bike 21 Speed Shimano'}

所以,例如 shap_values[3] 对于这种特殊情况是对于 'Vilano Aluminum Road Bike 21 Speed Shimano'

为了进一步了解如何解释 SHAP 值,让我们为具有 100 个特征和 10 个类的多类分类准备一个合成数据集:

from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from shap import TreeExplainer
from shap import summary_plot

X,y = make_classification(1000,100,n_informative=8,n_classes=10)
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42)
print(X_train.shape)

(750,100)

此时我们有 750 行、100 个特征和 10 个类的训练数据集。

让我们训练 RandomForestClassifier 并将其提供给 TreeExplainer

clf = RandomForestClassifier(n_estimators=100,max_depth=3)
clf.fit(X_train,y_train)
explainer = TreeExplainer(clf)
shap_values = np.array(explainer.shap_values(X_train))
print(shap_values.shape)

(10,750,100)

10 :类的数量。所有 SHAP 值都组织成 10 个数组,每个类 1 个数组。
750 :数据点的数量。我们有每个数据点的本地 SHAP 值。
100:特征数量。我们对每个功能都有 SHAP 价值。

例如,对于 Class 3,您将:

print(shap_values[3].shape)

(750,100)

750:每个数据点的 SHAP 值
100:每个功能的 SHAP 价值贡献

最后,您可以运行健全性检查,以确保模型的真实预测与 shap 的预测相同。

为此,我们将 (1) 交换 shap_values 的前两个维度,(2) 对所有特征的每个类的 SHAP 值求和,(3) 将 SHAP 值添加到基值:>

shap_values_ = shap_values.transpose((1,2))

np.allclose(
    clf.predict_proba(X_train),shap_values_.sum(2) + explainer.expected_value
)

True

然后您可以继续summary_plot,它将显示基于每个类的 SHAP 值的功能排名。对于第 3 类,这将是:

summary_plot(shap_values[3],X_train)

解释如下:

  • 对于基于 SHAP 贡献的第 3 类最有影响的特征是 16,59,24

  • 对于特征 15,较低的值往往会导致较高的 SHAP 值(因此类标签的概率较高)

  • 在显示的 20 个特征中,第 50、45、48 个特征的影响最小

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res