集和
在对机器学习算法进行学习和实践的时候,我们经常会遇到“验证集”和“测试集”,通常的机器学习书籍都会告诉我们,验证集和测试集不相交,验证集和训练集不相交,测试集和训练集不相交。也就是验证集与测试集似乎是同一级的东西,那么我们自然而然会有一个困惑为什么还要分测试集和验证集呢?
其实问题的答案是:训练集用于训练模型参数,测试集用于估计模型对样本的泛化误差,验证集用于“训练”模型的超参数。
什么是模型的参数
我们知道一个机器学习模型通常包括两个部分的参数:模型参数和超参数。其中超参数是用于控制模型行为的参数,这些参数不是通过模型本身学习而来的。例如多项式回归模型里面,多项式的次数,学习速率是超参数。这些超参数不能由模型本身训练得到是因为模型会倾向于把超参数训练的过大或者过小,从而极易导致过拟合。例如多项式回归模型里面,如果让模型本身去训练多项式的次数,那么模型会选择高次多项式,因为这样做误差可以取到特别小,极端情况下,N个点的多项式回归会选择次数N。
然而这些超参数,也会有不同的选择,例如学习速率可以选择0.1,0.01,1,10···那么我们怎么知道超参数的某个值会比另外一个好呢?一个很自然的想法是我们可以选择不同的超参数的值,然后跑在同一个训练集上再看最后的结果。但是这样会有一个类似的问题:如果使用训练集来选择超参数,那么超参数总是会往增加模型容量的方向发展。举个多项式的例子:如果训练集里面有100个点,然后我们让多项式的次数依次为1,10,20,100。然后让模型跑这个训练集,等训练集误差收敛后,我们再看在这个相同训练集,选择那个参数会取得最小的训练误差。。。显然选择次数100会是取得最小的训练误差···然而这显然会过拟合。那又怎么办呢?方法很简单,只要从这100个训练样本中取出一部分样本,让模型训练的过程看不到这些样本。然后再计算模型在这一部分样本中的表现,即可选择出合适的超参数。这种方式下得到的超参数最起码会比前一种方法更合理,更不会过拟合。而这一小部分样本,就是验证集啦