机器学习的模型解释

在机器学习和深度学习领域,模型解释是一个重要的问题,尽管复杂的模型如深度神经网络和集成模型,如XGBoost
、LightGBM
在预测性能上表现优异,但它们通常被认为”黑箱”,难以解释其内部决策过程,SHAP (SHapley Additive exPlanations) 是一种解决这一问题的工具,通过分配特征的重要性值来解释模型的输出。
基本概念
SHAP 的核心思想源自合作博弈论中的 Shapley 值,Shapley 值用于公平分配多个参与者在合作中所带来的收益,SHAP 将这一概念引入到机器学习模型解释中,用于计算每个特征对模型预测结果的贡献。
SHAP 的特点
一致性,如果模型的特征贡献增加,那么 SHAP 值也会增加;
局部解释,SHAP 值可以解释单个预测结果,从而提供针对单一数据点的解释;
全局解释,通过对多个数据点的 SHAP 值进行汇总,可以提供模型的全局解释。
SHAP 的计算
- 生成所有可能的特征组合,计算特征在各种组合中的贡献;
- 计算边际贡献,对每个特征,计算其在不同特征组合中的边际贡献;
- 求平均值,对边际贡献进行加权平均,得到特征的 SHAP 值。
SHAP 的应用
特征重要性排序:通过 SHAP 值,可以直观地看到哪些特征对模型预测结果影响最大
解释个体预测:SHAP 值可以解释单个数据点的预测结果,帮助理解模型为何做出某个预测
异常检测:通过分析 SHAP 值,可以发现异常数据点和潜在的问题特征
SHAP 在实践中的使用
SHAP 支持多种机器学习框架,如 XGBoost、LightGBM、sklearn、TensorFlow 等,使用 SHAP 时,通常包括以下步骤:
训练模型:使用数据集训练机器学习模型
计算 SHAP 值:使用 SHAP 库计算每个特征的 SHAP 值
可视化与解释:通过可视化方法展示 SHAP 值,进行模型解释
简单示例
加载所需模块
1 | import pandas as pd |
搭建 LightGBM 模型
1 | plt.rcParams['font.sans-serif'] = 'SimHei' |
将数据集划分为训练集、验证集和测试集,并对其进行标准化处理,然后使用LightGBM
模型进行训练,设置参数以防止过拟合和提高泛化能力,到目前为止就构建了一个LighGBM
模型,对这个预测结果进行一个简单的可视化:
1 | pred_train = model_lgb.predict(X_train) |
将模型预测结果与真实值进行比较并可视化,但这种简单的可视化无法深入解释模型的决策过程。

我们可以借助 SHAP 值进一步分析模型特征的重要性和贡献度。
摘要图 Summary Plot
1 | # 构建 shap 解释器 |

摘要图是 SHAP 常用的一种可视化方法,用于显示特征的重要性和特征值的影响方向,摘要图结合了特征重要性和特征效应图,展示了每个特征的 SHAP 值的分布情况,帮助我们理解每个特征对模型预测的贡献,这张可视化结果可在众多论文当中看见,当然你也可以通过参数cmap
改变配色避免审美疲劳,例如 “viridis”:从黄色到蓝绿色;”Spectral”:从红色到蓝色,适用于有正负影响的特征;”coolwarm”:从冷到暖的颜色图;”RdYlGn”:从红到绿的颜色图;”RdYlBu”:从红到蓝的颜色图;”RdBu”:红蓝双色图;”RdGy”:红灰双色图;”PuOr”:从紫色到橙色的颜色图;”BrBG”:从棕色到蓝绿色的颜色图;”PRGn”:从紫色到绿色的颜色图;”PiYG”:从粉红色到绿色的颜色图。
接下来从不同角度对可视化进行解读:
- 颜色,红色点表示特征值在这个观察模型中对模型预测产生了正面影响;蓝色点则表示该特征值在这个观察中对模型预测产生负面影响;
- 水平轴 (SHAP 值),显示每个特征对预测结果的影响大小,点越远离中心线 (零点),表示该特征对模型输出的影响越大正的 SHAP 值表示正面影响,负的 SHAP 值表示负面影响;
- 垂直轴 (特征排列),图中垂直排列的特征按影响力从上到小进行排序,上方的特征对模型输出的总影响更大,而下方的特征影响较小;
- 特征影响力解释,最上方特征,如 MedInc,显示了大量的正面和负面影响,表明其在不同的观察值对模型预测的结果有很大不同的影响;中部特征,如 AveRooms,也显示出两种颜色的点,但点的分布更集中,影响相对较小;底部特征,如 Population,对模型的影响最小,且大部分影响较为接近于零值,表示这些特征对模型预测的贡献较小。
其中如何去理解每个特征的 SHAP 值这句话 > shap_values 值反应的其实就是每一个样本,每一个特征对输出结果的影响
1 | print("SHAP维度:", shap_values.shape) |
可以看见 shap_values 和测试集(这里做的摘要图是对测试集进行操作)维度是一致的,也就是每一个 SHAP 值实际和原始数据每一个点是一一对应的,当然也可以对所有数据集在一张画布上展示每一个特征的排序:
1 | # 计算训练集和测试集的 SHAP 值 |

这里计算的就不再是每一个点的 SHAP 值,而是计算的每一个特征的重要程度,特征按照影响力从大到小进行排序,如何进行计算的呢?
1 | # 利用测试集进行演示 |
就是把 SHAP_value 样本取绝对值的平均值从而得到每个特征的重要程度。
依赖图 Dependence Plot
1 | shap.dependence_plot('MedInc', shap_values, X_train, interaction_index = 'AveOccup') |

依赖图用于显示一个特征的 SHAP 值与该特征值之间的关系,并可以展示特征之间的交互作用
在这里shap.dependence_plot()
函数的参数解释如下:
1 | MedInc : 这是你想要研究的特征名 |
最后对这个依赖图进行解读:
正相关关系,在这里随着 MedInc 的增加,目标变量 AveOccup 也随之增加
影响的程度,MedInc 的值在 3 到 6 的范围内,SHAP 值变化并不明显,表明,在这个范围内,MedInc 对模型预测的目标变量影响并不大,反之成立
交互效果,通过观察图中的颜色变化,可以了解主特征与交互特征之间的关系以及它们对模型预测的共同影响
力图 Force Plot
1 | # 绘制单个样本的 SHAP 解释 |

力图用于直观地展示单个样本的 SHAP 值及其对模型预测结果的影响,通过力图,可以清晰地看到每个特征对该样本预测值的贡献。
力图解释:
基线值,图中的起点表示模型的基线值 (expected_value) 也就是可视化当中的( base value)
特征贡献:每个特征的贡献通过带颜色的条表示,条的长度表示该特征对最终预测值的影响大小,红色条表示正向贡献,即该特征使预测值增加,蓝色条表示负向贡献,即该特征使预测值减少
预测值:终点表示模型对该样本的最终预测值,这是基线值加上所有特征贡献的总和,在这里为 -0.31
交互作用摘要图 Interaction Summary Plot
1 | # 交互作用摘要图 |

用于展示特征之间交互作用的重要性和影响的一种可视化方法。
交互作用摘要图解释:
特征排序,特征按重要性排序,最重要的特征在图的顶部,每个特征的总重要性值是其与所有其他特征交互作用的重要性值之和
SHAP 交互作用值分布,每个点表示一个样本的交互作用值,交互作用值越大,表示该特征与另一个特征的交互对模型预测的影响越大
颜色表示交互特征,颜色表示与主特征交互的特征,使用颜色渐变来表示不同的特征交互效果
热图 Heatmap
1 | # 创建 shap.Explanation 对象 |

通过热图,可以有效地探索和理解复杂模型的特征重要性和特征之间的相互关系,从而提高模型的解释性和可解释性。
热图解读:左侧 y 轴为重要性特征排名,特征按影响力从大到小进行排序,右侧 y 轴为其可视化,图像中颜色深浅表示 SHAP 值的大小,也就是该特征下值对模型的影响,颜色越深 SHAP 值绝对值越大越影响模型,顶部为模型在这些数值下的预测结果可视化,这里只从测试集中选择了 500 个数据进行可视化,太多的数据会影响运行时间,以及可视化的精美,自行取舍。
完整代码
1 | import shap |
- Title: 机器学习的模型解释
- Author: Xing Abao
- Created at : 2025-04-29 00:07:05
- Updated at : 2025-05-04 12:47:38
- Link: https://bioinformatics.vip/2025/04/29/机器学习的模型解释/
- License: This work is licensed under CC BY-NC-SA 4.0.