You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载Pipeline模型执行SHAP分析时报错,寻求技术解决方案

解决SHAP分析Pipeline模型的报错问题

报错原因

加载的模型是scikit-learn Pipeline对象,shap.Explainer无法直接识别Pipeline作为可调用模型,需要针对Pipeline的结构调整处理方式。

方法一:提取Pipeline内的LGBM分类器+预处理验证数据

这种方法利用SHAP针对树模型优化的逻辑(shap.Explainer对树模型会自动调用TreeExplainer),计算效率更高:

import joblib
import shap

# 加载模型
model = joblib.load("model.pkl")

# 1. 提取Pipeline中的LGBM分类器
lgbm_model = model.named_steps['classifier']

# 2. 用Pipeline的预处理步骤处理验证数据(跳过最后一步分类器)
X_val_processed = model[:-1].transform(X_val)

# 3. 创建SHAP解释器并计算值
explainer = shap.Explainer(lgbm_model)
shap_values = explainer(X_val_processed)

# 绘制瀑布图
shap.plots.waterfall(shap_values[0])

说明:

  • model[:-1]指代Pipeline中除最后一步分类器外的所有预处理步骤(列选择、标准化),直接调用transform就能得到和模型训练时一致的预处理后特征。
  • 提取的LGBM分类器属于树模型,SHAP会自动启用高效的TreeExplainer,计算速度远快于通用解释器。

方法二:直接使用Pipeline的预测函数(适用于无法提取内部模型的场景)

如果不想拆分Pipeline结构,可以使用KernelExplainer,将Pipeline的predict_proba作为可调用函数传入:

import joblib
import shap

# 加载模型
model = joblib.load("model.pkl")

# 用部分验证数据作为背景参考(比如取前100条,减少计算量)
background_data = shap.sample(X_val, 100)

# 创建Kernel解释器,传入模型的概率预测函数和背景数据
explainer = shap.KernelExplainer(model.predict_proba, background_data)
shap_values = explainer.shap_values(X_val)

# 绘制瀑布图(分类任务的SHAP值是二维数组,需指定类别索引,比如类别0)
shap.plots.waterfall(shap_values[0][0])

说明:

  • KernelExplainer是通用解释器,计算速度较慢,更适合小数据集场景。
  • 分类任务中shap_values会生成每个类别的SHAP值数组,需要指定具体的类别索引。

内容的提问来源于stack exchange,提问作者Sara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:55:28