训练集:确定模型的参数;
验证集:确定模型的超参数;(如多项式的次数N)
测试集:评估模型的泛化性能,选择最优模型;
例子:色泽、根蒂、敲声来确定好瓜还是坏瓜。将数据分成训练集、验证集、测试集
1、决策树模型,选定初始预剪枝的参数值,用训练集训练,生成模型;改变预剪枝参数值若干次,用训练集训练,生成若干模型,用验证集检验正确率,确定最优的预剪枝参数值;
2、多项式回归,选定多项式次数N,用训练集训练,生成模型;改变多项式次数N若干次,用训练集训练,生成若干模型,用验证集验证正确率,确定最优的多项式次数N。
用测试集分别测试决策时模型和多项式模型,确定两者的泛化性能,选择最优模型。
下面的伪代码写的很清晰
# split data
data = ...
train, validation, test = split(data)
# tune model hyperparameters
parameters = ...
for params in parameters:
model = fit(train)
skill = evaluate(model, validation)
# evaluate final model for comparison with other models
model = fit(train)
skill = evaluate(model, test)
补充:有人说,是不是可以把验证集和测试集合并起来,即只有训练集和测试集,然后对于每个超参值,都用训练集训练出其余参数,根据测试集确定最优的超参和模型。
我个人认为这种方法不好的地方在于:超参的确定和最优模型的确定两者在同一个步骤里完成,这样是有风险的:超参的确定我认为实际上也是使得拟合最优,本质上还是参数的确定,而把参数确定和泛化性能检验合并,则依然存在过拟合的风险,而分成3个集合的话,第一步确定参数,第二部确定超参,第三部确定最优模型,这样可以把过拟合的风险大大降低,即测试集必须在所有参数(参数和超参数)都确定的条件下才能够使用,用来评估模型的泛化性能。否则借用测试集确定超参数,那么评估时,对于泛化性能一定是较好的。
所以对于之前提出的问题,为什么k折交叉验证可以没有验证集,我认为可能是因为进行重抽样后,泛化性能本身就可以得到检验了,因此验证集和测试集只需要一个了。
————————————————————————————————————————————
最近看了《深度学习》一书中对此问题的阐述,讲得还算清晰。
以最简单的广义线性回归为例,有一个超参数:即多项式的次数,作为容量超参数。像lasso等回归还有另一个超参数,控制权重衰减程度的 λ是另一个超参数。有时一个选项被设为学习算法不用学习的超参数,是因为它太难优化了。更多的情况是,该选项必须是超参数,因为它不适合在训练集上学习。这适用于控制模型容量的所有超参数。如果在训练集上学习超参数,这些超参数总是趋向于最大可能的模型容量,导致过拟合(参考图5.3 )。例如,相比低次多项式和正的权重衰减设定,更高次的多项式和权重衰减参数设定 λ = 0 总能在训练集上更好地拟合。为了解决这个问题,我们需要一个训练算法观测不到的 验证集(validation set)样本。
早先我们讨论过和训练数据相同分布的样本组成的测试集,它可以用来估计学习过程完成之后的学习器的泛化误差。其重点在于测试样本不能以任何形式参与到模型的选择中,包括设定超参数。基于这个原因,测试集中的样本不能用于验证集。因此,我们总是从训练数据中构建验证集。特别地,我们将训练数据分成两个不相交的子集。其中一个用于学习参数。另一个作为验证集,用于估计训练中或训练后的泛化误差,更新超参数。用于学习参数的数据子集通常仍被称为训练集,尽管这会和整个训练过程用到的更大的数据集相混。用于挑选超参数的数据子集被称为 验证集(validation set)。通常, 80% 的训练数据用于训练, 20% 用于验证。由于验证集是用来 ‘‘训练’’超参数的,尽管验证集的误差通常会比训练集误差小,验证集会低估泛化误差。所有超参数优化完成之后,泛化误差可能会通过测试集来估计。
在实际中,当相同的测试集已在很多年中重复地用于评估不同算法的性能,并且考虑学术界在该测试集上的各种尝试,我们最后可能也会对测试集有着乐观的估计。基准会因之变得陈旧,而不能反映系统的真实性能。值得庆幸的是,学术界往往会移到新的(通常会更巨大、更具挑战性)基准数据集上。
——摘自《深度学习》
通过上面的阐述应该能对训练集、验证集和测试集有一个比较好的了解了。
————————————————————————————————————————
参考文献:
伊恩·古德费洛,约书亚·本吉奥,亚伦·库维尔.《深度学习》