我正在尝试理解机器学习中模型评估和验证的过程。具体来说,我想知道训练集、验证集和测试集应该如何以及以什么顺序使用。
假设我有一个数据集,我想使用线性回归。我在不同的多项式阶数(超参数)之间犹豫不决。
在这篇维基百科文章中,似乎暗示顺序应该是:
- 将数据划分为训练集、验证集和测试集
- 使用训练集来拟合模型(找到最佳参数:多项式的系数)。
- 之后,使用验证集来找到最佳超参数(在这种情况下,是多项式的阶数)(维基百科文章说:“连续地,使用拟合的模型来预测第二个数据集(称为验证数据集)中的观测值的响应”)
- 最后,使用测试集来评分使用训练集拟合的模型。
然而,这对我来说似乎很奇怪:如果你还没有选择你的超参数(在这种情况下是多项式的阶数),你怎么能用训练集来拟合你的模型呢?
我看到了三种替代方法,我不确定它们是否正确。
第一种方法
- 将数据划分为训练集、验证集和测试集
- 对于每个多项式阶数,使用训练集来拟合模型,并使用验证集给出分数。
- 对于得分最高的多项式阶数,使用训练集来拟合模型。
- 使用测试集进行评估
第二种方法
- 将数据划分为训练集、验证集和测试集
- 对于每个多项式阶数,仅在验证集上使用交叉验证来拟合和评分模型
- 对于得分最高的多项式阶数,使用训练集来拟合模型。
- 使用测试集进行评估
第三种方法
- 将数据仅划分为两部分:训练/验证集和测试集
- 对于每个多项式阶数,仅在训练/验证集上使用交叉验证来拟合和评分模型
- 对于得分最高的多项式阶数,使用训练/验证集来拟合模型。
- 使用测试集进行评估
所以问题是:
- 维基百科文章是错误的还是我错过了什么?
- 我设想的三种方法是否正确?哪一种更可取?是否有比这三种更好的方法?
回答:
维基百科的意思实际上是你的第一种方法。
1 将数据划分为训练集、验证集和测试集
2 使用训练集来拟合模型(找到最佳参数:多项式的系数)。
这只是意味着你使用你的训练数据来拟合模型。
3 之后,使用验证集来找到最佳超参数(在这种情况下,是多项式的阶数)(维基百科文章说:“连续地,使用拟合的模型来预测第二个数据集(称为验证数据集)中的观测值的响应”)
这意味着你使用你的验证数据集来预测其值,使用之前(在训练集上)训练的模型,以获得模型在未见数据上的表现分数。
你会对所有你想查看的超参数组合重复步骤2和3(在你的情况下是你想尝试的不同多项式阶数),以获得每个超参数组合的分数(例如准确率)。
最后,使用测试集来评分使用训练集拟合的模型。
为什么需要验证集,在这个stackexchange问题中解释得很好 https://datascience.stackexchange.com/questions/18339/why-use-both-validation-set-and-test-set
最后,你可以使用你的三种方法中的任何一种。
-
方法:
是最快的,因为你只为每个超参数训练一个模型。你也不需要像其他两种方法那样多的数据。
-
方法:
是最慢的,因为你为k个折叠训练k个分类器,加上所有训练数据的最终一个来验证每个超参数组合。
你还需要大量数据,因为你将数据分成了三次,并且第一次部分又分成了k个折叠。
但在这里,你的结果方差最小。通过巧合得到k个好的分类器和一个好的验证结果的可能性很小。这在第一种方法中更可能发生。交叉验证也更不可能过拟合。
-
方法:
其优缺点介于另外两种方法之间。这里也更不可能过拟合。
最后,这将取决于你有多少数据,以及如果你进入更复杂的模型如神经网络,你有多少时间/计算能力以及你愿意花费多少。
编辑 正如@***提到的:请记住,你应该将训练集和验证集作为训练数据用于测试集的评估。你在第二种方法中混淆了训练集和验证集。