我一直在尝试使用shap
包。我想从我的逻辑回归模型中确定shap值。与TreeExplainer
不同,LinearExplainer
需要一个所谓的masker。这个masker到底有什么作用?独立masker和分区masker之间有什么区别?
另外,我对测试集中重要的特征感兴趣。我应该将masker拟合到训练集还是测试集上呢?下面是一个代码片段。
model = LogisticRegression(random_state = 1)model.fit(X_train, y_train)masker = shap.maskers.Independent(data = X_train)**或**masker = shap.maskers.Independent(data = X_test)explainer = shap.LinearExplainer(model, masker = masker)shap_val = explainer(X_test)```
回答:
Masker类为你的解释器提供背景数据以“训练”。即,在:
explainer = shap.LinearExplainer(model, masker = 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)
这类似于通常的train/test
范式,你在训练数据上训练你的模型(和解释器),然后尝试预测(和解释)你的测试数据。
与问题无关。替代masker的方法是明确提供背景数据,这可能允许比较两个数据点:一个用于比较的点和一个感兴趣的点,就像这个笔记本中那样。这样可以找出为什么两个看似相似的数据点被分类为不同类别。