XGBoost分类器SHAP中expected_value与训练集均值不符的原因解析
理解SHAP的
explainer.expected_value与XGBoost分类器的标签均值差异 一、SHAP的expected_value到底是什么?
explainer.expected_value是SHAP解释的基准预测值,对应模型在「基准输入样本」下的边际输出(对于XGBoost分类器,这个边际输出是logit尺度,即未经过sigmoid变换的原始预测值)。
对于树模型的SHAP Explainer,默认的基准输入是训练数据集的特征均值(或者说特征的全局平均分布),这个值是模型对"拥有平均特征取值的样本"的原始预测结果,而非训练集标签的均值。
从你提供的代码也能验证这一点:
# 每个样本的边际预测值 = expected_value + 该样本所有特征的SHAP值之和 np.isclose(model.predict(X_test, output_margin=True), explainer.expected_value + shap_df.sum(axis=1)) # 返回True
这说明SHAP的分解逻辑是把每个样本的原始预测(logit)拆成基准预测加上各特征的贡献值,这个基准就是expected_value。
二、为什么sigmoid(expected_value)不等于y_train.mean()?
核心原因是这两个值的定义逻辑完全不同:
y_train.mean()是训练集标签的实际均值,代表训练数据中正样本的比例。expit(explainer.expected_value)是模型对「基准输入样本」的预测概率,也就是模型认为一个"平均特征"的样本属于正类的概率。
具体来说,还有两个关键细节:
XGBoost的训练目标不是对齐基准预测与标签均值
XGBoost分类器训练时最小化的是交叉熵损失,模型的所有预测(包括基准预测)都是为了最小化损失,没有强制要求基准预测对应的概率等于训练集标签均值。基准输入是特征均值,不是标签均值的映射
SHAP的基准是特征层面的平均,不是标签层面的平均。模型对"平均特征样本"的预测,和训练集整体的标签分布没有直接绑定关系——比如如果特征和标签是非线性关系,平均特征对应的预测概率自然不会等于标签均值。
内容的提问来源于stack exchange,提问作者Mena
相关产品推荐
相关产品推荐

