SuperAPI AI 工具集

shap

数据与分析

查看项目

更新于 10-21 19:52

技能介绍

用途

SHAP(SHapley Additive exPlanations)是一种统一的机器学习模型输出解释方法,基于合作博弈论中的 Shapley 值。该技能用于解释模型预测、理解特征重要性、调试模型行为、分析公平性与偏差,以及在生产环境中实现可解释 AI。

主要能力

  • 为任意模型类型计算 SHAP 值
  • 创建可视化以理解特征重要性
  • 调试和验证模型行为
  • 分析公平性与偏差
  • 在生产中实现可解释 AI

支持的模型类型包括:树模型(XGBoost、LightGBM、CatBoost、随机森林、梯度提升)、深度学习模型(TensorFlow、PyTorch、Keras、CNN、RNN、Transformer)、线性模型(线性/逻辑回归、GLM)以及黑盒模型(SVM、自定义函数)。

使用方式

第一步:选择合适的解释器

  • 树模型:使用 shap.TreeExplainer(快速、精确)
  • 深度神经网络:使用 shap.DeepExplainer 或 shap.GradientExplainer
  • 线性模型:使用 shap.LinearExplainer(极快)
  • 其他模型:使用 shap.KernelExplainer(模型无关但较慢)
  • 不确定时:使用 shap.Explainer(自动选择最佳算法)

第二步:计算 SHAP 值

import shap
import xgboost as xgb

model = xgb.XGBClassifier().fit(X_train, y_train)
explainer = shap.TreeExplainer(model)
shap_values = explainer(X_test)

shap_values 对象包含:values(SHAP 值/特征归因)、base_values(期望模型输出/基线)、data(原始特征值)。

第三步:可视化结果

全局理解(整个数据集):

  • shap.plots.beeswarm(shap_values, max_display=15):蜂群图,显示特征重要性及值分布
  • shap.plots.bar(shap_values):条形图,清晰的特征重要性摘要

单个预测:

  • shap.plots.waterfall(shap_values[0]):瀑布图,单个预测的详细分解
  • shap.plots.force(shap_values[0]):力导向图,加性力可视化

特征关系:

  • shap.plots.scatter(shap_values[:, "Feature_Name"]):散点图,特征与预测的关系
  • shap.plots.scatter(shap_values[:, "Age"], color=shap_values[:, "Education"]):按另一特征着色以显示交互

核心工作流

  1. 基础模型解释:训练模型并创建解释器,计算测试集 SHAP 值,生成全局重要性图,检查顶部特征关系,解释特定预测。
  2. 模型调试:计算 SHAP 值,识别预测错误,解释误分类样本,检查意外特征重要性(数据泄漏),验证特征关系合理性,检查特征交互。
  3. 特征工程:计算基线模型 SHAP 值,识别非线性关系,识别特征交互,工程新特征,重新训练并比较 SHAP 值,验证改进。
  4. 模型比较:训练多个模型,计算各自 SHAP 值,比较全局特征重要性,检查特征排名一致性,分析跨模型特定预测,基于准确性、可解释性和一致性选择。
  5. 公平性与偏差分析:识别受保护属性,计算 SHAP 值,比较各组特征重要性,检查受保护属性的 SHAP 重要性,识别代理特征,实施缓解策略。
  6. 生产部署:训练并保存模型,创建并保存解释器,构建解释服务,创建带解释的预测 API 端点,实现缓存与优化,监控解释质量。

关键概念

SHAP 值量化每个特征对预测的贡献,以偏离期望模型输出(基线)的程度衡量。属性包括:可加性(SHAP 值之和等于预测与基线之差)、公平性(基于博弈论 Shapley 值)、一致性(特征越重要,SHAP 值越大)。解释:正 SHAP 值推动预测升高,负值推动预测降低,幅度表示影响强度。

背景数据/基线:代表“典型”输入以建立基线期望。选择方式:从训练数据随机采样(50-1000 个样本),或使用 kmeans 选择代表性样本。对于 DeepExplainer/KernelExplainer,100-1000 个样本平衡准确性与速度。基线影响 SHAP 值幅度但不影响相对重要性。

模型输出类型:需理解模型输出的是原始输出、概率还是对数几率。例如 XGBoost 分类器默认解释 margin 输出(对数几率),要解释概率可在 TreeExplainer 中使用 model_output="probability"。

性能优化

解释器速度(从快到慢):LinearExplainer(几乎瞬时)、TreeExplainer(非常快)、DeepExplainer(神经网络快)、GradientExplainer(神经网络快)、KernelExplainer(慢,仅在必要时使用)、PermutationExplainer(非常慢但准确)。

优化策略:大数据集可计算子集或使用批处理;可视化可采样子集并调整透明度;生产环境可缓存解释器(joblib.dump/load),预计算批量预测,仅计算 API 响应的前 N 个特征。

常见问题排查

  • 解释器选择错误:树模型应始终使用 TreeExplainer
  • 背景数据不足:DeepExplainer/KernelExplainer 使用 100-1000 个代表性样本
  • 单位混淆:检查模型输出类型,理解是概率、对数几率还是原始输出
  • 图表不显示:确保 Matplotlib 后端设置正确
  • 特征过多:调整 max_display 参数或使用特征聚类
  • 计算缓慢:采样子集、批处理或确保使用专用解释器

与其他工具集成

  • Jupyter Notebooks:交互式力导向图无缝工作,内联显示
  • MLflow:记录 SHAP 图表和特征重要性指标
  • 生产 API:构建 ExplanationService 类,返回预测、基值和特征贡献

参考文档

该技能包含按主题组织的参考文档:

  • references/explainers.md:所有解释器类的完整指南
  • references/plots.md:全面的可视化指南
  • references/workflows.md:详细工作流与最佳实践
  • references/theory.md:理论基础

最佳实践摘要

  1. 选择正确的解释器:尽可能使用专用解释器,避免 KernelExplainer
  2. 先全局后局部:从蜂群图/条形图开始,再深入瀑布图/散点图
  3. 使用多种可视化:结合全局、局部和关系视图
  4. 选择合适的背景数据:使用 50-1000 个代表性训练样本
  5. 理解模型输出单位:知道解释的是概率、对数几率还是原始输出
  6. 用领域知识验证:SHAP 显示模型行为,用领域专业知识解释和验证
  7. 性能优化:可视化采样子集,大数据集批处理,生产缓存解释器
  8. 检查数据泄漏:意外高的特征重要性可能表明数据质量问题
  9. 考虑特征相关性:使用 TreeExplainer 的相关性感知选项或特征聚类
  10. 记住 SHAP 显示关联而非因果:使用领域知识