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

如何计算LightGBM二分类模型正类概率对应的SHAP值

解决LGBM二分类正类概率的SHAP分析问题

一、确认SHAP值是否对应正类概率

你设置model_output="probability"后,TreeExplainer输出的SHAP值确实是针对正类概率的贡献值:

  • 基准值explainer.expected_value[1]是训练集所有样本的平均正类预测概率
  • 每个样本的正类SHAP值之和加上基准值,等于该样本的正类预测概率,可通过以下代码验证:
# 取第一个样本验证
sample_idx = 0
pred_prob = model.predict_proba(X_train.iloc[sample_idx:sample_idx+1])[0][1]
shap_sum = shap_values[1][sample_idx].sum()
base_value = explainer.expected_value[1]
print(f"预测正类概率:{pred_prob:.4f}")
print(f"基准值+SHAP值之和:{base_value + shap_sum:.4f}")

两者数值会几乎完全一致(浮点精度误差可忽略),以此证明SHAP值对应正类概率的贡献。

二、在force plot、waterfall plot中展示正类概率的SHAP值

问题核心是shap_values是二元组,分别对应负类和正类的SHAP值。你需要提取正类的SHAP值(shap_values[1]),再传入绘图函数:

1. 绘制Force Plot

# 提取正类SHAP值和对应基准值
shap_values_pos = shap_values[1]
base_value_pos = explainer.expected_value[1]

# 绘制单个样本的force plot
shap.force_plot(base_value_pos, shap_values_pos[0], X_train.iloc[0])

# 绘制多样本交互force plot(保存为HTML)
shap_html = shap.force_plot(base_value_pos, shap_values_pos, X_train, show=False)
with open("shap_force_plot.html", "w") as f:
    f.write(shap_html.html)

2. 绘制Waterfall Plot

# 生成单个样本的Explanation对象
expl = shap.Explanation(
    values=shap_values_pos[0],
    base_values=base_value_pos,
    data=X_train.iloc[0],
    feature_names=X_train.columns
)

# 绘制waterfall plot
shap.waterfall_plot(expl)

3. 自定义Summary Plot(仅展示正类)

若想让summary plot只展示正类的SHAP值,可指定class_id参数:

shap.summary_plot(shap_values_pos, X_train)
# 或者绘制特征重要性柱状图
shap.summary_plot(shap_values_pos, X_train, plot_type="bar")

关键说明

  • LGBM二分类模型的shap_values默认返回两个数组,顺序为[负类SHAP值, 正类SHAP值],必须明确提取正类部分才能针对概率做分析
  • 所有单类SHAP绘图函数(如force、waterfall)都需要传入单类的SHAP值和对应的基准值,不能直接传入二元组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:00:25