如何理解二元分类问题的 Shapley 值?

How to understand Shapley value for binary classification problem?

我对 shapley python 包还很陌生。我想知道我应该如何解释二元分类问题的 shapley 值?这是我到目前为止所做的。 首先,我使用 lightGBM 模型来拟合我的数据。像

import shap
import lightgbm as lgb

params = {'object':'binary, 
                       ...}
gbm = lgb.train(params, lgb_train, num_boost_round=300)
e = shap.TreeExplainer(gbm)
shap_values = e.shap_values(X)
shap.summary_plot(shap_values[0][:, interested_feature], X[interested_feature])

因为是二进制class化问题。 shap_values 包含两部分。我假设一个是 class 0,另一个是 class 1。如果我想知道一个特征的贡献。我必须绘制如下两个数字。

对于class 0

对于class 1

但是我应该怎样才能有更好的可视化呢?结果无法帮助我理解“cold_days 会增加输出变为 class 1 还是变为 class 0 的概率?”

对于相同的数据集,如果我使用 ANN,输出就是这样的。我认为 shapley 结果清楚地告诉我 'the cold_days' 会积极增加结果成为 class 1 的概率。

我觉得 LightGBM 输出有问题,但我不确定如何修复它。如何获得类似于ANN模型的更清晰的可视化效果?

#编辑

我怀疑我错误地使用 lightGBM 以某种方式得到了奇怪的结果。这里是原代码

import lightgbm as lgb
import shap

lgb_train = lgb.Dataset(x_train, y_train, free_raw_data=False)
lgb_eval = lgb.Dataset(x_val, y_val, free_raw_data=False)
params = {
'boosting_type': 'gbdt',
'objective': 'binary',
'metric': 'binary_logloss',
'num_leaves': 70,
'learning_rate': 0.005,
'feature_fraction': 0.7,
'bagging_fraction': 0.7,
'bagging_freq': 10,
'verbose': 0,
'min_data_in_leaf': 30,
'max_bin': 128,
'max_depth': 12,
'early_stopping_round': 20,
'min_split_gain': 0.096,
'min_child_weight': 6,
}

gbm = lgb.train(params,
            lgb_train,
            num_boost_round=300,
            valid_sets=lgb_eval,
            )
e = shap.TreeExplainer(gbm)
shap_values = e.shap_values(X)
shap.summary_plot(shap_values[0][:, interested_feature], X[interested_feature])

让我们 运行 LGBMClassifier 研究乳腺癌数据集:

from sklearn.datasets import load_breast_cancer
from lightgbm import LGBMClassifier
from shap import TreeExplainer, summary_plot
X, y = load_breast_cancer(return_X_y=True, as_frame=True)
model = LGBMClassifier().fit(X,y)

exp = TreeExplainer(model)
sv = exp.shap_values(X)
summary_plot(sv[1], X, max_display=3)

summary_plot(sv[0], X, max_display=3)

你将从这个练习中得到什么:

  1. classes 0 和 1 的 SHAP 值是对称的。为什么?因为如果一个特征对 class 1 有一定的贡献,它同时会降低相同数量的 class 0 的概率。所以一般来说,对于二进制 class 化,查看 sv[1] 可能就足够了。

  2. worst area 的低值有助于 class 1,反之亦然。这种关系不是严格线性的,特别是对于 class 0,这需要用非线性模型(树、NN 等)对这种关系进行建模

  3. 这同样适用于其他描绘的特征。

希望对您有所帮助。

PS

我猜你的第二个图来自一个预测单个 class 概率的模型,比如 1,但如果不完整地查看你的代码就很难判断。