对于XGBClassifier模型,Shap力图和决策图给出了错误的输出

问题描述 投票:0回答:1

我正在尝试为一小部分预测提供精确决策图,但是与仅使用模型进行预测(即使在调用中使用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找到的输出有所不同)

python matplotlib plot xgboost shap
1个回答
0
投票

我建议直接在模型输出和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))
© www.soinside.com 2019 - 2024. All rights reserved.