如何在SHAP 0.46.0版本中绘制堆叠柱状图
解决SHAP 0.46.0中
shap.plots.bar()的TypeError及实现堆叠柱状图 错误原因
SHAP 0.40+版本的绘图API做了重大调整,shap.plots.bar()不再接受原始的SHAP值数组,必须传入**shap.Explanation对象**、Cohorts对象或其字典,这就是触发TypeError的核心原因。旧版教程(比如DataCamp的示例)基于旧版SHAP,直接传数组即可,但新版本强制要求结构化的Explanation对象来统一数据格式。
解决步骤
1. 将原始SHAP值包装为Explanation对象
假设你已经有模型、特征数据集X(带列名)和计算好的原始shap_values数组,用shap.Explanation完成包装:
import shap # 示例:针对树模型(也适用于其他模型的SHAP值) # 若未计算SHAP值,先通过解释器生成(以树模型为例) explainer = shap.TreeExplainer(your_model) shap_values = explainer.shap_values(X) # 包装为Explanation对象 shap_exp = shap.Explanation( values=shap_values, feature_names=X.columns, data=X, # 分类模型可添加类别标签,用于图表标注 output_names=your_model.classes_ )
2. 绘制堆叠柱状图
如果是多分类任务,shap_values会是三维数组(样本数×特征数×类别数),此时调用shap.plots.bar()会自动生成堆叠柱状图,展示每个特征在不同类别上的总SHAP值之和:
# 多分类场景自动生成堆叠柱状图 shap.plots.bar(shap_exp)
如果是回归任务,shap.plots.bar()会生成单组柱状图;若要按自定义分组(比如训练/测试集)堆叠,可将不同组的Explanation对象放入字典后传入:
# 示例:按样本分组生成堆叠柱状图 cohort_shap = { "Train": shap_exp_train, "Test": shap_exp_test } shap.plots.bar(cohort_shap)
可选调整
- 用
max_display参数控制展示的特征数量,比如shap.plots.bar(shap_exp, max_display=10) - 确保
feature_names和output_names与数据匹配,避免图表标签混乱
内容的提问来源于stack exchange,提问作者Tung Nguyen
相关产品推荐
相关产品推荐

