如何理解二元分类问题的 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)
你将从这个练习中得到什么:
classes 0 和 1 的 SHAP 值是对称的。为什么?因为如果一个特征对 class 1 有一定的贡献,它同时会降低相同数量的 class 0 的概率。所以一般来说,对于二进制 class 化,查看 sv[1]
可能就足够了。
worst area
的低值有助于 class 1,反之亦然。这种关系不是严格线性的,特别是对于 class 0,这需要用非线性模型(树、NN 等)对这种关系进行建模
这同样适用于其他描绘的特征。
希望对您有所帮助。
PS
我猜你的第二个图来自一个预测单个 class 概率的模型,比如 1,但如果不完整地查看你的代码就很难判断。
我对 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)
你将从这个练习中得到什么:
classes 0 和 1 的 SHAP 值是对称的。为什么?因为如果一个特征对 class 1 有一定的贡献,它同时会降低相同数量的 class 0 的概率。所以一般来说,对于二进制 class 化,查看
sv[1]
可能就足够了。worst area
的低值有助于 class 1,反之亦然。这种关系不是严格线性的,特别是对于 class 0,这需要用非线性模型(树、NN 等)对这种关系进行建模这同样适用于其他描绘的特征。
希望对您有所帮助。
PS
我猜你的第二个图来自一个预测单个 class 概率的模型,比如 1,但如果不完整地查看你的代码就很难判断。