我在具有 k 个特征的 Keras 模型上运行 n 次试验,之后我在每次试验中将 SHAPs DeepExplainer 应用于模型。所有数据都是相同的,但在训练集和测试集之间随机拆分。我试图找出组合模型输出的最佳方法,无论是直接添加每个试验的 Shapley 值,逐个特征,然后求平均值 - 还是首先缩放每个试验输出的 Shapley 值,然后添加它们并取平均值。
我最初的想法是,由于“基线总是基于所有预测的平均值是相对的”(来自 here),因此整体平均值会出现偏差,并且可能有更好的方法来组合数据.尽管我想知道,尽管训练/测试拆分中的样本不同,并且每个模型的相对“基线”不同,但对许多模型进行平均是否会给出最终平均模型的解释值是否应该与单个模型一样多。应该是这样吗?
但是,缩放每个模型的特征是否会带来任何好处:再次从 here 开始,我可以(除了注意事项)缩放模型中单个观察的特征 Shapley 值。那么似乎我应该能够在对所有观察结果求和后缩放每个特征 Shapley 值,在每个 bin 上,使得每个特征的所有 Shapley 值总和为 1。如果是这种情况,我可以按特征进行缩放模型 我可以用这种方式平均模型吗?我认为这样做的一个好处是所有模型都将具有相同的权重,因为特征在每个模型中进行了缩放。这是一种有效的方法吗?如果是,它是否比将所有 Shapley 值逐个特征地添加到所有模型上有什么好处?
为了明确 bin 的含义,它们是解释器返回的列表,等于分类的数量:
explainer = shap.DeepExplainer(model, X_train)
ShapleyBinVals = explainer.shap_values(X_test)
Bin = ShapleyBinVals[n]
其中 n 是输出分类的数量。这是缩放输出的条形图:
请注意,对于每个功能,例如PSWQ_2 y 值是一个百分比,所有 bin 的百分比总和为 1。