SHAP中使用shap.summary_plot对多分类任务模型中特征重要性绘图
创作时间:
作者:
@小白创作中心
SHAP中使用shap.summary_plot对多分类任务模型中特征重要性绘图
引用
CSDN
1.
https://m.blog.csdn.net/weixin_44652758/article/details/139954696
在机器学习模型解释性工具中,SHAP(SHapley Additive exPlanations)是一个非常重要的库,它可以帮助我们理解模型的预测结果。在多分类任务中,使用SHAP的summary_plot函数来可视化特征重要性是一个常见的需求。然而,这个过程并不总是顺利的,本文将通过一个具体的例子来说明如何正确使用summary_plot函数。
问题背景
假设我们正在使用SVM模型对Iris数据集进行多分类任务。我们希望使用SHAP库来解释模型的预测结果,特别是每个特征对模型输出类别的重要性。以下是一个错误的代码实现:
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import svm
import shap
# 加载数据集(这里使用iris数据集作为例子)
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化SVM模型并进行训练
clf = svm.SVC(kernel='linear', probability=True, random_state=42)
clf.fit(X_train, y_train)
# 初始化SHAP解释器
explainer = shap.Explainer(clf.predict_proba, X_train)
# 计算测试集上每个预测的SHAP值
shap_values = explainer(X_test)
# 使用summary_plot可视化特征重要性
shap.summary_plot(shap_values, X_test, feature_names=iris.feature_names)
错误分析
运行上述代码会报错:
Traceback (most recent call last):
File "D:\Ethan\Projects\fattyLiver\test_shap_iris.py", line 27, in <module>
shap.summary_plot(shap_values, X_test, feature_names=iris.feature_names)
File "D:\Ethan\Projects\fattyLiver\venv\lib\site-packages\shap\plots\_beeswarm.py", line 605, in summary_legacy
feature_names=feature_names[sort_inds],
TypeError: only integer scalar arrays can be converted to a scalar index
错误的原因在于shap_values是一个多维数组,直接传递给summary_plot函数会导致类型转换错误。
正确实现
为了正确地使用summary_plot函数,我们需要将shap_values转换为一个列表,其中每个元素是一个二维数组,表示每个类别的SHAP值。以下是正确的代码实现:
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import svm
import shap
# 加载数据集(这里使用iris数据集作为例子)
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化SVM模型并进行训练
clf = svm.SVC(kernel='linear', probability=True, random_state=42)
clf.fit(X_train, y_train)
# 初始化SHAP解释器
explainer = shap.Explainer(clf.predict_proba, X_train)
# 计算测试集上每个预测的SHAP值
shap_values = explainer(X_test)
# 使用summary_plot可视化特征重要性
list_of_2d_arrays = [shap_values.values[:, :, i] for i in range(3)]
shap.summary_plot(list_of_2d_arrays, X_test, feature_names=iris.feature_names, class_names=iris.target_names)
结果展示
运行上述代码后,我们可以得到如下特征重要性图:
从图中可以看出,不同特征对不同类别的重要性存在差异。例如,花瓣长度(petal length)对类别1和类别2的区分度较高,而花瓣宽度(petal width)对所有类别的区分度都较高。
通过这个例子,我们可以看到正确使用SHAP库进行特征重要性解释的重要性。在处理多分类任务时,需要特别注意SHAP值的维度和类型,以避免出现类型转换错误。
热门推荐
南京夫子庙灯会:春节打卡胜地
秦淮灯会点亮法国赛雷,南京非遗闪耀全球
南京夫子庙大成殿:秦淮灯会的文化盛宴
肩胛骨疼痛康复训练:物理治疗和运动疗法,哪个更适合你?
冬季护肩指南:告别肩胛骨疼痛
肩胛骨疼痛的最新治疗指南
心理压力大,肩膀也跟着遭殃?
血常规检查前注意事项汇总,饮食、喝水方面均有禁忌
羌绣的一针一线,是数千年历史织成的精彩
羌绣的一针一线,都是数千年历史织成的精彩
羌绣特点及在现代服装设计中的应用
羌绣的一针一线,都是数千年历史织成的精彩
甲流高发季,奥司他韦和玛巴洛沙韦哪个更靠谱?
摔得青紫怎样快速消除
女儿回门宴:如何增强家庭凝聚力?
女儿回门宴的正确打开方式:传统与现代的完美融合
安全玻璃选购指南:让你的家更安心
汽车玻璃防碎秘籍,你get了吗?
玻璃易碎,小心别让它“炸”了你的心
利拉鲁肽新突破:胰岛素抵抗治疗新希望
专家推荐:6大饮食调整助你告别胰岛素抵抗
运动+饮食,科学应对胰岛素抵抗!
间歇性禁食:改善胰岛素抵抗的新选择
科学应对胰岛素抵抗:从饮食调整到生活方式改变
提前做好预约,这类旅客可以优先进站乘车!
《诗经》中的神仙祝福语,你get了吗?
十二星座性格大揭秘:总有一个星座让你共鸣
双十一星座购物攻略:十二星座专属购物指南
河南洛阳:靠传统聚“文气”“商气”“人气”
产后饮食调理,这些营养素不可缺!