Cross-Validation概述

Cross Validation

概述

  在同一个数据集上对训练好的模型进行重复测试从方法上来说就是一种错误。这样生成的模型对它重复看到的样本标签有一个完美的预测分数,但是却不能预测到未知数据中任何有用的东西。这种情况就叫做过拟合(overfitting)。避免过拟合的方法一般是把训练数据集中的一部分数据分割出来作为测试集。通过这个测试集就可以知道模型的泛化能力以及是否过拟合。这就好比一个学生在做数学题,如果他只做了立体几何的题目,而且对于这个类型的题目反复训练,最终他解这个类型的题目肯定得心应手;但是如果你拿三角函数的题目给他做,那他肯定是不会的。立体几何题目就相当于训练集,而三角函数的题目相当于测试集。在scikit-learn中随机切分数据集成训练集和测试集的函数为sklearn.model_selection中的train_test_split函数。

  当我们在评估模型的不同参数时,比如SVM中的C值需要我们人工去设定。如果我们为了避免过拟合而利用上述所说的测试集进行测试然后来调整我们的参数,这样又会导致模型在测试集上过拟合,因为参数会不断调整直到模型的表现最佳。这种情况就是,关于测试集的信息已经“泄露”给了模型,从而使得评估度量方法不再能够反映模型的泛化能力了。这里的“泄露”指的是在现实世界中,测试集对于模型来说其实是未知的,就像预测一个当前广告的点击率一样,这个广告在未出现之前对于模型来说是未知的,而如果我们使用测试集进行参数的调整,那么也就相当于预见了未来,这是不科学的。

  为了解决上述测试集信息“泄露”的问题,我们可以在训练集中分出另外一部分数据出来,作为“验证集”。这样总共就有三个数据集,一个训练集,一个验证集,一个测试集。模型首先在训练集上进行训练,然后在验证集上进行评估调整参数。最后才是在测试集上得到最终的模型的评估。然而,新的问题又出现了,因为我们把数据集分割成了三个子数据集,用于模型学习的样本数会因此急剧减少,而且最终得到的模型结果也很大程度决定于你对(训练,验证)这两个数据集的选择。

  为了解决上述数据集分割导致的样本不足和模型结果的不确定性。交叉验证(cross-validation,CV)就派上用场了。 一轮交叉验证过程包括把样本集分割成互补的子集,在一个子集(训练集)上训练,然后在另外一个子集(验证集)上验证模型。而为了减少因为子集的不同划分而出现模型的变化,一般都会使用不同的子集划分对模型进行多轮的交叉验证,最后再对这多轮的验证结果进行平均。最典型的方法就是k折验证,下面将会讲到。

一般交叉验证的方法如下:

Leave-p-out cross-validataion(LpOCV)

  此方法把p个样本作为验证集,剩下的样本作为训练集。这种方法把原样本不断切成训练集和一个具有p个样本的验证集。假设原数据集有n个样本,模型训练和验证都需要进行
Cmn 。而对于 p>1 , n 比较大的情况下,这种方法的计算量非常巨大。比如,n=100,p=30,训练和验证需要进行的次数为 C301003×1025

Leave-one-out cross-validation(LOOCV)

  LOOCV其实是LpOCV的一种特殊情况,也即是 p>1 的时候。LOOCV对于样本数量为n的数据集只需要训练和验证n次。

k-fold cross-validation

  在k折交叉验证中,原始的数据样本被随机的分成k份大小相同的子样本集。在这k个子样本集中,其中一个作为验证集,另外的k-1份作为训练集。这样,交叉验证的过程会重复k次,最后对这k次的评估结果进行平均得到最终的评估结果。当k=n时,k折交叉验证就是LOOCV。

交叉验证中度量模型的方法

  交叉验证的目的就是为了估计模型对于训练集之外的独立样本的期望拟合水平。度量这个期望你和水平的方法取决于不同的模型。比如,在二元分类问题中,预测准确率就可以作为评估模型验证集效果的方法。而在回归问题中,均方误差(MSE)、均方根误差(RMSE)等都可以作为评估模型的标准。

交叉验证的具体应用

1、比较不同预测模型的表现

  在OCR(optical character recognition)中,当我们在考虑使用SVM或者是KNN对一副手写字符图像预测其真实字符时,交叉验证就派上用场了。通过交叉验证,我们就可以客观地看到这两个模型各自的表现。如果我们只是简单的比较这两个模型的in-sample表现,也就是训练集的表现,那KNN的表现会更大可能的比SVM好,因为KNN比较灵活,因此相比SVM来说更可能会过拟合。

2、变量筛选

  假设我们要用20种蛋白质的表现水平去预测一个癌症患者是否会对一种药物产生反应。我们的实际目标是要找出这20种蛋白质也就是这20个特征中哪一些特征能够产生最佳的预测模型。对于大多数建模过程,如果我们用模型in-sample错误率去筛选这些特征的子集,毫无疑问所有20个特征都用上的模型表现肯定会是最好的。然而,使用交叉验证,表现最好的模型一般只会包括所有特征中一部分真正有信息含量的特征。

总结

  总的来说,现实生活中待预测的数据集对于我们来说是未知的,所以我们就在测试集上评估模型,因为在训练集上表现优秀的模型可能会出现过拟合。但如果我们使用测试集去调整模型的参数,优化模型的话会让我们的模型学习到测试集的信息,这是不符合实际的,因为测试集对应的是我们待预测的数据集,是未知的,这个时候我们就需要从训练集中分割出一部分作为验证集来优化调整我们的模型,避免过拟合。但这样又会导致我们的数据集不够,交叉验证可以用来解决数据不够的问题。所以,cross-validation就是用于模型的调整和优化,避免模型的过拟合,让我们得到一个泛化能力较强的模型。

参考链接:

http://scikit-learn.org/stable/modules/cross_validation.html#cross-validation

https://en.wikipedia.org/wiki/Cross-validation_(statistics)

你可能感兴趣的:(机器学习)