SHAP包中的Maskers到底是做什么的?如何将其适配到训练或测试数据上?

11

我一直在尝试使用shap包。我想要从我的逻辑回归模型中确定shap值。与TreeExplainer相反,LinearExplainer需要所谓的掩模器(masker)。这个掩模器到底是做什么的,独立掩模器和分区掩模器有什么区别?

同时,我对测试集中的重要特征感兴趣。那我需要在训练集还是测试集上拟合掩膜器? 下面是代码片段。

model = LogisticRegression(random_state = 1)
model.fit(X_train, y_train)

masker = shap.maskers.Independent(data = X_train)
**or**
masker = shap.maskers.Independent(data = X_test)

explainer = shap.LinearExplainer(model, masker = masker)
shap_val = explainer(X_test)```

1个回答

16

Masker类提供了一个背景数据,用于“训练”您的解释器。例如,在:

explainer = shap.LinearExplainer(model, masker = masker)

你正在使用由掩模确定的后台数据(可以通过访问masker.data属性查看使用的数据)。您可以在这里这里阅读有关“真实模型”或“真实数据”的解释。

根据上述内容,从计算角度来看,您可以做到两者兼顾:

masker = shap.maskers.Independent(data = X_train)

或者


masker = shap.maskers.Independent(data = X_test)
explainer = shap.LinearExplainer(model, masker = masker)

但从概念上来说,我认为以下内容更有意义:

masker = shap.maskers.Independent(data = X_train)
explainer = shap.LinearExplainer(model, masker = masker)

这类似于通常的“训练/测试”范例,您在训练数据上训练模型(和解释器),并尝试预测(和解释)测试数据。

与问题无关。一个替代遮罩器的方法是为您采样数据,明确提供可能允许比较2个数据点的背景:一个用于比较的点和感兴趣的点,就像这个笔记本电脑中所示。通过这种方式,可以找出为什么两个看似相似的数据点被分类不同的原因。


干杯!现在更有意义了。 - JonnDough
我想知道来自同一模型对象的Shap值是否应该基于不同的测试数据而不同,还是一个模型只有一个Shap值? - HC_2016
1
它们将会不同。你可以在 GitHub 上搜索“true to model”或“true to data”,或者查看这篇文章:https://arxiv.org/abs/2006.16234。 - Sergey Bushmanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接