你有一个训练集和一个测试集。您将它们结合起来并执行 GridSearch 之类的操作来确定模型的超参数。然后,您使用这些超参数在训练集上拟合一个模型,并使用测试集对其进行评估。
这是过拟合吗?最终,数据没有适合测试集,但在决定超参数时考虑了测试集。
你有一个训练集和一个测试集。您将它们结合起来并执行 GridSearch 之类的操作来确定模型的超参数。然后,您使用这些超参数在训练集上拟合一个模型,并使用测试集对其进行评估。
这是过拟合吗?最终,数据没有适合测试集,但在决定超参数时考虑了测试集。
保持和交叉验证背后的想法是估计学习算法的泛化性能 - 即从与训练数据相同的分布中提取的未知/未见数据的预期性能。这可用于调整超参数或报告最终性能。该估计的有效性取决于用于训练和估计性能的数据的独立性。如果违反了这种独立性,则性能估计将出现过度乐观的偏差。可能发生这种情况的最令人震惊的方式是通过估计已经用于训练或超参数调整的数据的性能,但也有许多更微妙和阴险的方式。
您询问的程序在多个方面出错。首先,相同的数据用于训练和超参数调整。超参数调整的目标是选择能够提供良好泛化性能的超参数。通常,这是通过估计不同选择的超参数(例如使用验证集)的泛化性能,然后选择最佳的。但是,如上所述,如果相同的数据用于训练,这个估计将过于乐观。结果是将选择次优的超参数。特别是,将倾向于过度拟合的高容量模型。
其次,已经用于调整超参数的数据正在被重新用于估计性能。如上所述,这将给出一个欺骗性的估计。这本身并不是过度拟合,但它意味着,如果发生了过度拟合(很可能是,如上所述),那么您将不会知道。
补救措施是使用三个独立的数据集:用于训练的训练集、用于超参数调整的验证集和用于估计最终性能的测试集。或者,使用嵌套交叉验证,这将提供更好的估计,并且在没有足够数据的情况下是必要的。
是的,你过拟合了。测试集应仅用于测试,不能用于参数调整。在测试集上搜索参数将学习测试集中存在的规则,并最终过拟合。
我会说你不一定是过度拟合,因为过度拟合是一个通常用来表示你的模型不能很好概括的术语。例如,如果您要对诸如 MNIST 图像之类的东西进行线性回归,那么在对训练数据和测试数据进行训练时,您可能仍然欠拟合(它没有足够的泛化能力)。
但是,您正在做的事情仍然不是一件好事。测试集通常是数据的一部分,您希望使用它来检查最终经过训练的模型在从未见过的数据上的表现如何。如果你使用这些数据来选择超参数,你实际上让模型有机会“看到”测试数据并产生对这个测试数据的偏见。因此,您实际上失去了了解您的模型在看不见的数据上的实际效果的可能性(因为它已经看到了测试数据)。
您可能并不真正关心模型的性能如何,但是您也不需要测试集。因为在大多数情况下,您确实想知道模型有多好,所以最好在开始对数据进行任何操作之前锁定测试数据。像在预处理过程中使用测试数据这样的事情,可能会导致模型有偏差。
现在您可能会问自己:“那我应该如何找到超参数?”。最简单的方法是将可用数据(假设您已经安全地存放一些用于测试的数据)拆分为训练集和所谓的验证集。如果您的数据很少,那么查看交叉验证可能更有意义
它不一定是过拟合,但它也会带来不必要的过拟合风险,并且你剥夺了自己检测过拟合的可能性。
当您的模型过于复杂/可用训练数据的自由度过多时,就会发生过度拟合。这包括您搜索的超参数空间的自由度。因此,如果您的数据集仍然足够大,则不会过度拟合(例如,您有数千个案例,只需回归两个变量和一个要调整的连续超参数 - 这可能仍然可以。另一方面,如果你有少数案例、成百上千个变量和一个大的超参数搜索空间,你就会冒着过度拟合的巨大风险)。
但是随着所有数据进入训练阶段(在超参数优化期间),您失去了测量泛化误差的机会,因此无法检查/显示您没有过度拟合。 这与过度拟合一样糟糕,除非您可以提供其他证据证明您没有处于可能发生过度拟合的情况。
此外,你用衡量泛化误差的能力换取了最多一分钟的训练改进:你可以(也应该)在训练集上完成了整个训练——这就是它的目的。训练包括修复超参数。
从这个角度来看,决定实际上是您是否需要基于未知数据进行错误估计(再次基于过度拟合的总体风险 - 在机器学习中,决定几乎总是未知数据性能是需要),然后要么对您的数据进行整个训练,要么对训练集进行整个训练并使用测试集进行测试。(或者可能在交叉验证中的多个这样的训练/测试拆分上)。