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

