交叉验证
最近做毕设的时候,本来打算选择每个类别的相同个数,来做预测,结果不太好。问了一下老师,老师说可以用交叉验证。我目前用的算是存留交叉验证把,老师建议用五折交叉验证。
概念
看一下交叉验证的概念。交叉验证主要用于建模应用中,例如PCR 、PLS 回归建模中。
在给定的建模样本中,拿出大部分样本进行建模型,留小部分样本用刚建立的模型进行预报,并求这小部分样本的预报误差,记录它们的平方加和。这个过程一直进行,直到所有的样本都被预报了一次而且仅被预报一次。把每个样本的预报误差平方加和,称为PRESS(predicted Error Sum of Squares)
实现
主要有三种交叉验证的方式:
留存(hold-out)交叉验证
随机从最初的样本中选出部分,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此Hold-OutMethod下分类器的性能指标.
并非一种交叉验证,因为数据并没有交叉使用。
优点:
处理简单,只需随机把原始数据分为两组即可
缺点
严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性
K折交叉验证 K-CV
初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。用K个分类准确率的平均值作为分类器或模型的性能指标。10-倍交叉证实是比较常用的。
优点:
有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性.
缺点:
K值选取上
留一交叉验证 LOO-CV
即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标.
在某些情况下是存在有效率的算法,如使用kernel regression 和Tikhonov regularization。
优点:
a.每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。
b. 实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的
缺点:
计算成本高
注意
训练集和测试集必须从完整的数据集中均匀取样。均匀取样的目的是希望减少训练集、测试集与原数据集之间的偏差。当样本数量足够多时,通过随机取样,便可以实现均匀取样的效果。(但是随机取样的可重复性差,也就是难以再现当时的结果)
当然,结合以上情况,我最后选择K折交叉这种折中的方法。现在的想法是先把评论集合乱序组合,然后再分成5份(或者10份?)。