趋近智
SHAP 值量化了单个特征值对模型预测的贡献。对于特定预测,这些值通过 KernelSHAP 或 TreeSHAP 等技术得出。理解它们的含义,特别是各个特征值如何使模型的输出偏离基线,非常重要。SHAP 可视化提供了这种理解,而力图是呈现这些局部解释的主要工具。
可以将力图看作拔河比赛的视觉表现。一方面,您有基准值。这表示如果模型没有您正在查看的实例的任何特定特征信息时,它会做出的平均预测。它本质上是模型在背景数据集(通常是训练集)上的平均输出。
另一方面是该特定实例的最终预测(输出值)。在这两点之间,特征作为力起作用,使预测变高或变低。
其工作原理如下:
核心思想是基准值与所有单个特征 SHAP 值之和等于该预测的最终输出值。用数学表示为:
模型输出=基准值+∑各特征的 SHAP 值
这种累加属性,继承自 Shapley 值,使得力图容易理解。它们准确地说明了模型如何得出特定预测,从基线开始,并加上或减去每个特征的贡献。
解读力图涉及查看这些组成部分:
设想您已经训练了一个模型来预测房价,并且您想解释它对特定房屋的预测。假设您的数据集中平均预测价格(基准值)为 250k。对于一栋特定的房屋,模型预测为350k。力图可能会显示:
sqft_living = 2000:显著推高价格(大的红色部分,例如 +$80k SHAP 值)。grade = 8:推高价格(中等红色部分,例如 +$40k SHAP 值)。yr_built = 1950:略微拉低价格(小的蓝色部分,例如 -$15k SHAP 值)。zipcode = 98103:极小程度拉低价格(很小的蓝色部分,例如 -$5k SHAP 值)。力图直观地排列这些信息,显示 sqft_living 和 grade 的大额正向贡献如何超过 yr_built 和 zipcode 的小额负向贡献,从而得到高于基准值的最终预测。
虽然原始的 shap 库生成交互式 JavaScript 力图,但我们可以使用其他图表类型表示其核心思想。以下瀑布图说明了其累加性质:
一张瀑布图,说明了 SHAP 力图背后的原理。从基准值(平均预测)开始,正 SHAP 值(红色)会增加预测,而负 SHAP 值(蓝色)会降低预测,从而得出该特定实例的最终预测。
shap 库使生成力图变得简单。假设您已计算出 explainer 和 shap_values(如前几节所述),并且您有特征数据 X,您可以绘制单个实例的解释图(例如索引为 i 的实例):
import shap
# 假设 'explainer' 是一个已拟合的 SHAP 解释器(例如 KernelExplainer, TreeExplainer)
# 假设 'shap_values' 是您数据集的 SHAP 值数组/列表
# 假设 'X' 是您的特征 DataFrame 或 NumPy 数组
# 选择要解释的实例的索引
instance_index = 0
# 加载 JavaScript 可视化库(Jupyter notebook 等环境所需)
shap.initjs()
# 为所选实例生成力图
shap.force_plot(
explainer.expected_value, # 基准值
shap_values[instance_index], # 此实例的 SHAP 值
X.iloc[instance_index] # 此实例的特征值
)
此代码通常会在 Jupyter notebook 等环境中渲染交互式图。该图直观地确认了累加关系:explainer.expected_value + shap_values[instance_index].sum() 应该非常接近模型对 X.iloc[instance_index] 的预测。
力图主要用于局部解释(一次一个预测)。但是,shap 库允许将多个力图堆叠在一起,通常是垂直旋转的。这可以通过同时显示许多样本的解释来提供半全局视图。在许多样本中,始终向同一方向推动预测的特征会变得显而易见。
# 为多个实例生成力图(例如前 100 个)
# 注意:对于大型数据集/图表,这可能需要大量计算
shap.force_plot(
explainer.expected_value,
shap_values[:100], # 前 100 个实例的 SHAP 值
X.iloc[:100] # 前 100 个实例的特征值
)
这种堆叠视图有助于辨识更广泛的模式,同时仍然基于单个实例的解释。
力图提供了一种强大且有理论依据的方法,可以逐个实例地查看模型预测的内部。它们直接显示每个特征的影响,清楚地说明了为何相对于基线做出了特定预测,这对于调试、验证和建立对模型的信任很重要。
这部分内容有帮助吗?
shap Python 库生成和解释 SHAP 力图的官方指南和代码示例。© 2026 ApX Machine Learning用心打造