Bili-Docs
学业考试学术科研

几行代码发一区?SHAP可解释分析,即插即用,保姆级教程来了

视频讲解了如何利用SHAP方法对机器学习模型进行可解释性分析,并分享了助力发表高分论文的实操教程。

UP主: Lvy-呀 · 时长: 14:50 · 🔗 B站原视频

发布: 2024-06-02 · 收录: 2024-09-15

标签: SHAP · 机器学习 · 论文写作 · Python · 模型解释

开场:SHAP 可解释分析为什么能“几行代码发一区”

Hello 大家好,我是 Navi。最近看论文,看到很多一区的文章都在应用 SHAP 方法:套用一个类似 LightGBM 或 XGBoost 的机器学习方法,或者深度学习方法,然后再用 SHAP 分析训练中的模型特征,把文章命名成“什么什么可解释模型”。

这种套路确实没什么实质创新,主要是把 SHAP 应用在了一个新的领域,打“可解释机器学习”的噱头。但是它们都发在了十几分的文章上。我自己去实践发现,这个方法确实很好用:基本上用到机器学习和深度学习方法的文章,都可以配合这个 SHAP 可解释分析去解释特征,而且可以配很多这种高级的图放在论文里面。

这期视频就给大家讲解一下怎么快速实现并应用这个 SHAP 可解释分析,机器学习小白也可以完全复现一篇类似这样一区的可解释分析,直接画出类似这样的图。这些都是 SHAP 可解释分析的图。

代码结构与数据流:Python 训练,结果回 MATLAB 画图

这是整个实现的代码。为了方便大家看,我把它都放在了一个 .py 文件里面。

前面是导入 Python 的相关包。我这里把一个 MATLAB 的数据导入进来用,也就是把 MATLAB 处理好的数据放到 Python 里做 SHAP 相关性分析。其他部分也是补充的,可以互通。

训练完之后,还可以把结果保存在 MATLAB 里画图。我的话还是比较习惯 MATLAB 去绘图,所以像类似一些 Python 的结果,我都是习惯性地保存到 MATLAB 里再画图。

数据集与任务:波士顿房价预测(回归)

这次用的数据是非常基础的波士顿房价预测数据:用前面的特征去预测房价,是一个典型的回归问题。

导入包之后就要划分数据。我这里直接导用了 MATLAB 工具箱里已经划分好训练集、验证集、测试集的数据,直接读进来。即使是直接读 Excel 再划分数据也比较简单,这里就不讲了。

标准化:Z-score(先划分再标准化)

大家首先要把数据集进行标准化:先划分几个集,然后标准化。

接下来采用 Z-score 标准化:把数据减掉训练集的平均值,再除以训练集的标准差,大概是这样一个标准化形式。后面训练尽量用标准化后的数据,因为标准化在机器学习训练过程中比较有必要,可能会一定程度上提高预测精度。

评价指标:常用回归指标

下面这个评价指标就是常用的回归评价指标,这里不多说。

模型训练:LightGBM 调用与预测

接下来直接看模型训练。Python 里 LightGBM 的调用形式很简单,因为接口都已经做好了。

训练模型这边使用 LightGBM:把训练集的特征和标签数据喂进去。这里有一些超参数,超参数的设置还是会一定程度上影响回归模型效果。

模型训练好之后就可以调用 predict。我们分别把训练集、验证集、测试集的特征输入到训练好的模型,就可以得到这三个集合的预测值。得到之后可以对它们再进行反标准化,后面画图会用到。

数据整理:Array 与 DataFrame 两种形式(为画图准备)

这里构建了一个 DataFrame,把标签放到这个 DataFrame 里面。刚才的数据是 Array 形式,现在是把 Array 变成 DataFrame 的形式。

这两种形式都是为了画图做准备,因为后面不同的图需要不同的数据形式。

构建 SHAP 解释器:得到 SHAP values(矩阵)

接下来用 SHAP 对训练好的模型构建可解释器。

通过解释器输入特征,就可以得到 SHAP values。SHAP values 是一个矩阵,它的维度和输入数据集是一样的维度。

总结散点图(Summary Plot):重要性排序 + 正负影响

下面是绘图设置,然后用 shap.summary_plot 输入 SHAP values,以及 X 特征值,再把特征名字附上去。

可以发现 SHAP values 和特征矩阵的形状、维度都是一样的。SHAP 值反映的是:每个样本、每个特征对输出的影响程度。

所以你会看到每个特征下面有很多点,这些点就是样本。比如训练集有 370 个样本,每个特征上都会显示每个样本对输出的影响。

这张分析图是最常见的一张图,而且配色也很经典。怎么分析这张图:

  • 下面这些特征都是影响房价的特征。
  • 特征重要性是排好序的:从上到下反映重要性,越靠上越重要,越靠下越弱。
  • 粉红色的点表示对预测产生正向影响,蓝色的点表示负向影响,也就是正相关和负相关。

这张图包含了所有样本点的体现,SHAP values 本质上就是一个矩阵值。

绝对重要性柱状图:对 |SHAP| 取均值

下面这个图绘制的是“绝对重要性”。它和上面图的区别是:这里把所有特征的 SHAP 值取绝对值,再取平均值,得到每个特征的绝对影响度。

这个图本质上就是一个柱状图,表示每个特征的重要程度。其实我们也可以自己计算绝对值均值再画柱状图,会更自由,可以自己设计样式、修改颜色。

很多文章喜欢用经典的蓝红配色,但看多了会审美疲劳。改配色的方法也很简单,在最后加一个配色参数就行。不同配色显示效果也都不错,是科研常用的配色。

导出高清图片:解决显示模糊

还有一个关键问题:图在界面里显示可能比较糊,需要用导出函数把图导出为高质量图片,这样图就是高清状态,可以直接放在论文里。

Dependence Plot:两个特征的相互作用关系

以上绘图都是特征与输出影响的关系。下面这个 dependence_plot 函数绘制的是不同特征之间的相互作用关系。

要看哪两个特征之间的关系,就把特征名写进去。特征名要根据你实际数据集的特征名调整,肯定跟示例不一样。

这里示例是看两个特征之间的关系,可以看到画出来呈现一种趋势,比如模型对某个特征可能有显著负面影响,以及某些特征两两之间的关系。

Force Plot:把每个特征贡献叠加展示

接下来讲一个图:SHAP 的 force_plot

它可以把每一个特征的贡献率叠加起来,箭头的长度和颜色表示该特征的影响程度。它也可以直接保存为高质量图片,相当于把特征重要性叠加展示出来。

下面也是类似,只不过把排版调整成不同的形式。

相互作用图与热图:样本层面的影响分布

接下来这个图是相互作用图,主要反映各个变量之间相互关系。

还有一个图是热图。热图画的是什么:

  • 上面可以看到预测值在样本维度上的变化。
  • 下面是影响它的特征值。

这张图是把每个样本的影响特征直接放在图里:红色代表高影响,蓝色代表负面影响,和上面的图逻辑类似。上面的 summary 图是把每个特征的点密集地堆在一起,而热图是均匀排布,所以会形成热力图,整体美观性比较好,也看起来比较“高大上”。

但有个问题:这里训练样本是 370 个,所以画出来效果还可以;如果数据有成千上万,图会太密,不好看。所以建议数据量太大的话,适当挑一些样本再画,会更美观。

右边还会把绝对值算一下,所以这张图涵盖的信息很多。

字体与配色:统一调整风格

接下来给大家看一下怎么设置字体和颜色。可以整体改变图的颜色,配色方式和前面讲的配色一致,也能画出不同的颜色风格。

书籍推荐与福利:MATLAB 科技绘图和数据分析

本期视频和清华大学出版社合作。清华大学出版社带来了他们出版的新书《MATLAB 科技绘图和数据分析》。

这本书详细讲解 MATLAB 在科技图表制作和数据分析中的使用方法和技巧,适合纯小白入门,也适合当作教学课本。

全书分为三部分,共 12 章:

  • 第一部分讲 MATLAB 基础知识:操作环境、文件操作、程序设计,适合小白入门。
  • 第二部分讲数据可视化功能:详细讲 MATLAB 绘图。里面多种绘图都很实用,后期学习和写论文大概率都会用到。
  • 第三部分讲数据处理与分析:插值、拟合、回归分析、优化等入门内容,帮助快速入门数据处理。

这本书还有一个很好的点:提供了详细的视频教程,方便实践。很多同学问我小白怎么学 MATLAB,我一直建议多实践,光看不做肯定学不会。

这本书提供了将近 300 个示例教学视频和上机练习的资源文件,可以帮助大大提高学习效率。每个示例下面基本都配了视频教程二维码,可以直接扫码查看,省去很多查阅时间。

看完这本书,感觉大家可以比较全面地对 MATLAB 做一个基础入门,包括基础知识、可视化、数据分析等,总体还是比较好的。

今天清华大学出版社也带来了福利:包邮送出五本,在评论区参加今天的送出活动。

On this page