Training Set, Test Set and Validation Set
在机器学习中我们大家一定都接触过这三个数据集,那他们有什么区别,又分别应用于什么场景呢,接下来发表一下我个人的观点。
训练集与测试集
刚接触机器学习的小伙伴肯定是最早使用的是训练集和测试集,训练集测试集加模型可以构成一个很初级的机器学习项目,那他们使用来干什么的呢。
训练集,顾名思义它是用来训练模型的,为了减少泛化误差,我们需要通过训练集不断的训练来使得我们的模型能够更好的接近真实数据。
测试集,用来测试模型的准确性,我们将测试集应用于训练集训练好的模型,会得到一个模型的得分,例如混淆矩阵(Consufion Matrix),recall,f1等得分。
这里有几个点需要注意
一般我们划分训练集和测试集的比例是8:2为了防止数据窥探偏误和数据污染,我们需要去保证训练集和测试集的数据纯洁性,也就是在工作流程中,我们不能使用在测试数据集上计算的得到的任何结果。我们在训练时需要把测试集当成完全不存在的数据。
验证集
当小伙伴更加进一步了解机器学习后,他们会发现还有一个叫验证集的东西,听起来和测试集差不多,就会有很多小伙伴很困惑,这里我来简单介绍下我的看法。
我们知道我们在搭建一个模型之前会对模型的一些参数进行设置,我们称之为超参数(HyperParameter)例如神经网络的层数和每层的节点数,随机森林的决策树树量等,这些参数也会极大的影响我们的模型得分,有专门的算法可以用来调整这些超参数,例如网格搜索、随机搜索,贝叶斯优化等这些我们以后再提。
我们知道模型会通过训练集的loss function,使用梯度下降来调节模型的参数,而超参数一旦确定要想更改就几乎等于重新训练一个模型,验证集的其中一个作用就是,调节超参数使得模型泛化能力最强,根据几组模型验证集上的表现决定哪组超参数拥有最好的性能。
验证集与测试集
验证集(validation set): 查看模型训练的效果是否朝着坏的方向进行。验证集的作用是体现在训练的过程。举个栗子:通过查看训练集和验证集的损失值随着epoch的变化关系可以看出模型是否过拟合,如果是可以及时停止训练,然后根据情况调整模型结构和超参数,大大节省时间。
测试集(test set): 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。测试集的作用是体现在测试的过程。
对原始数据进行三个数据集的划分,也是为了防止模型过拟合。当使用了所有的原始数据去训练模型,得到的结果很可能是该模型最大程度地拟合了原始数据,亦即该模型是为了拟合所有原始数据而存在。当新的样本出现,再使用该模型进行预测,效果可能还不如只使用一部分数据训练的模型。
一般我们划分数据集比例是训练集:验证集:测试集 = 6:2:2
当数据集很大时也可以训练集:验证集:测试集 = 98:1:1