使用整个数据集来训练最终模型总是更好吗?

数据挖掘 机器学习 数据集 训练 准确性
2021-09-21 20:43:45

在训练、验证和测试偏好的机器学习模型之后,一种常见的技术是使用完整的数据集(包括测试子集)来训练最终模型以将其部署到例如产品上。

我的问题是:这样做总是最好的吗?如果性能真的恶化了怎么办?

例如,让我们假设模型在对测试子集进行分类时得分约为 65%。这可能意味着模型训练不足或测试子集包含异常值。在后一种情况下,使用它们训练最终模型会降低其性能,并且只有在部署它之后才能发现。

重新表述我最初的问题:

如果你有一个模型的一次性演示,例如将它部署在昂贵的火箭实验上的嵌入式电子设备上,你会相信在最后一步用测试子集重新训练的模型,而无需重新训练吗?测试了它的新性能?

4个回答

我个人还没有看到产品投入生产,但理解逻辑。

从理论上讲,您部署的模型看到的数据越多,推广效果就越好。因此,如果您在可用的全部数据集上训练模型,它应该比仅从完整数据集中看到例如训练/验证集(例如约 90%)的模型具有更好的泛化能力。

这样做的问题(以及我们首先将数据分成训练/验证/测试集的原因!)是我们希望能够对未见数据的准确性做出统计声明。一旦我们在所有数据上再次重新训练模型,就不再可能做出这样的声明。

[编辑]

这是关于 Cross-Validated 的一个相关问题,其中接受的答案对我提出了类似的观点,并提到了其他做事方式。


我们循环:

  1. 训练模型
  2. 评估验证集的性能 如果满意,请转到步骤 5
  3. 改变模型
  4. 转到第 1 步
  5. 评估测试集的性能
  6. 在步骤 5 中找到具有测试精度的当前模型

最终,如果您设法在测试集上获得高分,您可以声称它具有很好的泛化性。因此,关于对完整数据集进行重新训练是否会提高未来未见数据的性能的问题严格来说并不是您可以测试的问题。在其他相关问题集中表现更好的经验证据将是您必须做出决定的时间点的唯一来源或指导。

健全性检查是在原始测试集上再次测试最终重新训练的模型;期望它比模型只看到训练/验证集时的得分更高,因为它实际上在训练期间已经看到了测试集。这不会让我 100% 确信这个最终模型在所有未来的情况下都是优越的,但至少它与给定的数据一样好。

也许有更严格的论据反对做你所说的(可能是出于学术动机),但它似乎对实际应用很有吸引力!

一旦你获得了模型的最佳超参数,经过训练和交叉验证等,理论上可以在整个数据集上训练模型以部署到生产中。从理论上讲,这将更好地概括。

但是,由于您不再拥有测试数据集,因此您无法再对测试数据进行统计/性能声明。

如果您使用整个训练数据集将模型部署到生产环境,并且您知道新传入数据的目标变量的真实值(即生产模型正在对其进行预测的数据),那么您可以将实时性能指标计算为这个新数据就像测试数据(在训练期间模型看不到它)。从这个过程中,您可以更新模型超参数以获得更好的性能。

但是,如果您知道新数据的目标值,为什么要首先训练模型呢?

一般来说,我会说如果你有足够多的数据,那么 80:20 训练和拆分数据应该足以训练一个健壮的模型,而不必担心泛化问题(当然假设你正则化模型)。

关于统计机器学习需要强调的一点是没有保证当您使用保留集估计性能时,这只是一个估计值估计可能是错误的。

这需要一些时间来适应,但这是你必须适应的事情。当您说“如果性能真的恶化怎么办?”时,答案是肯定的,这可能会发生。实际表现可能比您估计/预测的要差。它也可以更好。两者都是可能的。这是不可避免的。存在一些固有的、不可减少的不确定性。

当您使用保留的测试集评估性能时,您是在使用过去的数据来尝试预测未来的性能。正如他们所说,过去的表现并不能保证未来的结果这是我们必须接受的生活事实。

你不能让这让你动弹不得。可能比您预期的更糟这一事实并不是避免将基于数据训练的模型部署到生产环境的理由。特别是,如果您不这样做,也可能做得很差。在所有数据(训练+验证+测试)上训练的模型可能会比仅在训练+验证部分上训练的模型更差。也有可能会更好。所以,与其寻找保证,我们必须问自己:什么给了我们最大的成功机会?什么最有可能最有效?

在这种情况下,当您想要部署到生产环境时,您能做的最好的事情就是使用所有可用的数据。就预期性能而言,使用所有数据并不比使用部分数据差,甚至可能更好。因此,您不妨在构建生产模型时使用所有可用的数据来训练模型。事情仍然可能会很糟糕——无论何时使用统计方法,总是可能会变得不走运——但这为你提供了让事情顺利进行的最佳机会。

具体而言,标准做法如下:

  1. 将您的一些数据保留到保留的测试集中。关于使用什么分数没有硬性规定,但例如,您可以保留 20% 用于测试集,而保留剩余的 80% 用于训练和验证。通常,所有拆分都应该是随机的。

  2. 接下来,使用训练和验证数据尝试多种架构和超参数,尝试找到最好的模型。将保留的 80% 用于训练和验证,将其拆分为训练集和验证集,并使用训练集训练模型,然后在验证集上测量其准确性。如果您使用交叉验证,您将多次拆分并在验证集上平均结果;如果不是,您将进行一次拆分(例如,80% 的 70%/30% 拆分,或类似的东西)并评估验证集的性能。如果您有许多超参数要尝试,请为每个候选超参数设置执行一次。如果您有许多架构要尝试,请为每个候选架构执行此操作。你可以迭代这个,使用你的

  3. 一旦你感到满意,你就可以冻结架构、超参数等的选择。现在你的实验已经完成了。一旦你达到这一点,你就不能再尝试任何其他选项(没有获得一个新的测试集)——所以在你确定你准备好之前不要达到这一点。

  4. 准备就绪后,您可以使用之前选择的架构和超参数在完整的训练 + 验证集(即 80%)上训练模型。然后,在保留的测试集上测量其准确性。这是您对这种建模方法的准确度的估计/预测。你在这里得到一个数字。这个数字就是这样:如果你对它不满意,你就不能回到第 1 步和第 2 步做更多的实验;那将是无效的。

  5. 最后,对于生产使用,可以在整个数据集上训练一个模型,训练+验证+测试集,然后投入生产使用。请注意,您永远不会测量此生产模型的准确性,因为您没有任何剩余数据可以这样做;您已经使用了所有数据。如果您想估计它的性能,您有权使用第 4 步中估计的准确度来预测它在生产中的性能,因为这是对其未来性能的最佳预测。与往常一样,没有任何保证——这只是可能的最佳估计,考虑到我们可以获得的信息。当然,它可能会比你预测的更糟,或者比你预测的更好——这总是正确的。

拥有数据集的原因之一是避免过度拟合。如果您使用交叉验证,您实际上允许整个数据集充当训练集,但重新训练不会让您验证是否存在过度拟合的迹象。我想无论哪种方式(交叉验证或使用整个数据集重新训练)都不会显着改变您的结果(根据我未受过教育的猜测),但是您将无法进行超参数调整或验证您的模型性能,因为您没有有一个测试集。最终是否会变得更好,很难说,但我想知道的唯一方法是随着时间的推移对两个模型的真实数据进行 A/B。