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


24

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

我的问题是:这样做是否总是最好的?如果性能实际上下降了怎么办?

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

重新表述我的最初问题:

如果您曾经进行过一次模型演示,例如将其部署在昂贵的火箭实验上的嵌入式电子设备上,那么您是否会信任在最后一步中已通过测试子集重新训练的模型,而无需重新进行?对其新性能进行了测试?

Answers:


14

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

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

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

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

一般而言,我想说的是,如果您有足够的数据和足够的多样性,则可以对数据进行改组和拆分80:20 training:test应该足以训练一个健壮的模型,而不必担心泛化问题(假设您当然可以对模型)。


+1,谢谢您的回答!似乎在拆分为80/20之前对数据集进行随机混洗可能使我们感到“统计上”有信心(:
pcko1

2
只要您正确地进行了测试,就可以将您坚持使用的测试集的性能推广到整个人群。尽管将方法应用于整个数据集后没有测试集,但是原始交叉验证的训练/测试集的性能是训练算法性能的无偏估计。这就是CV的全部要点-不是训练或参数化模型,而是估计模型构建过程的性能。您在任何测试台到全数据建模性能之前对全部数据的性能估计。
核王

13

有趣的问题。我个人没有看到产品投入生产,但是了解逻辑。

从理论上讲,您的已部署模型看到的数据越多,一般化的效果就越好。因此,如果您在可用的全部数据集上训练模型,则其泛化性要比仅从整个数据集中看到例如训练/验证集(例如,约90%)的模型更好。

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

[编辑]

这是Cross-Validated上的一个相关问题,在该问题上,被接受的答案与我有相似的观点,并提到了其他处理方式。


我们循环:

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

最终,如果您在测试集上获得了不错的成绩,则可以说它具有很好的概括性。因此,关于完整数据集的重新训练是否会提高未来未见数据的性能的问题并不是严格可以测试的。在其他相关问题集中表现更好的经验证据将是您必须做出决定时的唯一来源或指南。

健全性检查将是在原始测试集上再次测试最终的重新训练模型;期望它的得分比模型仅看到火车/ val设置时的得分高,因为它实际上在训练过程中看到了测试设置。这并不能使我100%相信最终模型在以后的所有情况下都比较好,但是至少与给定数据一样好。

也许有更严格的论据反对您说的话(可能是在学术上是行之有效的),但是对于实际应用而言,它似乎确实很有吸引力!


+1了,感谢您的努力,并指出了该帖子,我错过了!至于最后建议在整个训练数据集上测试模型的建议,我认为您不会从其结果中获得任何有价值的见解。仅仅因为算法训练通常基于成本函数的优化,所以在给定训练数据的情况下,训练模型是最优的。火车数据的低准确性并不意味着它不是最佳的,只是意味着在给定数据集和所选算法体系结构的情况下,它根本做不到更好。您不能以此推断其外部有效性。
pcko1

1
别客气!我完全同意您的说法(尽管我说过要在原产测试数据上测试最终的训练模型,而不是训练)。无论如何,我仍然想看看最终模型并没有做完全出乎意料的事情。理论与实践并非总是保持一致:)
n1k31t4

6

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

这需要一些时间来适应,但这是您必须要适应的东西。当您说“如果性能实际上变差了怎么办?”时,答案肯定会发生。实际性能可能比您估计/预测的要差。也可能会更好。两者都有可能。那是不可避免的。存在一些固有的,不可减少的不确定性。

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

您不能让它固定住自己。可能比您预想的还要糟的事实并不是避免将基于数据训练的模型部署到生产中的原因。特别是,如果您不这样做,也可能会做得不好。在所有数据(训练+验证+测试)上训练的模型可能比仅在训练+验证部分上训练的模型更差。也可能会更好。因此,我们不必自找保证,而是要问自己:什么给了我们最大的成功机会?什么是最有效的?

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

特别是,标准做法如下:

  1. 将您的一些数据保留到暂存的测试集中。对于要使用的分数没有严格的规定,但是例如,您可以为测试集保留20%的空间,而将其余80%的空间用于培训和验证。通常,所有分割均应是随机的。

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

  3. 一旦感到满意,就可以冻结架构,超参数等的选择。现在,您的实验已完成。达到这一点后,您将再也无法尝试任何其他选项(而无需获取新的新测试集)-因此,在确定准备就绪之前,请勿达到此点。

  4. 准备就绪后,即可使用之前选择的体系结构和超参数在完整的训练+验证集(占80%)上训练模型。然后,在保留的测试集中测量其准确性。那就是您对这种建模方法将有多精确的估计/预测。您在这里得到一个号码。这个数字就是它的含义:如果您对它不满意,则无法返回第1步和第2步并进行更多实验;那将是无效的。

  5. 最后,对于生产用途,您可以在整个数据集,训练+验证+测试集上训练模型,并将其投入生产使用。请注意,您永远不会衡量该生产模型的准确性,因为您没有任何剩余数据可用于此操作。您已经使用了所有数据。如果您想要估算其性能,可以使用第4步中的估算精度作为对产品性能的预测,因为这是对其未来性能的最佳预测。一如既往,我们无法提供任何保证-鉴于我们所能提供的信息,这仅仅是可能的最佳估计。它肯定有可能比您预期的更糟,或者比您预期的更好-这始终是事实。


即使我不完全同意也可以为此+1 :)例如,当您提到“就预期的性能而言,使用所有数据并不比使用某些数据更糟,并且可能会更好。” 我看不出背后的原因。另一方面,您提到的第二点似乎很重要,交叉验证!因此从本质上讲,您要对所有样本进行训练/验证,因此可能会拒绝所选最终模型中的异常值。感谢您的回答。
pcko1

@ pcko1,原理很简单。如果您有数据,是应该全部使用还是部分使用?为什么?也许当我们获取数据时,在做任何事情之前,我们应该只拿走其中的10%并扔掉它,再也不要去看它。实际上,如果扔掉一些是好的,那么扔掉更多甚至更好,所以也许我们应该扔掉所有数据。太荒谬了吧?为什么?查看您是否可以找出原因,然后尝试将其应用于这种情况。希望这能使您思考!
DW

3

拥有数据集的原因之一是避免过度拟合。如果您使用交叉验证,则实际上是将整个数据集都用作训​​练集,但是重新训练将无法让您验证是否存在过度拟合的迹象。我猜这两种方法(交叉验证或使用整个数据集进行再训练)都不会(根据我的未曾有过的猜测)极大地改变您的结果,但是您将无法进行超参数调整或验证模型性能,有一个测试集。它是否最终会变得更好,这很难说,但是我想知道的唯一方法是随着时间的推移对真实数据进行两个模型的A / B运算。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.