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

Order between using validation, training and test sets

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

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

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

  1. 将数据拆分为训练集、验证集和测试集
  2. 使用训练集来拟合模型(找到最佳参数:多项式的系数)。
  3. 之后,使用验证集找到最好的超参数(在这种情况下,多项式次数)(维基百科文章说:"Successively, the fitted model is used to predict the responses for the observations in a second dataset called the validation dataset")
  4. 最后用测试集给训练集拟合的模型打分

然而,这对我来说似乎很奇怪:如果您还没有选择超参数(在本例中为多项式次数),您如何使您的模型与训练集相匹配?

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

第一种方法

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

第二种方法

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

第三种方法

  1. 将数据分成只有两个集合:training/validation集合和测试集合
  2. 对于每个多项式次数,仅在 training/validation 集 上使用交叉验证 来拟合和评分模型
  3. 对于得分最高的多项式次数,用training/validation集拟合模型。
  4. 用测试集进行评估

所以问题是:

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

维基百科的意思实际上是您的第一种方法。

1 Split data into training set, validation set and test set

2 Use the training set to fit the model (find the best parameters: coefficients of the polynomial).

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

3 Afterwards, use the validation set to find the best hyper-parameters (in this case, polynomial degree) (wikipedia article says: "Successively, the fitted model is used to predict the responses for the observations in a second dataset called the validation dataset")

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

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

Finally, use the test set to score the model fitted with the training set.

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


最后你可以使用你的三个方法中的任何一个。

  1. 方法:

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

  2. 方法:

    是最慢的,因为您训练了 k 折 k 个分类器加上最后一个分类器和所有训练数据以针对每个超参数组合对其进行验证。

    您还需要大量数据,因为您将数据拆分了三次,而第一部分又分成了 k 份。

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

  3. 方法:

    处于其他两者之间的优缺点。在这里你也不太可能过度拟合。

最后这将取决于你有多少数据,如果你进入更复杂的模型,如神经网络,你有多少 time/calculationpower 并且愿意花钱。

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

维基百科文章没有错;根据我自己的经验,这是ML新手经常混淆的地方。

有两种解决问题的方法:

  • 要么你使用显式验证集来进行超参数搜索和调整
  • 或者你使用交叉验证

所以,标准点是你总是把你的一部分数据留作test集;除了最终评估模型的性能外,没有其他原因使用它(即不是来回和多次评估,因为在这种情况下,您将测试集用作验证集,这是不好的做法)。

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

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

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