将内核解释器(SHAP 工具)用于管道和多类分类



我有一个用于 3 类分类问题的Pipeline对象。因为我找到的大多数示例都是用于二元分类的,所以我发现很难完全理解如何为每个样本获得正确的绘图。

因此,我有以下代码(pipe_model是我的管道对象,之前拟合过,X_trainX_test分别是我的训练和测试数据(:

import shap
explainer = shap.KernelExplainer(pipe_model.predict_proba, X_train, link="logit")
shap_values = explainer.shap_values(X_test, nsamples="auto")

我想要X_test中每个样本的绘图。我知道不知何故,explainer.expected_valueshap_values对我正在分类的每个类都有 3 个部分。因此,例如,如果我想绘制 X_test 的前 2 个样本的重要性,我正在这样做:

shap.force_plot(explainer.expected_value[0], shap_values[0][0,:], X_test.iloc[0,:], link="logit")
shap.force_plot(explainer.expected_value[1], shap_values[1][0,:], X_test.iloc[1,:], link="logit")

我在expected_valueshap_values中玩了一下索引,情节发生了变化,为什么我无法解释。有人可以告诉我应该如何为每个样本、每个类绘制force_plot吗?

在探索了一番之后,如果其他人有同样的问题,我认为这将是完成我所问的正确方法:

要显示驱动类 0 分类概率的特征:

shap.force_plot(explainer.expected_value[0], shap_values[0][0,:], X_test.iloc[0,:], link="logit")
shap.force_plot(explainer.expected_value[0], shap_values[0][1,:], X_test.iloc[1,:], link="logit")

为了显示驱动类 1 分类概率的特征:

shap.force_plot(explainer.expected_value[1], shap_values[1][0,:], X_test.iloc[0,:], link="logit")
shap.force_plot(explainer.expected_value[1], shap_values[1][1,:], X_test.iloc[1,:], link="logit")

为了显示驱动类 2 分类概率的特征:

shap.force_plot(explainer.expected_value[2], shap_values[2][0,:], X_test.iloc[0,:], link="logit")
shap.force_plot(explainer.expected_value[2], shap_values[2][1,:], X_test.iloc[1,:], link="logit")

如果有人可以仔细检查这一点,那就太好了,但无论如何,这就是我认为现在正确的。

最新更新