堆叠模型的正确交叉验证

机器算法验证 交叉验证 堆叠
2022-03-20 04:37:33

假设我们的数据集包含我们想要预测观察次数为在以下两种情况下,我对正确的交叉验证有疑问:YX1,...,X10n=1000

  1. 我想添加变量,它等于 10 个最近观察值的平均值(该指标并不重要)。在这个扩展数据集上,我想进行线性回归。CV的正确方法是什么(kfold for)? X11Yk=5

    • 使用整个数据集添加,然后进行“正常”kfold 交叉验证?在这种情况下,有关测试集的一些信息将包含在训练部分中,因此会出现错误偏差。 X11
    • 仅使用训练数据在每个折叠中分别添加但接下来的问题是如何在测试集中添加,应该只使用测试集吗?由于测试数据集中的案例数量,变量可能存在偏差。X11X11X11
  2. 建立了两个模型(例如:随机森林和梯度提升机),现在想要对这两个模型进行线性混合。模型中的哪些预测应该作为预测变量?一种解决方案是:

    • 将数据集拆分为训练/测试(800/200),使用训练数据集构建这两个模型并混合这些概率并在测试数据集上测试最终预测。对测试数据集中的不同折叠重复 5 次。
      我相信这个解决方案可能并不完美,因为随机森林往往会过度拟合训练数据集。我觉得混合概率而不是来自训练数据集会更好。为了克服这一点,可以执行以下操作:
    • 将数据集拆分为训练/测试 (800/200)。然后在训练数据集上做 kfold CV 并用作预测器 out of bag 估计(因此拆分为 640/160)。这是更耗时的解决方案,但应该更可靠。缺点是,如果我们想对 k=5 进行 kfold 交叉验证,那么在输入混合的模型中,我们将在训练数据集中有 16/25 的示例。

我坚信这两种情况都是众所周知的,但我想知道这方面的最新技术水平。

2个回答

问题 1:局部预测和交叉验证

寻找附近的案例并对其进行加权以进行预测称为局部模型或局部预测。

对于进行交叉验证的正确方法,请记住,对于每一折,您使用训练用例,然后对测试用例进行与预测新未知用例所做的完全一样的操作。

我建议将的计算视为预测的一部分。最近邻 +二级模型组成的两级模型中:X1n

  1. 对于每个训练案例,找到最近邻并计算nX11
  2. 根据计算“第二级”模型。X1,...,X11

的预测,您Xnew

  1. 找到最近邻并计算新案例nX11
  2. 然后计算第二级模型的预测。

您正是使用这个预测过程来预测交叉验证中的测试用例。


问题2:结合预测

随机森林倾向于过度拟合训练数据集

通常,随机森林只会在您拥有分层/集群数据结构器的情况下过度拟合,该结构器会在(某些)数据行之间创建依赖关系。
由于迭代加权平均(与随机森林的简单平均相反),Boosting 更容易过度拟合。

我还没有完全理解你的问题(见评论)。但这是我的猜测:

我假设您想找出应该用于随机森林和增强预测的最佳权重,这是这两个模型的线性模型。(我不知道如何在这些集成模型中使用单个树,因为树会在拆分之间完全改变)。这又相当于一个 2 级模型(如果与问题 1 的方法相结合,则为 3 级)。

这里的一般答案是,每当您进行数据驱动模型或超参数优化(例如,通过测试/交叉验证结果优化随机森林预测和梯度提升预测的权重)时,您需要进行独立验证以评估真实性能得到的模型。因此,您需要另一个独立的测试集,或者所谓的嵌套或双交叉验证。

  • 因此,除非您从训练数据中获取权重,否则第一种方法将不起作用。
  • 正如您为第二种方法指出的那样,拥有越来越多的交叉验证级别需要大量的样本量开始。

我在这里推荐一种不同的方法:通过尽可能少的数据驱动的超参数计算或优化来尽可能减少所需的拆分数量。不能讨论是否需要验证最终模型。但是,如果您可以证明您尝试堆叠的模型没有过度拟合,您可能可以证明不需要内部拆分。此外,这将完全消除堆叠的需要:

集成模型仅在底层个体模型存在方差(即不稳定)时才有帮助。(或者如果它们偏向相反的方向,那么整体会大致消除个体偏差。我怀疑这里不是这种情况,假设你的 GBM 使用像 RF 这样的树。)
至于不稳定性,你可以测量这个很容易通过重复又名迭代交叉验证(参见例如这个答案)如果这并不表明基于略微变化的训练数据(即如果您的 RF 和 GBM 稳定)的模型对同一案例的预测存在显着差异,那么生成集成模型的集成将无济于事。

问题一:

这与所谓的 KFold 目标编码非常相似,这里解释了正确的方法:

https://medium.com/@pouryaayria/k-fold-target-encoding-dfe9a594874b

您的编码与上面文章中描述的略有不同,但您可以应用相同的设计。