lightgbm二分类 shap demo 0.36以上版本 shap value和prob的关系等
以下是demo:
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_train)
#可视化一个样本点
shap.force_plot(explainer.expected_value[1],shap_values[1][10,:],X_train.iloc[10,:])
#各个变量的解释
shap.summary_plot(shap_values[1],X_train,max_display = 70)
#各个变量shap重要性
shap.summary_plot(shap_values[1], X_train, plot_type="bar", max_display = 70)
#得到shap重要性的具体数值,可以用于RFE
vals= np.abs(shap_values[1]).mean(0)
feature_importance = pd.DataFrame(list(zip(X_train.columns,vals)),columns=['col_name','feature_importance_vals'])
feature_importance.sort_values(by=['feature_importance_vals'],ascending=False,inplace=True)
feature_importance
注1:
shap 0.36及以上的版本,对于lightgbm model计算shap_values的时候,会得到0和1分别的shap values。
shap_values是一个list,含两个array,第一个是0的shap value,第二个是1的shap value,比如X_train.shape = (4455,14),那么shap_values[0].shape = (4455,14),shap_values[1].shape = (4455,14),每条记录的每个feature的shap value。
explainer.expected_value同理是一个list含了两个base_value,第1个假定p是0的概率的时候,第2个p是1的概率时候,计算都是ln(p/(1-p)),所以两个值是相反数。
注2:
summary_plot的plot_type='bar'得到的重要性,和np.abs(shap_values[1]).mean(0)
是等价的(绝对值按列求均值)
注3:
np.log(train_prob/(1-train_prob)).mean()就等于explainer.expected_value[1] + shap_values[1].sum(axis=1) #按行求和 把每个特征的贡献的shap value求和
注4:
如果模型在测试集上跑
shap_values = explainer.shap_values(X_test)
np.log(test_prob/(1-test_prob)).mean()就等于explainer.expected_value[1] + shap_values[1].sum(axis=1) #按行求和 把每个特征的贡献的shap value求和。也就是说base_value是不变的,由训练好的模型在训练集上跑得的prob确定
留言
張貼留言