堆叠而不拆分数据

机器算法验证 机器学习 交叉验证 集成学习 样本外 堆叠
2022-03-13 15:51:07

我学习了在 Ensemble 学习中使用的 Stacking。在 Stacking 中,训练数据分为两组。第一组用于训练每个模型(第 1 层,左图),第二组用于训练预测组合器(第 2 层,右图)。

在我的项目中,我有两个不同的多分类模型。我有一个数据集(train/dev/test),用于训练和测试两个模型。当我学习 Stacking 时,我想我尝试将整个训练集用于混合训练集(第 2 层),然后用测试数据测试混合器。虽然我读了这本书和其他网站,但他们提到训练集被分成了子集。

将整个训练集同时用于第 1 层和第 2 层是否不常见(或不推荐)?我认为这没有错,因为测试数据已经准备好。我已经用整个训练数据集训练了我的模型。所以如果不推荐,我应该用分割的训练数据集训练我的模型吗?

在此处输入图像描述

这些图像引用自“使用 scikit-learn 和 Tensorflow 进行机器学习的手”。(2017)。

2个回答

您必须将真实的样本外预测作为混合器的输入,否则您的混合器不会学习并因此提高预测准确性,而是学习并因此提高样本内估计准确性,这可能导致过度拟合。这就是为什么你不能对两个层都使用整个训练集的原因——如果你这样做了,基础模型做出的一些“预测”实际上将是样本内估计,而不是样本外预测。

您拆分训练数据集,以便使用子集 1 来训练您的基础模型。这就是您左图中显示的内容。然后,您的基本模型将用于生成子集 2 的预测,这些预测以及子集 2 的实际值将提供给您的搅拌机进行训练。这就是您右图中的内容。基本上,预测是提供给搅拌机的功能,可能还有来自子集 2 的其他功能。

然后使用混合器基于子集 2 提出的模型来预测测试数据。这可以通过使用每个基本模型(在子集 1 上开发)预测测试数据来完成,然后使用混合器模型(在子集 2 上开发)+来自基本模型的预测再次预测测试数据。结果预测是您用于校准/测试组合基础模型 + 搅拌机模型的预测。

或者,您可以在对测试数据集进行预测之前,在子集 1 和 2 上重新训练您的基础模型。这将倾向于改进测试数据集的基本模型预测,但(希望稍微)削弱基本模型和搅拌机模型之间的联系,因为搅拌机在训练时看到不太准确的预测。因此,混合器会增加更少的价值和更多的过拟合,但鉴于基础模型更准确,它可能会平衡。

ETA(来自评论):在实践中,我倾向于分成 2 组以上,出于某种原因喜欢 10 组。然后使用更多数据训练基本模型,因此更准确(至少在您没有大量数据的情况下),并且混合器根据具有更接近其准确特征的模型的预测进行训练看看何时开始运作,这在准确性方面是双赢的。

让我解释。

在堆叠中,您将数据分成两部分。一组保持组 (10 - 20%)。一个训练集 (80 - 90%)。

您使用相同的交叉验证方法在训练集上单独训练您的基础学习者。您必须对所有基础学习者使用相同的交叉验证折叠索引。这是因为您只能根据这些测试折叠部分的预测概率以及与这些行相关联的原始原始数据来训练元分类器;因为这些行没有用于构建基础学习者。

注意:没有一个训练折叠可以与测试折叠重叠。如果第 37 行在测试折叠内;它不会发生在任何训练折叠中。否则,您将把信息从一层传递到下一层。使用 10% 到 20% 的训练集行作为测试折叠。

现在使用每个经过训练的基础学习来预测滞留集,并向其写入新的概率变量(示例:SVM_probs_up、LDA_probs_up)。

一旦使用来自每个基础学习器的测试折叠概率 + 来自同一行的原始数据训练元分类器,然后使用元分类器来预测最终结果的保留集。

通过混合训练集也被分割。但是,您无需使用交叉验证,而是直接取出 30% - 40%(训练验证集),然后在剩余的 60% - 70% 的训练集上训练基础学习者。然后预测到 training-validation-set 和 holdout-set,将它们作为新变量写入两个集合。然后在训练验证集上训练元分类器,然后使用保持集上的元分类器预测最终结果。