3. SHAP 模型解释类型:Global、Local、Interaction 与可视化
SHAP 基于博弈论中的 Shapley 值,为每个特征分配一个对预测的贡献值。根据分析粒度的不同,SHAP 提供了四种核心解释类型:全局解释、局部解释、交互作用解释,以及对应的可视化工具——依赖图与汇总图。理解这些类型是构建可解释 AI 流水线的基础。
3.1 四种解释类型对比
| 解释类型 | 分析粒度 | 回答的问题 | 典型可视化 |
|---|---|---|---|
| Global(全局) | 整个数据集 | 哪些特征对模型整体预测最重要? | 汇总图(Summary Plot)、条形图 |
| Local(局部) | 单个样本 | 为什么模型对这个样本给出这个预测? | 瀑布图(Waterfall Plot)、力图(Force Plot) |
| Interaction(交互) | 特征对 | 两个特征如何共同影响预测? | 依赖图(Dependence Plot)加颜色编码 |
| Dependence(依赖) | 单特征 + 交互 | 特征值变化时,SHAP 值如何变化? | 依赖散点图(SHAP Dependence Plot) |
3.2 Global 全局解释:特征重要性排序
全局解释衡量每个特征在所有样本上的平均绝对 SHAP 值。值越大,该特征对模型输出的平均影响越强。这是最常用的特征重要性指标,比传统的基于 impurity 或系数的方法更一致且无偏。
import shap
# 假设已训练好模型 model,背景数据 X_background,待解释数据 X_explain
explainer = shap.TreeExplainer(model, X_background)
shap_values = explainer.shap_values(X_explain)
# 全局特征重要性:平均 |SHAP 值|
global_importance = np.abs(shap_values).mean(axis=0)
feature_names = X_explain.columns
importance_df = pd.DataFrame({
'feature': feature_names,
'importance': global_importance
}).sort_values('importance', ascending=False)
print(importance_df.head(10))
3.3 Local 局部解释:单样本归因
局部解释将单个预测值分解为每个特征的贡献。基础值(Expected Value)是背景数据上的平均预测,每个特征的 SHAP 值表示该特征将预测从基础值推高或拉低的幅度。所有特征贡献之和加上基础值等于模型输出。
# 对第 0 个样本进行局部解释
shap.waterfall_plot(shap.Explanation(
values=shap_values[0],
base_values=explainer.expected_value,
data=X_explain.iloc[0],
feature_names=feature_names
))
瀑布图从底部的基础值开始,每个特征依次叠加其 SHAP 值(红色为正向推动,蓝色为负向拉动),最终到达顶部的模型预测值。这是向业务方解释单个决策最直观的方式。
3.4 Interaction 交互作用解释
当两个特征共同作用时,它们对预测的影响可能大于各自独立贡献之和。SHAP 交互值通过计算 Shapley 交互指数来量化这种协同效应。交互值矩阵的对角线是主效应,非对角线是交互效应。
# 计算交互作用 SHAP 值
shap_interaction = explainer.shap_interaction_values(X_explain)
# 查看特征 i 和特征 j 的交互值
i, j = 0, 1
interaction_effect = shap_interaction[:, i, j]
print(f"特征 {feature_names[i]} 与 {feature_names[j]} 的平均交互 SHAP 值: {interaction_effect.mean():.4f}")
3.5 依赖图与汇总图
依赖图和汇总图是 SHAP 最强大的可视化工具,分别用于探索特征效应模式和全局特征分布。
3.5.1 汇总图(Summary Plot)
汇总图结合了特征重要性和效应方向。每个点代表一个样本的一个特征,横轴是 SHAP 值,纵轴按特征重要性排序,颜色表示特征值的高低(红高蓝低)。
shap.summary_plot(shap_values, X_explain, feature_names=feature_names)
3.5.2 依赖图(Dependence Plot)
依赖图展示单个特征的 SHAP 值随该特征值的变化趋势。如果存在交互作用,可以通过第二个特征的颜色编码来揭示交互效应。
# 绘制特征 'age' 的依赖图,用 'income' 作为交互颜色
shap.dependence_plot('age', shap_values, X_explain,
interaction_index='income')
当依赖图中出现明显的垂直色带分离或非线性模式时,表明该特征与其他特征存在交互作用。
3.6 四种解释类型的工程选择策略
在实际项目中,应根据阶段和目标选择合适的解释类型:
- 模型开发阶段: 使用 Global 解释进行特征筛选和模型调试,识别冗余或噪声特征。
- 业务决策阶段: 使用 Local 解释对每个预测结果提供归因说明,满足监管合规要求。
- 特征工程阶段: 使用 Interaction 解释发现特征间的协同效应,构造交叉特征。
- 模型验证阶段: 使用 Dependence 图检查特征效应是否符合业务常识(如单调性、阈值效应)。
3.7 小结:选择正确的解释类型
SHAP 的四种解释类型并非互斥,而是互补的。在实际工程中,建议按以下优先级组合使用:
- 先 Global:用汇总图快速了解模型整体行为,识别 Top-K 重要特征。
- 再 Local:对异常样本、边界样本或高价值样本进行瀑布图分析。
- 后 Interaction:对 Top 特征两两计算交互 SHAP 值,发现潜在交叉特征。
- 最后 Dependence:验证关键特征的效应是否符合业务预期,检测数据漂移。
shap_values JSON 对象,下游消费者可以根据需要聚合为 Global 视图或展示 Local 视图。