我对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_值包含两部分。我假设一个用于类0,另一个用于类1。如果我想知道某个功能的贡献。我必须画出如下两幅图
0班
但是我应该怎样才能有更好的视觉效果呢?结果不能帮助我理解“寒冷天气是否会增加输出变为1级或0级的概率?”
对于相同的数据集,如果我使用ANN,则输出类似于此。我认为shapley的结果清楚地告诉我,“寒冷的日子”将积极地增加结果成为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
:您将从本练习中获得什么:
类0和1的形状值是对称的。为什么?因为如果一个特征对类1贡献了一定的量,它同时也会以相同的量降低成为类0的概率。所以一般来说,对于二元分类来说,查看
sv[1]
就足够了worst area
的低值有助于类1,反之亦然。这种关系不是严格的线性关系,特别是对于类0,它需要用非线性模型(树、NN等)对这种关系进行建模这同样适用于其他描绘的特征
希望这有帮助
PS
我猜你的第二个情节来自一个预测单个类概率的模型,比如说1,但是如果没有看到整个代码,很难判断
相关问题 更多 >
编程相关推荐