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

如何将XGBoost生成的SHAP值转换为SHAP的Explanation对象?

问题描述

我想把XGBoost生成的SHAP值转换成SHAP库的Explanation对象。用SHAP内置方法(比如TreeExplainer)哪怕在子采样数据集上都要跑好几天,但XGBoost原生计算SHAP值只需要几分钟。我想要生成SHAP蜂群图,但蜂群图要求输入Explanation对象。怎么用XGBoost的booster输出构建这个对象?

我试了这段代码:

import shap
booster = model.get_booster()
d_test = xgboost.DMatrix(X_test[0:100], y_test[0:100])
shap_values = booster.predict(d_test, pred_contribs=True)
shap.plots.beeswarm(shap_values)

得到错误:

TypeError: The beeswarm plot requires an `Explanation` object as the `shap_values` argument.

说明:优先用XGBoost原生生成的SHAP值来创建Explanation对象,尽量不用shap.explainer或shap.TreeExplainer,因为它们耗时太久。


解决方案

你可以手动构建shap.Explanation对象,只需把XGBoost返回的SHAP值、对应特征数据、特征名对应好即可。注意XGBoost用pred_contribs=True返回的结果最后一列是偏置项(base value),需要单独提取,剩下的列才是各特征的SHAP值。

具体代码示例:

import xgboost
import shap

# 假设已训练好模型、准备好测试集X_test、y_test
booster = model.get_booster()
sample_X = X_test[:100]
d_test = xgboost.DMatrix(sample_X, y_test[:100])

# 获取XGBoost原生SHAP值(包含最后一列偏置项)
shap_contribs = booster.predict(d_test, pred_contribs=True)

# 分离特征SHAP值和base value
shap_values = shap_contribs[:, :-1]  # 前n列是特征的SHAP贡献
base_value = shap_contribs[0, -1]    # 偏置项,所有样本的base value相同

# 构建Explanation对象
explainer = shap.Explanation(
    values=shap_values,
    base_values=base_value,
    data=sample_X,
    feature_names=sample_X.columns.tolist()  # DataFrame直接取列名,数组需手动指定
)

# 绘制蜂群图
shap.plots.beeswarm(explainer)

关键说明

  • XGBoost返回的SHAP结构:pred_contribs=True输出的数组形状为(样本数, 特征数+1),最后一列是模型的base value(所有样本的平均预测值),必须分离出前特征数列作为特征的SHAP贡献值。
  • base_values参数:可以传入单个值(所有样本共享同一个base value),无需重复生成数组,节省内存。
  • 特征名处理:如果输入数据是numpy数组,需要手动指定feature_names参数;如果是pandas DataFrame,直接取columns.tolist()即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:42:36