训练集、验证集和测试集小总结
之前一直不大明白测试集(Test set)和验证集(Validation set)的区别,网上也看了很多文章,都不大理解。网上大部分说二者的区别在于调参, 但有时候我们不是也可以在训练集(Learning set)或者测试集上调参吗?
直到最近做试验,亲自划分这三个集,才对这个调参有了理解。
1 .三个集同时存在时
当训练模型的时候, 我们将整个数据集分成三部分。 通常是2/3的数据(暂时不将它称为训练集)用于训练模型,1/3的数据(测试集)用来测试模型的泛化能力(Generalization)(这才是测试集的意义!!!!!)。
而训练模型的那部分数据,再次分成2/3和1/3, 这时2/3的真正训练模型使用的数据我们就作为训练集,剩余的1/3就是我们的验证集了。
好,现在我们开始训练模型, 大部分的模型都有超参数(Hyperparameter),而超参数的选择也决定最终的模型效果。 因此,在建模过程中, 我们不得不考虑如何选择最优的超参数。
举个例子, 对于一个岭回归,正则化系数lambda就是一个超参数。我们应用训练集和验证集进行建模及调参的思路是:
在训练集上用某一个lambda的值进行建模, 再用该模型预测验证集, 这样我们就能得到一个该模型在验证集上的表现(回归问题可以用均方误差,分类问题则可以用准确率)。如果我们遍历lambda的所有取值(必须是预先是要考虑一个范围的哈),我们就可以得到一系列模型在验证集的表现,而表现最好的那个模型对应的lambda,就认为是最优的超参数。 这样, 就实现了在验证集上的调参。
可能有人会问, 为什么不直接用模型预测训练集,看在训练集上的表现而调参呢? 其实也不是不可以,但就是没那么合适。 举个例子,你用一本练习册进行学习, 最后考试的内容也出自这本练习册,可想而知最后的成绩会偏高,而不能很好的反映你的能力(练习册理论 , 不用baidu,这是我自己的理论)。所以说模型在训练集上的表现通常仅用来对模型进行初步判断 (试想一个模型在训练集上都表现糟糕,那基本上就是废了!),不适用调整参数。 而模型在训练集上的表现,往往用来发现是否存在过拟合现象。
继续回到例子中来, 一旦我们找到了这个最优的lambda, 我们就可以认为在模型中的超参数可以设定为这个值。然后使用这个超参数进行训练模型,而这个最终模型,可以由训练集+最优超参数得到,也可以由训练集+验证集(既最开始说的用于训练模型的2/3的数据)+最优超参数得到。
到此为止,模型的训练结束,得到模型!!!
你会发现,在获得最终模型的过程中,我们并没有动测试集。 因为测试集并不用于建模,也就不会涉及测试集调参这一说法。测试集仅用于评估模型的泛化能力,当然,单纯看一个模型的泛化能力也不是很好理解(这一泛化能力究竟是好是坏),所以通常比较不同模型在测试集上的表现(比如岭回归和lasso回归),这样我们就可以对不同模型进行比较。
这就是在训练模型的过程中三个数集的作用,你学废了么?
2 .两个集
当然,两个数集走天下也是比较常见的(毕竟我最开始都只用一个数集披荆斩棘!!)
这时候,要么就是不调参(得到一个准确率90%的模型就可以了,要啥自行车), 要么就是有一个数集进行调参了。 此时我建议,强烈建议使用“测试集”进行调参,理由是练习册理论。 因此,实际上,‘测试集’ 就同时充当了验证集和测试集。所以,在只有两个集的时候, 有时候我们叫训练集和测试集,有时候叫训练集和验证集,这也就是导致我们总是对他们傻傻分不清楚的原因了。
最后最后最后, 提一个问题,在不考虑交叉验证这一逆天存在的情况下, 你认为划分三个集很有必要,还是说两个就足矣了呢?
CIAO
九楼
04/11/2020