【问题标题】:How to understand Shapley value for binary classification problem?如何理解二元分类问题的 Shapley 值?
【发布时间】:2021-05-07 03:09:53
【问题描述】:

我对 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])

因为它是一个二分类问题。 shap_values 包含两个部分。我假设一个用于 0 类,另一个用于 1 类。如果我想知道一个功能的贡献。我必须绘制两个如下图。

0 级

对于第 1 类

但我应该如何获得更好的可视化效果?结果无法帮助我理解“cold_days 是否增加了输出成为 1 类或成为 0 类的概率?”

使用相同的数据集,如果我使用 ANN,输出是这样的。我认为 shapley 结果清楚地告诉我,“cold_days”会积极增加结果成为 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])

【问题讨论】:

    标签: python lightgbm shap


    【解决方案1】:

    让我们在乳腺癌数据集上运行 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. 0 类和 1 类的 SHAP 值是对称的。为什么?因为如果一个特征对第 1 类有一定的贡献,它同时会减少相同数量的第 0 类的概率。所以一般来说,对于二元分类,查看sv[1] 可能就足够了。

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

    3. 这同样适用于其他描绘的功能。

    希望这会有所帮助。

    PS

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

    【讨论】:

    • 谢谢!我在想也许我没有使用正确的 lightgbm 训练过程。否则我不知道为什么 SHAP 的结果会有这么大的偏差。我会试试 LGBMClassifier。
    • “歪斜”是什么意思? SHAP 值是所有可能的特征联盟的平均边际贡献。他们只是解释模型,无论它具有什么形式:函数(精确)、树或深度 NN(近似)。它们与底层模型一样好。
    • 从我的绘图中你可能会说,输出 SHAP 值对于 1 类都是正数,对于 0 类都是负数。这正常吗?我认为输出应该是负面和正面影响之间的某种平衡。
    • 没有看到你的minimal reproducible example就很难说出任何事情
    • 您好,您能看看我刚刚添加的代码吗?真的很好奇是什么导致了这些奇怪的 SHAP 输出。
    猜你喜欢
    • 1970-01-01
    • 2020-05-29
    • 2020-01-14
    • 2020-03-15
    • 1970-01-01
    • 2015-11-14
    • 2020-09-18
    • 2019-04-12
    • 1970-01-01
    相关资源
    最近更新 更多