微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我对 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 类

enter image description here

对于第 1 类

enter image description here

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

使用相同的数据集,如果我使用人工神经网络,输出就是这样。我认为 shapley 结果清楚地告诉我“cold_days”将积极增加结果成为 1 类的可能性。

enter image description here

我觉得 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,num_boost_round=300,valid_sets=lgb_eval,)
e = shap.TreeExplainer(gbm)
shap_values = e.shap_values(X)
shap.summary_plot(shap_values[0][:,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)

enter image description here

summary_plot(sv[0],max_display=3)

enter image description here

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

  1. 0 类和 1 类的 SHAP 值是对称的。为什么?因为如果一个特征对类 1 贡献了一定的数量,它同时会以相同的量减少属于类 0 的概率。因此,一般来说,对于二元分类,查看 sv[1] 可能就足够了。

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

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

希望这会有所帮助。

附注

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。