4. 全局SHAP与局部SHAP:全局特征重要性(mean|SHAP|)与局部解释的区别、summary_plot解读

在SHAP解释体系中,全局解释与局部解释服务于不同的分析目标。全局SHAP回答“哪些特征总体上对模型影响最大”,而局部SHAP回答“为什么某个样本被预测为这个值”。理解两者的区别,是构建漂移告警策略的基础——全局漂移监控特征重要性的变化,局部漂移则聚焦于高风险样本的归因偏移。

4.1 核心概念对比

维度 全局SHAP(Global SHAP) 局部SHAP(Local SHAP)
计算对象 整个数据集或代表性样本集 单个样本
输出指标 mean(|SHAP|) 或 mean(SHAP) 每个特征的SHAP值(可正可负)
解释粒度 特征重要性排序 特征对预测值的贡献方向与大小
可视化工具 summary_plot(蜂群图/条形图)、bar_plot waterfall_plot、force_plot、decision_plot
漂移告警用途 监控特征重要性排序是否发生结构性变化 定位异常样本的归因偏移,辅助根因分析
实践要点:在MLOps流水线中,全局SHAP适合作为周期性漂移检测的输入(如每日计算一次mean|SHAP|),而局部SHAP适合作为告警触发后的根因分析工具。两者配合使用,可以形成“先发现漂移,再定位原因”的完整链路。

4.2 全局特征重要性:mean|SHAP| 的数学含义

全局特征重要性通常使用 mean(|SHAP|) 度量,即所有样本上每个特征SHAP值绝对值的平均值:

mean|SHAP|_j = (1/N) * Σ_i |φ_j(i)|

其中 φ_j(i) 是第 i 个样本上特征 j 的SHAP值。该指标具有以下性质:

  • 非负性:绝对值保证了重要性始终为正,便于排序比较。
  • 可加性:所有特征的mean|SHAP|之和等于模型预测值相对于基线平均绝对偏差。
  • 鲁棒性:相比基于置换的特征重要性,mean|SHAP|对特征间的交互效应更稳定。
漂移告警中的应用:当生产环境中某个特征的mean|SHAP|相对于训练基线发生显著变化(如超过3σ或相对变化率>20%),表明该特征对模型决策的影响力发生了结构性偏移,应触发告警。

4.3 summary_plot 解读:蜂群图与条形图

summary_plot 是SHAP最经典的可视化工具,同时呈现全局特征重要性和特征效应方向。它有两种主要形态:

4.3.1 蜂群图(Beeswarm Plot)

蜂群图在纵轴按特征重要性排序,横轴为SHAP值,每个点代表一个样本的特征贡献。颜色表示特征值的高低(红高蓝低)。

SHAP Summary Plot (Beeswarm) 结构示意图 SHAP Summary Plot (Beeswarm) 结构示意 特征A (最高重要性) 特征B 特征C 特征D 特征E (最低重要性) 低SHAP值 SHAP值 (对预测的影响) 高SHAP值 高特征值 低特征值 每个点 = 一个样本的特征贡献

蜂群图解读要点:

  • 纵轴排序:特征按mean|SHAP|降序排列,顶部特征最重要。
  • 横轴分布:点越分散,说明该特征在不同样本上的影响差异越大。
  • 颜色模式:若红色点(高特征值)集中在右侧(正SHAP),说明该特征值越高,预测值越大;反之亦然。
  • 漂移信号:对比训练集与生产集的蜂群图,若某个特征的颜色分布模式发生翻转(如原本红色在右变为红色在左),说明特征效应方向发生了漂移。

4.3.2 条形图(Bar Plot)

条形图是蜂群图的简化版本,仅展示mean|SHAP|的数值大小,不展示分布细节。

SHAP Bar Plot 结构示意图 SHAP Bar Plot (mean|SHAP|) 结构示意 特征A 0.85 特征B 0.62 特征C 0.48 特征D 0.31 特征E 0.15 0.0 mean(|SHAP|) 1.0 条形长度 = 特征对模型输出的平均影响强度,用于全局重要性排序
常见误区:条形图只展示影响强度,不展示影响方向。两个特征可能有相同的mean|SHAP|值,但一个总是正向贡献,另一个总是负向贡献。在漂移检测中,仅监控mean|SHAP|可能遗漏方向性漂移,建议同时监控mean(SHAP)(带符号的平均值)作为补充指标。

4.4 全局SHAP与局部SHAP的漂移告警协作模式

在MLOps实践中,全局SHAP与局部SHAP形成以下协作链路:

  1. 周期性全局检测:每批次数据计算全局mean|SHAP|,与基线对比。若特征重要性排序发生显著变化(如Top-3特征更替),触发一级告警。
  2. 局部根因分析:告警触发后,对漂移批次中的异常样本(如预测置信度下降的样本)计算局部SHAP,生成waterfall图或force图。
  3. 归因模式匹配:将局部SHAP模式与已知的漂移模式库(如“特征X的贡献从正变负”)进行匹配,输出根因建议。
  4. 反馈闭环:确认的漂移模式更新到全局监控规则中,形成持续改进的告警策略。
实战案例:某信贷风控模型在生产环境中发现“收入”特征的mean|SHAP|从0.35骤降至0.12,而“负债率”特征的mean|SHAP|从0.28升至0.51。进一步对局部SHAP分析发现,高收入样本的SHAP值从正贡献变为负贡献,说明模型对收入高但负债率高的群体产生了误判。最终定位为数据分布漂移导致模型决策边界偏移。

4.5 代码示例:计算全局与局部SHAP

import shap
import xgboost as xgb
from sklearn.model_selection import train_test_split

# 训练模型
X, y = shap.datasets.boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = xgb.XGBRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# 创建SHAP解释器
explainer = shap.Explainer(model, X_train)

# 计算全局SHAP(所有测试样本)
shap_values = explainer(X_test)

# 全局特征重要性:mean|SHAP|
global_importance = shap_values.abs.mean(0)
print("全局特征重要性 (mean|SHAP|):")
for name, val in zip(X.columns, global_importance.values):
    print(f"  {name}: {val:.4f}")

# 局部SHAP:第一个样本的解释
local_shap = shap_values[0]
print("\n局部SHAP (第一个样本):")
for name, val in zip(X.columns, local_shap.values):
    direction = "正向" if val > 0 else "负向"
    print(f"  {name}: {val:.4f} ({direction}贡献)")

# 可视化
# shap.summary_plot(shap_values, X_test)  # 蜂群图
# shap.bar_plot(shap_values.abs.mean(0))   # 条形图
# shap.waterfall_plot(shap_values[0])      # 局部瀑布图
性能优化建议:在生产环境中,全局SHAP计算建议使用背景样本子集(通常100-500个代表性样本)而非全量数据,以降低计算开销。局部SHAP则按需计算,仅在告警触发后对可疑样本进行解释。

4.6 本章小结

概念 核心指标 可视化 漂移告警角色
全局SHAP mean|SHAP| summary_plot (蜂群图/条形图) 周期性监控,发现结构性漂移
局部SHAP 单个特征的SHAP值 waterfall_plot, force_plot 根因分析,定位异常归因
协作模式 全局检测 → 局部定位 — 形成告警-分析-反馈闭环