使用验证集、训练集和测试集之间的顺序

Posted

技术标签:

【中文标题】使用验证集、训练集和测试集之间的顺序【英文标题】:Order between using validation, training and test sets 【发布时间】:2019-06-05 05:05:44 【问题描述】:

我正在尝试了解机器学习中模型评估和验证的过程。具体来说,必须以何种顺序以及如何使用训练、验证和测试集。

假设我有一个数据集,我想使用线性回归。我在各种多项式次数(超参数)中犹豫不决。

在this wikipedia article中,似乎暗示顺序应该是:

    将数据拆分为训练集、验证集和测试集 使用训练集拟合模型(找到最佳参数:多项式的系数)。 之后,使用验证集找到最佳超参数(在本例中为多项式次数)(***文章说:“成功地,拟合模型用于预测观察结果的响应第二个数据集称为验证数据集”) 最后,使用测试集对拟合训练集的模型进行评分。

但是,这对我来说似乎很奇怪:如果您还没有选择超参数(在这种情况下为多项式次数),如何让您的模型与训练集相匹配?

我看到了三种替代方法,我不确定它们是否正确。

第一种方法

    将数据拆分为训练集、验证集和测试集 对于每个多项式次数,将模型与训练集进行拟合,并使用验证集为其打分。 对于得分最高的多项式次数,用训练集拟合模型。 使用测试集进行评估

第二种方法

    将数据拆分为训练集、验证集和测试集 对于每个多项式次数,仅在验证集上使用交叉验证来拟合和评分模型 对于得分最高的多项式次数,用训练集拟合模型。 使用测试集进行评估

第三种方法

    将数据分成两组:训练/验证集和测试集 对于每个多项式次数,仅在训练/验证集上使用交叉验证来拟合和评分模型 对于得分最高的多项式次数,使用训练/验证集拟合模型。 使用测试集进行评估

所以问题是:

是***的文章有误还是我遗漏了什么? 我设想的三种方法是否正确?哪一个更可取?还有比这三种更好的方法吗?

【问题讨论】:

【参考方案1】:

***的文章没有错;根据我自己的经验,这是 ML 新手经常感到困惑的地方。

解决问题有两种不同的方法:

要么您使用明确的验证集来进行超参数搜索和调整 或者您使用交叉验证

因此,标准点是您始终将一部分数据作为测试集放在一边;这仅用于最终评估模型的性能(即不是来回和多次评估,因为在这种情况下您将测试集用作验证集,这是不好的做法)。

完成此操作后,您可以选择是剪切剩余数据的另一部分以用作单独的验证集,还是继续进行交叉验证(在这种情况下,不需要单独的和固定的验证集)。

因此,基本上,您的第一种和第三种方法都是有效的(并且相互排斥,即您应该选择要使用的方法)。第二个,正如您所描述的(CV 仅在验证集中?),当然不是(如前所述,当您选择使用 CV 时,您不会分配单独的验证集)。除了简要提及交叉验证之外,***文章实际描述的是您的第一种方法。

当然不能在一般性水平上回答哪种方法“更好”的问题;这两种方法确实有效,并根据情况使用。非常笼统地说,我想说在大多数“传统”(即非深度学习)ML 设置中,大多数人选择使用交叉验证;但在某些情况下,这是不切实际的(大多数深度学习设置,同样松散地说),人们会使用单独的验证集。

【讨论】:

感谢百万沙漠英雄!非常有帮助! :)【参考方案2】:

***的意思实际上是你的第一种方法。

1 将数据拆分为训练集、验证集和测试集

2 使用 训练集以拟合模型(找到最佳参数:系数 多项式)。

这只是意味着您使用训练数据来拟合模型。

3 之后,使用验证集找到最佳超参数 (在这种情况下,多项式次数)(***文章说: “成功地,拟合模型用于预测响应 第二个数据集中的观察结果称为验证数据集”)

这意味着您使用您的验证数据集来预测其与先前(在训练集上)训练的模型的值,以获得您的模型在看不见的数据上的表现。

您对要查看的所有超参数组合(在您的情况下是您要尝试的不同多项式次数)重复第 2 步和第 3 步,以获得每个超参数组合的分数(例如准确度)。

最后,使用测试集对训练拟合的模型进行评分 设置。

这个 stackexchange 问题很好地解释了为什么需要验证集 https://datascience.stackexchange.com/questions/18339/why-use-both-validation-set-and-test-set


最后,您可以使用三种方法中的任何一种。

    方法:

    是最快的,因为您只为每个超参数训练一个模型。 你也不需要像其他两个那样多的数据。

    方法:

    是最慢的,因为您训练了 k 折叠 k 分类器加上最后一个分类器,并使用所有训练数据来验证每个超参数组合。

    您还需要大量数据,因为您将数据拆分了 3 次,并将第一部分再次分成 k 折。

    但在这里,您的结果差异最小。巧合地获得 k 个好的分类器和好的验证结果几乎是不可能的。在第一种方法中,这种情况更有可能发生。交叉验证也不太可能过拟合。

    方法:

    在其他两者之间有其优点和缺点。在这里,您也不太可能过度拟合。

最终,这将取决于您拥有多少数据,以及您是否进入神经网络等更复杂的模型,您拥有并愿意花费多少时间/计算能力。

编辑正如@desertnaut 提到的:请记住,您应该使用训练集和验证集作为训练数据,以使用测试集进行评估。您还在第二种方法中将训练与验证集混淆了。

【讨论】:

方法#2实际上是有问题的,你没有指出;除了在 validation 集上使用 CV 听起来很奇怪之外,您最终还会丢弃数据(即不使用它们来拟合 final 模型),这很可能是不可取的,尤其是在每个样本都很有价值的数据稀缺环境中。事实上,即使使用方法 #1,我们通常会在使用包含验证数据的情况下重新训练模型,然后再使用测试集评估其性能,这也是几乎开箱即用的操作现在用于交叉验证案例(用整个数据重新拟合) @desertnaut 你说得对,他切换了训练集和验证集,我读多了。但是恕我直言,这并没有改变方法,它只是混淆了“训练集”和“验证集”的名称。我编辑我的帖子以阐明您应该使用训练和测试数据来训练验证集的部分。

以上是关于使用验证集、训练集和测试集之间的顺序的主要内容,如果未能解决你的问题,请参考以下文章

测试数据集 和验证数据集 之间的区别

训练集和测试集

训练集、验证集和测试集

验证集与测试集有啥区别?为啥要分训练集、验证集和测试集?

神经网络中的训练集、验证集和测试集有啥区别?

训练集,验证集,测试集的作用