在使用验证,培训和测试集之间的顺序

时间:2019-01-10 10:36:46

标签: machine-learning cross-validation

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

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

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

  1. 将数据分为训练集,验证集和测试集
  2. 使用训练集拟合模型(找到最佳参数:多项式的系数)。
  3. 然后,使用验证集找到最佳的超参数(在这种情况下为多项式次数)(维基百科文章说:“成功地,使用拟合模型来预测对第二个数据集(称为验证数据集)中的观测值”)
  4. 最后,使用测试集对符合训练集的模型进行评分。

但是,这对我来说似乎很奇怪:如果您还没有选择超参数(在这种情况下是多项式),那么如何用训练集拟合模型?

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

第一种方法

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

第二种方法

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

第三种方法

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

所以问题是:

  • 维基百科的文章是否错误或我缺少什么?
  • 我设想的三种方法正确吗?哪一个更可取?有没有比这三种更好的方法?

2 个答案:

答案 0 :(得分:1)

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

  

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

     

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

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

  

3之后,使用验证集找到最佳的超参数   (在这种情况下,是多项式)(维基百科文章说:   “随后,拟合模型用于预测   第二个数据集中的观测值称为验证数据集“)

这意味着您可以使用验证数据集,使用先前(在训练集上)经过训练的模型来预测其值,从而获得模型在看不见的数据上的性能得分。

对于要查看的所有超参数组合(如果要使用其他多项式,请重复执行步骤2和3)以获得每个超参数组合的得分(例如准确度)。

  

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

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


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

  1. 方法:

    最快,因为您只需为每个超参数训练一个模型。 同样,您也不需要其他两个数据。

  2. 方法:

    最慢,因为您要训练k倍k个分类器以及最后一个带有所有训练数据的分类器,以针对每种超参数组合进行验证。

    您还需要大量数据,因为您将数据拆分了三遍,第一部分又以k倍折叠。

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

  3. 方法:

    的优缺点是在其他两者之间。在这里,过拟合的可能性也较小。

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

答案 1 :(得分:1)

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

有两种解决问题的方法:

  • 任一您都使用了显式的 validation 设置来进行超参数搜索和调整
  • 或者您使用交叉验证

因此,标准点是,您总是将部分数据保留为 test 设置;仅在最终评估模型的性能时才使用此方法(即不进行前后评估和多次评估,因为在这种情况下,您将测试集用作验证集,这是不正确的做法)。

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

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

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