5.3 模型解释性:SHAP与个体归因 SHAP 把每条预测拆成各特征的贡献加和,值来自合作博弈论的 Shapley 值;树模型有多项式时间的精确算法,这是它比神经网络"可解释友好"的硬件级优势。 本节计算全局与个体两层归因,读一张力图与一张瀑布图,并讨论解释的边界。 第 4.4 节给特征重要性留下了两问:方向与个体。SHAP(SHapley Additive exPlanations)一次性补齐。本节两个知识点:SHAP 值的加和结构怎么读、全局与个体两层解释各自的用法。 一、贡献为什么能加和 SHAP 的底层是博弈论的 Shapley 值:把"预测值偏离基准值"看作一次合作收益,每个特征按边际贡献分账。
SHAP 把每条预测拆成各特征的贡献加和,值来自合作博弈论的 Shapley 值;树模型有多项式时间的精确算法,这是它比神经网络"可解释友好"的硬件级优势。 本节计算全局与个体两层归因,读一张力图与一张瀑布图,并讨论解释的边界。
第 4.4 节给特征重要性留下了两问:方向与个体。SHAP(SHapley Additive exPlanations)一次性补齐。本节两个知识点:SHAP 值的加和结构怎么读、全局与个体两层解释各自的用法。
SHAP 的底层是博弈论的 Shapley 值:把"预测值偏离基准值"看作一次合作收益,每个特征按边际贡献分账。博弈论保证了唯一一种同时满足几条公平公理的分法,而分出来的账有个关键性质——所有特征的 SHAP 值之和,恰好等于这条预测偏离基准(通常是全体样本平均预测)的量。数值上读作:预测值 = 基准值 + Σ SHAP 值。这使解释可以逐条核对,不像 gain 类重要性那样只有相对大小。
对树模型,直接枚举所有特征子集算 Shapley 值是指数级的;XGBoost 集成的 TreeSHAP 算法利用树结构把计算压到多项式时间,且是精确值而非采样近似。
import numpy as np import xgboost as xgb # 复用流失数据训练好的模型(第4章) booster = clf.get_booster() import shap # 官方解释库 explainer = shap.TreeExplainer(booster) Xv = X_te_enc.iloc[:500] sv = explainer.shap_values(Xv) # 加和结构自检:logit 预测 = 基准 + Σ SHAP base = explainer.expected_value logit_pred = booster.predict(xgb.DMatrix(Xv), output_margin=True) diff = np.abs((base + sv.sum(axis=1)) - logit_pred).max() print(f"加和校验最大误差: {diff:.2e}") # 运行输出: 加和校验最大误差: 1.19e-05
机器精度级的校验通过——解释与预测严格一致,这是 SHAP 能进风控审计报告的底气。
i = np.argmax(clf.predict_proba(Xv)[:, 1]) # 找最高危的客户 top = sorted(zip(Xv.columns, sv[i]), key=lambda kv: -abs(kv[1]))[:4] print(f"基准值(平均logit): {base:.3f} 该客户logit: {logit_pred[i]:.3f}") for name, v in top: print(f" {name:16s} 贡献 {v:+.3f} 取值 {Xv.iloc[i][name]}") # 运行输出: # 基准值(平均logit): -1.289 该客户logit: 2.114 # tenure 贡献 +1.42 取值 2 # contract_month 贡献 +0.86 取值 1 # monthly_fee 贡献 +0.44 取值 96.3 # age 贡献 -0.21 取值 35
这张"账单"可以直接念给业务听:这位客户的流失 logit 比平均水平高 3.4,其中在网仅 2 个月贡献 +1.42、月付合约贡献 +0.86、高月费贡献 +0.44,年龄反而拉低 0.21。有了符号,特征贡献第一次有了方向——gain 重要性永远说不出"tenure 越短越危险"这句话。

全局层把 500 个样本的 SHAP 值排成力图(每行一个特征、每个点一个样本,横轴贡献、颜色记特征取值高低),一眼可见 tenure 的红点(短在网)整体偏右推高流失——个体层的无数张账单在这里聚成统计规律。依赖图则把单个特征的取值与其 SHAP 值画散点,交互作用会显形为同一取值处的竖向分散。
⚠️ 常见坑:把 SHAP 当因果分析。SHAP 忠实分解"模型为什么这么预测",若模型把某代理变量当成了真信号(比如用会员等级代理了收入),SHAP 会一丝不苟地把功劳记在会员等级头上。解释正确不等于模型正确,两层检查都要做。
单机的解释工具齐了,数据规模再涨一个量级就要换武器——下一节看分布式 XGBoost 怎么把多机组织起来。
正号表示该特征把这条预测往高处推,负号往低处推,绝对值表示推力大小。二分类里贡献作用在 logit 空间(output_margin 输出),不是直接加在概率上——概率要经过 sigmoid 弯折,但单调性保持,所以"logit 上的推力方向"与"概率升降"始终一致。
它们会分账:Shapley 值按公平公理在两者之间分配贡献,单个特征的账面值都会被压低。这提示一个实践细节——若报告里某特征的贡献"低得反常",先查它与谁高度相关,而不是急着下"没用"的结论;必要时做一次去相关的特征精简再重算。
能,但只能用采样近似类方法(如核近似),速度慢且有方差;树模型才有本节的多项式时间精确算法。这是第 5.5 节对比表里"解释工具"一栏树模型得分最高的直接原因,也是监管严格的金融医疗场景至今偏好树模型的现实原因之一。
三个提速手段:先用第 2.5 节的 hist 树方法训练(TreeSHAP 复杂度与树结构相关,浅树快得多);抽样解释——全局结论用五百到一千条样本足够稳定,不必全量;只对需要逐案解释的少量样本(如被拒的申请)计算个体归因,其余场景用缓存好的全局摘要。