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

如何将单个SHAP值转换为对应特征的概率增减量?

将SHAP值从对数几率转换为概率增量(对应force_plot条形的概率贡献)

你已经掌握了将基准期望(对数几率)转换为概率的方法,但单个SHAP值是对数几率空间的特征贡献,无法直接用同样的公式转换为概率增量。要得到force_plot(link='logit')中每个条形对应的概率增减数值,需要通过累积计算特征贡献带来的概率变化,具体步骤如下:

实现代码

import shap
import numpy as np
from scipy.special import expit  # 等价于sigmoid函数

# 假设你已经训练好模型并得到explainer和shap_values
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_train)

# 处理单个样本(以索引1的样本为例)
base_log_odds = explainer.expected_value
sample_shap = shap_values[1, :]
sample_features = X_train.iloc[1, :]

# 1. 计算基准概率(对数几率转换为概率)
base_prob = expit(base_log_odds)

# 2. 按SHAP值绝对值排序(匹配force_plot默认的排序逻辑:影响从大到小)
sorted_indices = np.argsort(np.abs(sample_shap))[::-1]
sorted_shap = sample_shap[sorted_indices]

# 3. 计算累积对数几率及对应概率
cumulative_log_odds = base_log_odds + np.cumsum(sorted_shap)
cumulative_prob = expit(cumulative_log_odds)

# 4. 计算每个特征的概率贡献:当前累积概率 - 前一步累积概率
prob_contributions = np.diff(np.insert(cumulative_prob, 0, base_prob))

关键说明

  • prob_contributions就是force_plot中每个条形对应的概率增减数值:正数代表该特征提升了样本的预测概率,负数代表降低概率,数值大小对应条形长度。
  • 排序步骤是为了和force_plot的展示顺序一致,若不需要匹配顺序,可跳过排序直接计算原始特征顺序的贡献。
  • 不能直接对单个SHAP值用sigmoid转换,因为概率的变化是非线性的,累积计算才能得到和图表完全一致的精确值。

验证方法

所有特征的概率贡献之和,应等于样本最终预测概率与基准概率的差值:

final_prob = expit(base_log_odds + sample_shap.sum())
print(np.isclose(np.sum(prob_contributions), final_prob - base_prob))  # 输出True(浮点误差范围内)

内容的提问来源于stack exchange,提问作者NFeruch - FreePalestine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:25:23