我正在尝试为一小部分预测提供精确决策图,但是与仅使用模型进行预测(即使在调用中使用link ='logit'时)所获得的输出相比,通过shap发现的输出也有所不同。由于我要绘制的子集,我试图生成的每个决策图的结果应大于预期值。但是,每个生成的图的预测值都低于预期值。
我有两个最小集成的模型,因此我使用一个for循环来确定要为其生成图的模型。我没有为RandomForestClassifier模型创建正确的图的问题,但是对于XGB模型却出现了问题。
rf_explainer = shap.TreeExplainer(RF_model)
xgb_explainer = shap.TreeExplainer(XGB_model)
for i in range(flagged.shape[0]):
if flagged_preds.RF_Score[i] == flagged_preds.Ensemble_Score[i]:
idx = flagged.index[i]
idxstr = idx[1].astype('str') + ' -- ' + idx[2].date().strftime('%Y-%m-%d') + ' -- ' + idx[0].astype('str')
shap_value = rf_explainer.shap_values(flagged.iloc[i,:])
shap.decision_plot(rf_explainer.expected_value[1], shap_value[1], show=False)
plt.savefig(f'//PathToFolder/{idxstr} -- RF.jpg', format = 'jpg', bbox_inches = 'tight', facecolor = 'white')
if flagged_preds.XGB_Score[i] == flagged_preds.Ensemble_Score[i]:
idx = flagged.index[i]
idxstr = idx[1].astype('str') + ' -- ' + idx[2].date().strftime('%Y-%m-%d') + ' -- ' + idx[0].astype('str')
shap_value = xgb_explainer.shap_values(flagged.iloc[i,:])
shap.decision_plot(xgb_explainer.expected_value, shap_value, link = 'logit', show=False)
plt.savefig(f'//PathToFolder/{idxstr} -- XGB.jpg', format = 'jpg', bbox_inches = 'tight', facecolor = 'white')
plt.close()
如前所述,在计分时,(我所关注的)每个观察值均应具有> 0.5的分数,但这不是我在整形图中看到的。这是一个例子:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS95NWRuQS5wbmcifQ==” alt =“示例决策图”>“>
[此图显示的输出约为.1,但使用predict_proba对该观察结果评分时,得到的值为.608
由于数据的敏感性,我不能真正提供一个代表,我不确定潜在的问题是什么。
欢迎任何反馈,谢谢。
相关点冻结项目:
Python 3.7.3
matplotlib == 3.0.3
shap == 0.30.1
xgboost == 0.90
我正在尝试为一小部分预测提供精确决策图,但是与仅使用模型进行预测(甚至使用link = ...]时,通过shap找到的输出有所不同)
我建议直接在模型输出和SHAP输出之间进行比较。SHAP Decision Plots文档的Section "Changing the SHAP base value"中的第二个代码示例显示了如何对SHAP值求和以匹配LightGBM模型的模型输出。您可以对任何其他模型使用相同的方法。如果总的SHAP值与模型输出不匹配,则不是绘图问题。代码示例复制如下。两行应打印相同的值。
# The model's raw prediction for the first observation.
print(model.predict(features.iloc[[0]].values, raw_score=True)[0].round(4))
# The corresponding sum of the mean + shap values
print((expected_value + shap_values[0].sum()).round(4))