使用SHAP从加载的XGBoost模型绘制瀑布图报错求助
问题原因与解决方法
错误原因
shap.waterfall_plot在新版SHAP中要求传入Explanation对象,你直接传入了原始SHAP值数组,不符合当前API的参数要求。Explanation对象会封装SHAP值、模型预期输出(基础值)、特征数据等必要信息,是瀑布图绘制的必备参数。
解决步骤
- 获取模型基础值:通过
explainer.expected_value获取XGBoost模型的基准预测值(分类模型对应log odds)。 - 封装Explanation对象:用
shap.Explanation整合SHAP值、基础值、输入数据,还可自定义特征名称提升图表可读性。 - 传入Explanation对象调用瀑布图函数。
修改后的完整代码
import xgboost import numpy as np import shap # 加载模型 bst = xgboost.Booster() bst.load_model('./model/xgboost_classifier_model.json') # 准备输入数据,转float32避免精度问题 input_data = np.array([1,1,1,1], dtype=np.float32).reshape(1,-1) # 创建解释器,直接调用返回Explanation对象(新版SHAP推荐写法) explainer = shap.Explainer(bst) shap_expl = explainer(input_data) # 若用旧版代码生成的shap_values数组,手动封装Explanation对象的写法: # shap_values = explainer.shap_values(input_data) # shap_expl = shap.Explanation( # values=shap_values, # base_values=explainer.expected_value, # data=input_data, # feature_names=[f"feature_{i}" for i in range(input_data.shape[1])] # ) # 绘制单样本瀑布图 shap.waterfall_plot(shap_expl[0])
补充说明
- 新版SHAP中直接调用
explainer(input_data)即可返回Explanation对象,无需再调用shap_values()方法,写法更简洁。 - 若特征有具体业务名称,替换
feature_names列表内容即可让瀑布图更易理解。
内容的提问来源于stack exchange,提问作者user1828605
相关产品推荐
相关产品推荐

