3. SHAP 模型解释类型:Global、Local、Interaction 与可视化

SHAP 基于博弈论中的 Shapley 值,为每个特征分配一个对预测的贡献值。根据分析粒度的不同,SHAP 提供了四种核心解释类型:全局解释、局部解释、交互作用解释,以及对应的可视化工具——依赖图与汇总图。理解这些类型是构建可解释 AI 流水线的基础。

核心概念速览: SHAP 值满足局部准确性(Local Accuracy)、缺失性(Missingness)和一致性(Consistency)三个公理,确保解释的数学严谨性。

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))
工程注意: 对于大规模数据,计算所有样本的 SHAP 值可能较慢。通常使用 100~500 个背景样本(K-means 摘要)来加速,同时保持解释质量。

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}")
性能警告: 计算交互 SHAP 值的复杂度为 O(M²),其中 M 是特征数。当特征超过 20 个时,建议只对 Top-K 重要特征计算交互,或使用近似方法。

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')

当依赖图中出现明显的垂直色带分离或非线性模式时,表明该特征与其他特征存在交互作用。

SHAP 模型解释类型全景架构 SHAP 解释引擎 Global 全局解释 Local 局部解释 Interaction 交互 Dependence 依赖 汇总图 / 条形图 瀑布图 / 力图 交互依赖散点图 SHAP 依赖图 应用场景映射 Global → 特征筛选、模型审计 | Local → 单样本决策解释、风控拒贷原因 | Interaction → 特征工程发现 | Dependence → 单调性验证 输入:模型 + 特征数据 → 输出:可解释性报告

3.6 四种解释类型的工程选择策略

在实际项目中,应根据阶段和目标选择合适的解释类型:

  • 模型开发阶段: 使用 Global 解释进行特征筛选和模型调试,识别冗余或噪声特征。
  • 业务决策阶段: 使用 Local 解释对每个预测结果提供归因说明,满足监管合规要求。
  • 特征工程阶段: 使用 Interaction 解释发现特征间的协同效应,构造交叉特征。
  • 模型验证阶段: 使用 Dependence 图检查特征效应是否符合业务常识(如单调性、阈值效应)。
最佳实践: 在流式评分场景中,建议对每个批次的样本计算一次 Global 解释(用于监控特征重要性漂移),同时对每个被拒绝的样本计算 Local 解释(用于生成拒绝原因码)。Interaction 解释可离线定期运行,用于特征迭代。
依赖图 vs 汇总图:功能与结构对比 汇总图 (Summary Plot) 纵轴:特征(按重要性排序) 横轴:SHAP 值 | 颜色:特征值高低 用途:全局特征重要性 + 效应方向 依赖图 (Dependence Plot) 横轴:特征值 | 纵轴:SHAP 值 颜色:交互特征值(可选) 用途:特征效应模式 + 交互检测

3.7 小结:选择正确的解释类型

SHAP 的四种解释类型并非互斥,而是互补的。在实际工程中,建议按以下优先级组合使用:

  1. 先 Global:用汇总图快速了解模型整体行为,识别 Top-K 重要特征。
  2. 再 Local:对异常样本、边界样本或高价值样本进行瀑布图分析。
  3. 后 Interaction:对 Top 特征两两计算交互 SHAP 值,发现潜在交叉特征。
  4. 最后 Dependence:验证关键特征的效应是否符合业务预期,检测数据漂移。
流式评分集成提示: 在 Kafka 流式架构中,可以将 SHAP 解释结果作为附加字段写入输出 Topic。例如,每条预测记录附带一个 shap_values JSON 对象,下游消费者可以根据需要聚合为 Global 视图或展示 Local 视图。