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值,每个点代表一个样本的特征贡献。颜色表示特征值的高低(红高蓝低)。
蜂群图解读要点:
- 纵轴排序:特征按mean|SHAP|降序排列,顶部特征最重要。
- 横轴分布:点越分散,说明该特征在不同样本上的影响差异越大。
- 颜色模式:若红色点(高特征值)集中在右侧(正SHAP),说明该特征值越高,预测值越大;反之亦然。
- 漂移信号:对比训练集与生产集的蜂群图,若某个特征的颜色分布模式发生翻转(如原本红色在右变为红色在左),说明特征效应方向发生了漂移。
4.3.2 条形图(Bar Plot)
条形图是蜂群图的简化版本,仅展示mean|SHAP|的数值大小,不展示分布细节。
常见误区:条形图只展示影响强度,不展示影响方向。两个特征可能有相同的mean|SHAP|值,但一个总是正向贡献,另一个总是负向贡献。在漂移检测中,仅监控mean|SHAP|可能遗漏方向性漂移,建议同时监控mean(SHAP)(带符号的平均值)作为补充指标。
4.4 全局SHAP与局部SHAP的漂移告警协作模式
在MLOps实践中,全局SHAP与局部SHAP形成以下协作链路:
- 周期性全局检测:每批次数据计算全局mean|SHAP|,与基线对比。若特征重要性排序发生显著变化(如Top-3特征更替),触发一级告警。
- 局部根因分析:告警触发后,对漂移批次中的异常样本(如预测置信度下降的样本)计算局部SHAP,生成waterfall图或force图。
- 归因模式匹配:将局部SHAP模式与已知的漂移模式库(如“特征X的贡献从正变负”)进行匹配,输出根因建议。
- 反馈闭环:确认的漂移模式更新到全局监控规则中,形成持续改进的告警策略。
实战案例:某信贷风控模型在生产环境中发现“收入”特征的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 | 根因分析,定位异常归因 |
| 协作模式 | 全局检测 → 局部定位 | — | 形成告警-分析-反馈闭环 |