为什么要将数据集分为训练集、验证集、测试集三部分?
对于很多机器学习的初学者来说,这个问题常常令人很迷惑,特别是对于验证集和测试集的区别更让人摸不到头脑。
下面,我谈一下这三个数据集的作用,及必要性:
训练集:显然,每个模型都需要训练集,训练集的作用很明显,就是直接参与模型的训练过程。
测试集:测试集完全不参与训练,就是说模型的产生过程和测试集是完全没有关系的。之所以要求测试集和模型的产生过程完全没有关系,是因为测试集的作用就是验证模型的泛化能力,只有测试集完全不参与模型的产生过程,测试集才能够有效的衡量模型的泛化能力。
验证集:为什么需要验证集呢?很多时候我们通过训练集训练出一个模型,我们想知道该模型的泛化能力怎么样呢?同时我们想根据该模型的泛化能力再反过来调节模型的参数(例如:调节超参数,或者重新训练模型等)。因此,我们需要一个没有直接参与模型训练过程的数据集来评估模型的泛化能力,但是显然该数据集不能是测试集,因为测试集要求完全不参与模型的产生过程,但是我们需要的这个数据集显然参与了模型的产生过程(根据模型在该数据集上的性能表现反过去调整模型的相应参数)。所以验证集就应运而生。
我们常最迷惑的地方就是验证集的作用,总结来说,验证集不直接参与训练过程,但是其参与了模型的产生过程。它是模型调优过程中的关键数据集。
在我看来,任何一个规范的模型训练过程,都需要这三个数据集,因为任何模型都需要训练集;训练出来的模型都需要一个调优的过程(通常不可能你一次训练出的模型就一定有很好的性能表现),因此都需要验证集;在验证集上模型调优结束之后,都需要一个测试集来最终检验模型的性能。(记住,测试集不用于模型的调优,它仅仅是测试最终模型的性能而已,即不能根据测试集的表现再返回去修改模型参数,因为一旦你这么做了就很可能会过拟合测试集,那么测试集也就失去了它存在的意义了)。
在学习过程中参考了一篇论文:https://arxiv.org/abs/1806.00451。该论文对于测试集的作用有着深刻的见解。
如上是我个人在学习过程中的认识和总结,我认为肯定是有不妥和偏差之处,希望多多批评指教!