最终(生产就绪)模型应该在完整数据上还是仅在训练集上进行训练?

机器算法验证 机器学习 验证 回归策略
2022-01-29 04:16:26

假设我在训练集上训练了几个模型,使用交叉验证集选择最好的一个,并在测试集上测量性能。所以现在我有一个最终的最佳模型。我应该根据我的所有可用数据重新训练它还是只在训练集上训练过的解决方案?如果是后者,那为什么?

更新:正如@P.Windridge 所指出的,发布重新训练的模型基本上意味着发布未经验证的模型。但是我们可以报告测试集的性能,然后在完整的数据上重新训练模型,期望性能更好——因为我们使用了最好的模型和更多的数据。这种方法可能会出现什么问题?

3个回答

在对整个样本进行重新拟合后,您几乎总能得到更好的模型。但正如其他人所说,你没有验证。这是数据拆分方法的一个根本缺陷。数据拆分不仅失去了直接对整体模型中的样本差异进行建模的机会,而且除非您的整个样本可能大于 15,000 个受试者,否则它是不稳定的。这就是为什么需要 100 次重复 10 倍交叉验证(取决于样本量)来实现精确度和稳定性,以及为什么强内部验证的引导程序更好。引导程序还揭示了特征选择任务的难度和随意性。

我在生物医学研究第 10.11 节的生物统计学中更详细地描述了“外部”验证的问题。

除非您将自己限制在一类简单的凸模型/损失函数中,否则最好保留最终测试拆分原因如下:

假设您从数据生成分布中收集 iid 样本对,一组 (x, y)。然后,您将其拆分为训练集和测试集,并在训练集上训练模型。在该训练过程中,您会得到一个模型实例 f(x; w)。其中 w 表示模型参数。

假设您在测试集中有 N 个观察值。当您在该测试集上验证此模型时,您会形成一组测试预测 {f(x_i, w) : i=1,2,...,N} 并将其与测试标签集 {y_i : i =1,2,...,N} 使用性能指标。

使用 N 个独立观察可以说的是,您期望模型实例(即给定特定 w 的函数)将如何推广到来自同一分布的其他 iid 数据。重要的是,您实际上只有一个观察结果(您发现的 w)来评论您确定 f(x, w) 的过程,即训练过程。您可以使用诸如 k-fold 交叉验证之类的东西多说一些,但除非您愿意进行详尽的交叉验证(这在计算机视觉或 NLP 环境中实际上并不可行),否则您将始终拥有较少的数据培训过程的可靠性。

举一个病态的例子,你随机绘制模型参数,而你根本不训练它们。您获得了一些模型实例 f(x, w_a)。尽管您的(缺乏)训练过程很荒谬,但您的测试集性能仍然表明该模型实例将如何推广到看不见的数据。这 N 个观察结果仍然完全可以使用。也许你会很幸运,并且已经降落在一个相当不错的 w_a 上。但是,如果您将测试集和训练集结合起来,然后“重新训练”模型以获得 w_b,那么您就有麻烦了。你之前的测试表现的结果基本上相当于你下一次随机参数抽取的效果的一个点估计。

您可以使用统计结果来评论整个培训过程的可靠性。但是它们需要对您的模型类、损失函数以及您从该类中为任何给定的训练观察集找到最佳 f(x, w) 的能力进行一些假设。有了这一切,你可以得到一些界限,即你在看不见的数据上的表现与你在训练数据上测量的结果有一定的偏差。然而,这些结果并没有(以有用的方式)延续到像现代神经网络这样的过度参数化和非凸模型。

上面的病态例子有点过头了。但作为 ML 研究员和顾问,我看到神经网络训练管道偶尔会锁定到可怕的局部最小值,但在其他方面表现出色。如果没有最终测试拆分,您将无法确定在您的最终再培训中没有发生这种情况。

更一般地说,在现代机器学习环境中,您不能将训练过程中产生的模型视为可互换的。即使它们在验证集上的表现相似事实上,当使用一整套随机优化技巧时,您可能会看到从一个模型到另一个模型的巨大差异。(有关这方面的更多详细信息,请查看关于规格不足的这项工作。)

你不需要重新训练。当您报告结果时,您总是报告测试数据结果,因为它们可以提供更好的理解。通过测试数据集,我们可以更准确地了解模型对样本外数据的执行情况。