我不确定使用早期停止和交叉验证进行梯度提升算法的正确方法是什么。对于简单的训练/有效拆分,我们可以使用有效数据集作为提前停止的评估数据集,并且在重新拟合时我们使用最佳迭代次数。
但是在像 k-fold 这样的交叉验证的情况下,我的直觉是使用每个折叠的每个有效集作为早期停止的评估数据集,但这意味着最佳迭代次数会因折叠而异。那么在改装的时候,我们用什么作为最终的最佳迭代次数呢?均值 ?
谢谢 !
我不确定使用早期停止和交叉验证进行梯度提升算法的正确方法是什么。对于简单的训练/有效拆分,我们可以使用有效数据集作为提前停止的评估数据集,并且在重新拟合时我们使用最佳迭代次数。
但是在像 k-fold 这样的交叉验证的情况下,我的直觉是使用每个折叠的每个有效集作为早期停止的评估数据集,但这意味着最佳迭代次数会因折叠而异。那么在改装的时候,我们用什么作为最终的最佳迭代次数呢?均值 ?
谢谢 !
我怀疑这是一种“没有免费午餐”的情况,最好的办法是对数据的(子集)进行试验(或者理想情况下,与训练数据不相交的类似数据),看看最终模型的理想估计器数量如何比较对于那些 cv 迭代。
例如,如果您的验证性能随着额外的估计量而急剧上升,然后趋于平稳,最后非常缓慢地下降,那么走得太远不是问题,而是尽早切断是一个问题。相反,如果您的验证性能缓慢增长到峰值,但随后因过度拟合而急剧下降,那么您需要为最终模型设置较少数量的估计器。除了直接验证分数之外,您的模型还有所有其他考虑因素;也许您特别反对过度拟合并希望设置较少数量的估计器,例如 cv 迭代中的最小值。
另一个关键:有了更多数据,您的模型可能需要比任何 cv 估计更多的估计量。如果您有资源进行实验,也请研究一下。
最后,您可以考虑为最终模型留出提前停止验证。这牺牲了一些额外的训练数据,以方便不需要像上面那样估计估计器的最佳数量。
我认为这些帖子中很好地解决了相关问题的一些答案(/评论):
在我看来,与您的问题相关的 tldr 摘要是,在交叉验证之后,可以(或可能应该)使用单个非常大的训练集重新训练模型,并保留一个小的验证集来确定迭代早点停下来。虽然人们当然可以考虑从交叉验证折叠中确定早期停止参数的方法,然后使用所有数据来训练最终模型,但完全不清楚这是否会产生最佳性能。似乎可以合理地认为,简单地使用交叉验证来测试模型性能并确定其他模型超参数,然后保留一个小的验证集来确定最终模型训练的提前停止参数可能会产生最佳性能。
如果有人想按照您的建议进行操作,使用交叉验证在不同的折叠上训练许多不同的模型,每组根据自己的验证集提前停止,然后使用这些交叉验证折叠来确定最终模型的提前停止参数要接受所有数据的培训,我倾向于按照您的建议使用平均值。这只是一种预感,我没有证据支持它(尽管它似乎确实是许多知名的看似来源中提到的观点)。如果您打算以这种方式进行,我建议您测试此选择与其他候选人的性能,例如采用最大/最小等。我不会相信任何人的话,因为这是最好的进行方式,除非他们提供证据或证据证明他们的主张。
最后,我想提一下,如果一个人不一定对在交叉验证后构建一个新训练的最终模型感兴趣,而只是想获得对某个问题的特定实例的预测,那么第三条路线是放弃训练一个最终模型共。我的意思是,可以使用交叉验证为每个折叠训练一个模型,但是在每个折叠期间记录折叠的模型在交叉验证循环发生时为测试集所做的预测。在交叉验证结束时,每个折叠留下一个训练模型(每个都有自己的早期停止迭代),以及每个折叠模型的测试集的一个预测列表。最后,
注意:这个回复可能更适合作为评论,因为我没有提供问题的答案,但它有点长。