重复训练/测试拆分情况下的 SHAP 解释

数据挖掘 xgboost 可解释的ai
2022-02-15 12:22:37

我正在用 Python 构建一个 XGBoost 模型,并尝试使用漂亮的shap 包来解释它。除了计算每个特征的 SHAP 值之外,我还想展示如下两个图表(分别是摘要图 A 和依赖图 B):

重要性图 依赖图

如果我有一个模型,只有一个训练/测试拆分,这很容易。然而,这是有风险的,因为我可能有选择偏差,所以我通常使用 500 个随机训练/测试拆分来评估我的模型的准确性(然后计算准确性和 Cohen 的 Kappa 的平均值)。

如果这样做,考虑到所有 500 个 XGBoost 模型的平均信息,我怎样才能得到上述图?我想到了三种策略,但似乎没有一个能解决问题:

1- 在所有样本上训练一个模型(没有拆分)并计算 SHAP 值。我会继续计算 500 个具有训练/测试拆分的模型的准确度和 Kappa。

2- 选择最适合测试集的 500 模型,并在其上计算 SHAP 值。

3-我可以计算每个特征的 SHAP 值,每次重复 500 次,然后计算它们的平均值和标准差。然后我可以从中生成直方图。

N.1 似乎不是正确的方法。N.2 似乎也有偏见,事情可能会从一个模型变为另一个模型。N.3 是我迄今为止一直在做的,因为它似乎是最可靠的方法。但是,它的缺点是我无法生成我想要的图表(图 A 和 B)。

考虑到来自重复训练/测试拆分方法的信息,有什么想法可以生成有意义的图(A 和 B)吗?

2个回答

我认为这部分取决于您为什么想要 shap 值。分开 (a) 解释模型和 (b) 解释数据可能会有所帮助;像 shap 之类的模型可解释性工具仅处理 (a),它有望作为 (b) 的代理。

如果您想要的只是模型解释[(a)],那么我认为您的方法1很好;无论如何,这个经过再训练的模型大概是投入生产的模型。

如果您想要数据解释 [(b)],那么您必须提出的部分问题是“代理 (a) 对 (b) 有多好”,其中一个方面是“shap 值有多稳定?” . 在那种情况下,你真的想要像你的方法 3 那样的东西;也许不是像你的两个图那样的个人预测水平,而是在全球范围内如何将重要性归因于每个特征,以及这些重要性的可变性当然,如果你走这条路,很容易按照@bmwilly 的回答来生成你的图;您丢失了有关估计值可变性的信息,但您又回到了漂亮的图上。

方法 2 似乎很糟糕。您将过度拟合您的测试集,并因此而使 shap 值产生偏差。

我建议你对准确性和 Kappa 指标做类似的事情——计算所有 500 个拆分的 SHAP 值,并取这些值的平均值n_s一种ples×n_Fe一种res×500得到第三维矩阵n_s一种ples×n_Fe一种res矩阵,您可以使用它来创建所需的图。