如何将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
相关产品推荐
相关产品推荐

