4. SHAP原理(下):数学推导与四大公理
上一节我们建立了SHAP值“每个特征贡献之和等于预测差值”的直观认知。本节将深入其数学内核:SHAP值唯一满足效率性、对称性、虚拟性、可加性四个公理的解,这正是它区别于LIME、Permutation Importance等方法的根本原因。
4.1 从Shapley值到SHAP值的数学定义
SHAP值源于合作博弈论中的Shapley值。设特征全集为 \(F\),模型 \(f\) 对样本 \(x\) 的预测值为 \(f(x)\),基准预测(所有特征缺失时的期望预测)为 \(\phi_0 = E[f(x)]\)。特征 \(i\) 的SHAP值 \(\phi_i\) 定义为:
φ_i = Σ_{S ⊆ F \ {i}} [ |S|! (|F| - |S| - 1)! / |F|! ] × [ f_x(S ∪ {i}) - f_x(S) ]
其中 \(S\) 是不包含特征 \(i\) 的特征子集,\(f_x(S)\) 表示在子集 \(S\) 条件下模型对 \(x\) 的期望预测。这个公式遍历所有可能的特征组合顺序,计算特征 \(i\) 加入时的边际贡献,再按组合数加权平均。
核心理解:SHAP值不是简单计算“特征存在与不存在”的差值,而是对所有可能的特征加入顺序取平均,从而公平分配贡献。
4.2 四大公理:SHAP值的唯一性基石
Shapley值被证明是唯一同时满足以下四个公理的解。SHAP值继承这些公理,保证了归因的数学严谨性。
| 公理 | 数学表述 | 业务含义 |
|---|---|---|
| 效率性 | \(\sum_{i=1}^{|F|} \phi_i = f(x) - E[f(x)]\) | 所有特征的SHAP值之和等于预测值与基准值的差值,贡献完全分配,无遗漏 |
| 对称性 | 若 \(f_x(S \cup \{i\}) = f_x(S \cup \{j\})\) 对所有 \(S\) 成立,则 \(\phi_i = \phi_j\) | 两个特征对模型影响完全相同时,获得相同贡献值,避免偏好 |
| 虚拟性 | 若 \(f_x(S \cup \{i\}) = f_x(S)\) 对所有 \(S\) 成立,则 \(\phi_i = 0\) | 对预测无影响的特征贡献为零,自动过滤无关变量 |
| 可加性 | 若模型 \(f = f_1 + f_2\),则 \(\phi_i(f) = \phi_i(f_1) + \phi_i(f_2)\) | 多个模型的SHAP值可直接相加,适用于集成模型或复合损失 |
实战启示:可加性公理使得SHAP值天然支持XGBoost、LightGBM等加法模型。对于树模型,每个树的SHAP值独立计算后求和,与模型整体预测一致。
4.3 效率性公理详解
效率性是四个公理中最直观也最重要的约束。它保证了“贡献守恒”:
- 数学形式: \(\phi_0 + \sum_{i=1}^{M} \phi_i = f(x)\),其中 \(\phi_0 = E[f(x)]\)
- 验证方法:对任意样本,将所有特征的SHAP值加上基准值,结果必须等于模型原始预测值
- 与LIME的区别:LIME不保证效率性,其局部线性近似可能产生“贡献总和≠预测差值”的情况
# 效率性验证示例(Python伪代码)
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
# 对第0个样本验证
base_value = explainer.expected_value
prediction = model.predict(X[0:1])[0]
sum_shap = base_value + shap_values[0].sum()
print(f"模型预测: {prediction:.4f}")
print(f"基准值+SHAP和: {sum_shap:.4f}")
print(f"差值: {abs(prediction - sum_shap):.6f}") # 应接近0
4.4 对称性与虚拟性:公平性与稀疏性
对称性确保归因的公平性。当两个特征在所有子集下对预测的边际贡献完全一致时,它们获得相同的SHAP值。这避免了因特征顺序或命名差异导致的偏差。
虚拟性则提供了天然的稀疏性。如果一个特征在任何特征组合下都不改变预测结果,其SHAP值严格为零。这在特征选择中非常有用:
- 虚拟特征(如随机噪声列)的SHAP值应接近0
- 若某个特征的SHAP值绝对值普遍很小,说明其对模型贡献有限
- 可用于自动识别冗余特征,辅助特征工程
注意:虚拟性要求“对所有子集S都不产生影响”才严格为零。实际数据中,特征可能在某些子集下影响很小而非零,此时SHAP值会接近但不等于零。
4.5 可加性公理与模型分解
可加性是SHAP值在工程实践中的强大工具。它允许我们将复杂模型的SHAP值分解为各组成部分的SHAP值之和:
# 可加性示例:XGBoost多模型融合
model_1 = xgb.train(params, dtrain_1, num_boost_round=50)
model_2 = xgb.train(params, dtrain_2, num_boost_round=50)
ensemble_pred = model_1.predict(X) + model_2.predict(X)
# 分别计算SHAP值
shap_1 = shap.TreeExplainer(model_1).shap_values(X)
shap_2 = shap.TreeExplainer(model_2).shap_values(X)
# 可加性:整体SHAP值 = 各部分SHAP值之和
shap_ensemble = shap_1 + shap_2 # 逐元素相加
这一性质在以下场景尤为实用:
- 集成学习:随机森林、XGBoost等集成模型的SHAP值等于各基学习器SHAP值之和
- 多任务学习:共享特征的多输出模型,每个输出的SHAP值独立计算后合并分析
- 模型对比:比较两个模型的SHAP值差异,定位模型行为变化的原因
4.6 四大公理关系总览
4.7 公理违背的后果与对比
理解这四个公理,能帮助我们判断不同归因方法的优劣:
| 归因方法 | 效率性 | 对称性 | 虚拟性 | 可加性 |
|---|---|---|---|---|
| SHAP | ✅ 满足 | ✅ 满足 | ✅ 满足 | ✅ 满足 |
| LIME | ❌ 不保证 | ❌ 不保证 | ❌ 不保证 | ❌ 不保证 |
| Permutation Importance | ❌ 不适用 | ✅ 满足 | ✅ 满足 | ❌ 不适用 |
| Partial Dependence | ❌ 不适用 | ✅ 满足 | ✅ 满足 | ❌ 不适用 |
关键结论:SHAP值是唯一同时满足四个公理的局部归因方法。当业务场景要求“贡献总和必须等于预测差值”(如信用评分卡、定价模型监管合规)时,SHAP是唯一选择。
4.8 本章小结
- SHAP值基于Shapley值,通过遍历所有特征组合顺序计算边际贡献的加权平均
- 效率性保证贡献守恒,所有特征SHAP值之和等于预测与基准的差值
- 对称性确保等价特征获得相同贡献,避免归因偏差
- 虚拟性自动过滤无关特征,贡献严格为零
- 可加性支持模型分解,集成模型和多任务场景下可直接相加
- 四个公理共同保证了SHAP值在数学上的唯一性和公平性,这是其他归因方法无法替代的核心优势