R语言k折交叉验证

​​

由Kaizong Ye,Weilong Zhang撰写

机器学习中需要把数据分为训练集和测试集,因此如何划分训练集和测试集就成为影响模型效果的重要因素。本文介绍一种常用的划分最优训练集和测试集的方法——k折交叉验证。”

k折交叉验证

K折交叉验证(k-fold cross-validation)首先将所有数据分割成K个子样本,不重复的选取其中一个子样本作为测试集,其他K-1个样本用来训练。共重复K次,平均K次的结果或者使用其它指标,最终得到一个单一估测。

这个方法的优势在于,保证每个子样本都参与训练且都被测试,降低泛化误差。其中,10折交叉验证是最常用的。

×

1、简单交叉验证

将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此分类器的性能指标。

好处:

处理简单,只需随机把原始数据分为两组即可

坏处:

但没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,得到的结果并不具有说服性。

2、2-折交叉验证(2-fold Cross Validation,记为2-CV)

做法是将数据集分成两个相等大小的子集,进行两次的分类器训练。在第一次中,一个子集作为训练集,另一个便作为测试集;在第二次训练中,则将训练集与测试集对换,

其并不常用:

主要原因是训练集样本数太少,不足以代表母体样本的分布,导致te测试阶段辨识率容易出现明显落差。

3、K-折交叉验证(K-fold Cross Validation,记为K-CV)

将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2。

应用最多,K-CV可以有效的避免过拟合与欠拟合的发生,最后得到的结果也比较具有说服性。

Eg:

十折交叉验证

1.     将数据集分成十份,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。每次试验都会得出相应的正确率。

2.     10次的结果的正确率的平均值作为对算法精度的估计,一般还需要进行多次10折交叉验证(例如10次10折交叉验证),再求其均值,作为对算法准确性的估计

此外:

1.     多次 k 折交叉验证再求均值,例如:10 次10 折交叉验证,以求更精确一点。

2.     划分时有多种方法,例如对非平衡数据可以用分层采样,就是在每一份子集中都保持和原始数据集相同的类别比例。

3.     模型训练过程的所有步骤,包括模型选择,特征选择等都是在单个折叠 fold 中独立执行的。

4、留一交叉验证(Leave-One-Out Cross Validation记为LOO-CV)

在数据缺乏的情况下使用,如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,故LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标。

优点:

(1)每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。

(2)实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。

缺点:

计算成本高,需要建立的模型数量与原始数据样本数量相同。当数据集较大时几乎不能使用。



实例 

在线性分类器与性能评价(R语言)中,我们将数据集随机抽取70%作为训练集,剩下30%作为测试集,通过线性回归的方法进行预测,通过ROC和AUC评价模型效果。现在,我们使用k折交叉验证的方法,选取最优的训练集和测试集,建立线性分类器并评价模型效果。

1、数据导入并分组。导入数据,并使用caret包中的createFolds()函数,根据标签列将数据分成10份 。

2、选取最优训练集与测试集。构建for循环,得到十次交叉验证预测的AUC值。并纪录取值最大的一组,作为最优的训练集与测试集划分。

10次auc取值结果如下:

3、构建分类器并判断模型效果。根据前一步的结果,使用最优划分构建线性分类器并预测。绘制出测试集的ROC曲线。

线性分类器与性能评价(R语言)中随机选取训练集和测试集,最终测试集的AUC值仅为0.755,而本次我们通过k折交叉验证选取训练集和测试集,测试集AUC值达到0.936,可以看出模型效果提升显著。


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds