机器学习的过程是选择模型在数据集进行学习,训练模型,训练的过程就是使得误差损失韩函数最小化,得到一个合理的模型投入到真实环境中。
数据集的划分涉及到如何选择机器学习模型,诊断选择的模型是否有效。模型的最终目标就是为了在实际的环境下运用,那么在真实场景下模型的误差就是我们训练的目标,这个误差被称为泛化误差,在训练的过程中就是为了不断缩小这个误差而进行。
泛化误差本身是难以被我们所直接使用的,它需要在真实的环境中才能得到,当遇到模型误差较大的情况下,只能重新撤回训练之后再部署,会浪费很多资源也成本极大。
训练的数据样本是人为筛选的结果,与真实的环境是不相符的,比如说样本的数据量比较小,代表性不够强,有一些其他的噪声特征的污染等情况出现,导致在训练数据集上得到的误差值无法估计真实的泛化误差,有可能在训练集上的误差很小但是真实泛化误差很大的情况出现,这与训练集的选取有关。
为了模拟泛化误差,将数据集划分成训练集和测试集,在训练集上训练模型,然后再测试集上测试模型,将得到再测试集上得到的误差值作为真实泛化误差的近似估计。有了这个误差值作为参考,可以筛选出在测试集上误差更小的模型作为最终的结果输出,训练的目标就是使得模型在测试集上的误差值最小。
在划分数据集的过程中,不能带有主观性去分割,而应该随机均匀的进行划分处理。两个数据集的大小比例可以设置为4:1或者10:1.
关于训练集上样本数据的预处理工作,但是测试集上一般不做对应的处理,而是直接使用训练集上得到的中位数。通常我们在构建模型的时候需要将数据进行处理,包括一些数据的清洗,数据的特征缩放(标准化或者归一化),此时我们只需要在训练集上进行这些操作,然后将其在训练集上得到的模型参数应用到测试集中求得误差值,也就是说,在工作流程中,你不能使用在测试数据集上计算的得到的任何结果。比如:我们得到的属性中可能有缺失值,因为在这些操作之前,我们已经把数据集分成了训练集和测试集,通常的做法是通过计算属性值的中位数来填充缺失值,注意此时计算属性值的中位数是通过训练集上的数据进行计算的,当我们得到一个模型的时候,如果想要测试模型的测试误差来近似泛化误差的时候,可能此时的测试集也会有一些缺失值,此时对应属性的缺失值是通过训练集计算的中位数来进行填充的;
由于测试集作为对泛化误差的近似,所以训练好模型,最后在测试集上近似估计模型的泛化能力。此时假设有两个不同的机器学习模型,犹豫不决的时候,可以通过训练两个模型,然后对比他们在测试数据上的泛化误差,选择泛化能力强的模型。
在对比调节模型超参数的时候,我们也会选择在测试集上误差值较小的那一个模型,因为这个误差值作为泛化误差的估计来衡量模型的泛化能力,但是多轮选择下来可能会筛选出在测试集上误差接近于0的模型最为最终结果,这就是在测试集上出现了过拟合的情况,这种情况下的模型的泛化能力一定是极差的。
这种现象就是信息泄漏的情况,类似于考生提前知道了考题得到的分数自然就提升了。模型在调参的过程中根据测试集上的误差值表现,会挑出更利于测试集分布结果的参数组合,测试集的表现成为了调参偏好的依据,所以最后就和真实数据的偏好可能相差很大。是人为调参导致了数据泄露。
一般随机的把数据分成三份,一份为训练集(Training Set),一份为验证集(Validation Set),最后一份为测试集(Test Set)。用训练集来训练模型,用验证集来评估模型预测的好坏和选择模型及其对应的参数。把最终得到的模型再用于测试集,测试集上的误差作为泛化误差的近似。这三种数据集的比例可以根据自身模型的情况进行调整,数据规模较小时使用3:1:1,较大时使用98:1:1.
在完全防止信息泄露的情况下,一般模型在测试集上的准确率惨不忍睹,会比验证集上出现明显下降,完全防止leak现象的出现很难,也不现实。
在样本规模较小时,交叉验证是在机器学习建立模型和验证模型参数时常用的办法。交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。
根据切分的方法不同,交叉验证分为下面三种:
第一种是简单交叉验证,所谓的简单,是和其他交叉验证方法相对而言的。首先,我们随机的将样本数据分为两部分(比如: 70%的训练集,30%的测试集),然后用训练集来训练模型,在测试集上验证模型及参数。接着,我们再把样本打乱,重新选择训练集和测试集,继续训练数据和检验模型。最后我们选择损失函数评估最优的模型和参数。
第二种是S折交叉验证(S-Folder Cross Validation)。和第一种方法不同,S折交叉验证会把样本数据随机的分成S份,每次随机的选择S-1份作为训练集,剩下的1份做测试集。当这一轮完成后,重新随机选择S-1份来训练数据。若干轮(小于S)之后,选择损失函数评估最优的模型参数。
第三种是留一交叉验证(Leave-one-out Cross Validation),它是第二种情况的特例,此时S等于样本数N,这样对于N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型预测的好坏。此方法主要用于样本量非常少的情况,比如对于普通适中问题,N小于50时,我一般采用留一交叉验证。