通过整个数据,我的意思是训练 + 测试 + 验证
一旦我使用验证数据修复了我的超参数,并使用测试数据选择了模型,那么在整个数据上训练一个模型会更好,以便更好地训练参数而不是只训练模型训练数据
通过整个数据,我的意思是训练 + 测试 + 验证
一旦我使用验证数据修复了我的超参数,并使用测试数据选择了模型,那么在整个数据上训练一个模型会更好,以便更好地训练参数而不是只训练模型训练数据
这个问题是基于错误的假设。许多人做你说他们“不能”做的事。
事实上,广泛部署的 sklearn 包中的网格搜索实现就是这样做的。除非refit=False
,它将使用整个数据重新训练最终模型。
我认为对于某些超参数,这可能不是很理想,因为它们与数据量有关。例如,考虑决策树min_samples_leaf
的预剪枝策略。如果您有更多数据,则预修剪可能无法按您的意愿执行。
但同样,大多数人实际上在交叉验证后使用整个数据进行重新训练,以便他们最终得到最好的模型。
附录: @NeilSlater 在下面说有些人在 CV 之上进行了保留。换句话说,他们有一个训练测试拆分,然后在训练中执行模型选择。据他介绍,他们使用原始训练集拆分而不是测试集重新训练。然后使用测试集进行最终的模型估计。就个人而言,我认为这有三个缺陷:(a)它不能解决我提到的问题,因为您无论如何都在重新训练,因此某些超参数依赖于训练量,(b)在测试许多模型时,我更喜欢更复杂诸如嵌套交叉验证之类的方法,这样就不会浪费任何数据,并且 (c) 保留是一种糟糕的方法,可以在数据很少时推断模型将如何泛化。
是的你可以。
由于测试数据应该来自类似分布以训练数据,因此您不会破坏您的模型。如果您已正确训练模型,那么您将不会注意到任何重大变化(除了先前测试/验证数据的更好准确度指标)。
但是很少有测试数据来自与训练数据完全相同的分布,因此在实际应用案例场景中,您可能会获得更好的模型泛化性。
这个问题的答案取决于您使用的训练算法(技术)。例如,我在集成分类中看到了一些方法,其中训练和验证(但不是测试)集在最后结合起来。重要的是要知道,即使验证也主要用于确定超参数,其中一些超参数可以是用于训练的数据的函数。例如,在用于知道何时停止的 DNN 验证中,由于不断调整网络的参数(权重)可能会导致过度拟合,我们需要一种方法来知道何时停止。如果没有验证集,您将在训练过程中盲目行走。另一方面,如果您使用与之前指定的完全相同的迭代次数,则很有可能您不会从这些额外的样本中获益。根本不应该触及测试集,如上所述,如果没有测试集,您将无法评估模型。这是赌博,如果没有估计其对真实数据分布(由测试数据表示)的准确性,您将无法提供任何模型或解决方案。