在我们进行输出处理时要将数据集划分为训练集、验证集、测试集。当我们模型训练后为什么不在训练集上对模型进行评估呢?原因很简单:我们如果采用训练集进行模型评估,仅仅过去几轮,模型就会过拟合,也就是模型在训练数据上始终在提高,但是在前所未见的数据(也就是不在训练集内的数据)上的性能则不再变化,甚至是开始下降。
机器学习的目的是得到可以泛化的模型,在前所未见的数据上表现得很好的模型。所以我们就有了我们通过评估模型,来可靠的衡量模型泛化的能力。
评估模型的重点在于将数据划分为三个集合:训练集、验证集、测试集。当然我们有新的问题了,为什么为什么不是两个集合?一个训练集一个测试集?在训练集上训练模型,在测试集上进行评估模型。但是我们在开发模型时需要调节模型配置,这个调节过程需要使用模型在验证集数据上的性能作为反馈信号,当然这个调节过程的本质就是一种学习:在某个空间上寻找良好的模型配置。所以基于模型在验证集上的性能来调节模型配置时,会很快导致模型在验证集上过拟合,即使你并没有在验证集上直接、训练也是如此。造成这一现象的原因就是信息泄露,每次在基于模型在验证集上的性能来调节模型的超参数(比如选择层数和层数的大小),都会有一定有关于验证数据的信息泄漏到模型中去;如果对每个参数只调节一次,那么泄露的信息就会很少;验证集也能很好的评估模型,但是我们是多次重复这一过程,会造成越来越多的验证集信息泄露到模型中去;最后你得到的模型在验证集上的性能非常的好,但是我们关注的不是验证集的性能,而是模型在一个前所未有的数据上的性能。
我们将数据划分为训练集、验证集、测试集听起来很简单,但是如果可用的数据很少,还有几种高级的方法,这里介绍一下三种经典的评估方法:简单的留出验证、K折验证,以及带有打乱数据的重复K折验证。