参考 交叉验证 交叉验证 (Cross Validation)刘建平html
1、训练集 vs. 测试集机器学习
在模式识别(pattern recognition)与机器学习(machine learning)的相关研究中,常常会将数据集(dataset)分为训练集(training set)跟测试集(testing set)这两个子集,前者用以创建模型(model),后者则用来评估该模型对未知样本进行预测时的精确度,正规的说法是泛化能力(generalization ability)。怎么将完整的数据集分为训练集跟测试集,必须遵照以下要点:性能
一、只有训练集才能够用在模型的训练过程当中,测试集则必须在模型完成以后才被用来评估模型优劣的依据。
二、训练集中样本数量必须够多,通常至少大于总样本数的 50%。
三、两组子集必须从完整集合中均匀取样。学习
其中最后一点特别重要,均匀取样的目的是但愿减小训练集 / 测试集与完整集合之间的误差(bias),但却也不易作到。通常的做法是随机取样,当样本数量足够时,即可达到均匀取样的效果,然而随机也正是此做法的盲点,也是常常是能够在数据上作手脚的地方。举例来讲,当辨识率不理想时,便从新取样一组训练集 / 测试集,直到测试集的识别率满意为止,但严格来讲这样便算是做弊了。测试
2、交叉验证(Cross Validation)优化
交叉验证是在机器学习创建模型和验证模型参数时经常使用的办法。交叉验证,顾名思义,就是重复的使用数据,把获得的样本数据进行切分,组合为不一样的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上能够获得多组不一样的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓 “交叉”。 .net
那么何时才须要交叉验证呢?交叉验证用在数据不是很充足的时候。好比在我平常项目里面,对于普通适中问题,若是数据样本量小于一万条,咱们就会采用交叉验证来训练优化选择模型。若是样本大于一万条的话,咱们通常随机的把数据分红三份,一份为训练集(Training Set),一份为验证集(Validation Set),最后一份为测试集(Test Set)。用训练集来训练模型,用验证集来评估模型预测的好坏和选择模型及其对应的参数。把最终获得的模型再用于测试集,最终决定使用哪一个模型以及对应参数。设计
一、Hold-Out Methodhtm
将原始数据随机分为两组,一组作为训练集,一组作为验证集,利用训练集训练分类器,而后利用验证集验证模型,记录最后的分类准确率为此分类器的性能指标。此种方法的好处的处理简单,只需随机把原始数据分为两组便可,其实严格意义来讲 Hold-Out Method 并不能算是 CV,由于这种方法没有达到交叉的思想,因为是随机的将原始数据分组,因此最后验证集分类准确率的高低与原始数据的分组有很大的关系,因此这种方法获得的结果其实并不具备说服性。blog
二、Double Cross Validation(2-fold Cross Validation,记为 2-CV)
作法是将数据集分红两个相等大小的子集,进行两回合的分类器训练。在第一回合中,一个子集做为 training set,另外一个便做为 testing set;在第二回合中,则将 training set 与 testing set 对换后,再次训练分类器,而其中咱们比较关心的是两次 testing sets 的辨识率。不过在实务上 2-CV 并不经常使用,主要缘由是 training set 样本数太少,一般不足以表明母体样本的分布,致使 testing 阶段辨识率容易出现明显落差。此外,2-CV 中分子集的变异度大,每每没法达到 “实验过程必须能够被复制” 的要求。
三、K-fold Cross Validation(K - 折交叉验证,记为 K-CV)
将原始数据分红 K 组(通常是均分),将每一个子集数据分别作一次验证集,其他的 K-1 组子集数据做为训练集,这样会获得 K 个模型,用这 K 个模型最终的验证集的分类准确率的平均数做为此 K-CV 下分类器的性能指标。K 通常大于等于 2,实际操做时通常从 3 开始取,只有在原始数据集合数据量小的时候才会尝试取 2。K-CV 能够有效的避免过学习以及欠学习状态的发生,最后获得的结果也比较具备说服性。
四、Leave-One-Out Cross Validation(记为 LOO-CV)
若是设原始数据有 N 个样本,那么 LOO-CV 就是 N-CV,即每一个样本单独做为验证集,其他的 N-1 个样本做为训练集,因此 LOO-CV 会获得 N 个模型,用这 N 个模型最终的验证集的分类准确率的平均数做为此下 LOO-CV 分类器的性能指标。相比于前面的 K-CV,LOO-CV 有两个明显的优势:
(1)每一回合中几乎全部的样本皆用于训练模型,所以最接近原始样本的分布,这样评估所得的结果比较可靠。
(2)实验过程当中没有随机因素会影响实验数据,确保实验过程是能够被复制的。
但 LOO-CV 的缺点则是计算成本高,由于须要创建的模型数量与原始数据样本数量相同,当原始数据样本数量至关多时,LOO-CV 在实做上便有困难几乎就是不显示,除非每次训练分类器获得模型的速度很快,或是能够用并行化计算减小计算所需的时间。
3、使用 Cross-Validation 时常犯的错误
因为实验室许多研究都有用到 evolutionary algorithms(EA)与 classifiers,所使用的 fitness function 中一般都有用到 classifier 的辨识率,然而把 cross-validation 用错的案例还很多。前面说过,只有 training data 才能够用于 model 的建构,因此只有 training data 的辨识率才能够用在 fitness function 中。而 EA 是训练过程用来调整 model 最佳参数的方法,因此只有在 EA 结束演化后,model 参数已经固定了,这时候才可使用 test data。那 EA 跟 cross-validation 要如何搭配呢?Cross-validation 的本质是用来估测 (estimate) 某个 classification method 对一组 dataset 的 generalization error,不是用来设计 classifier 的方法,因此 cross-validation 不能用在 EA 的 fitness function 中,由于与 fitness function 有关的样本都属于 training set,那试问哪些样本才是 test set 呢?若是某个 fitness function 中用了 cross-validation 的 training 或 test 辨识率,那么这样的实验方法已经不能称为 cross-validation 了。
EA 与 k-CV 正确的搭配方法,是将 dataset 分红 k 等份的 subsets 后,每次取 1 份 subset 做为 test set,其他 k-1 份做为 training set,而且将该组 training set 套用到 EA 的 fitness function 计算中 (至于该 training set 如何进一步利用则没有限制)。所以,正确的 k-CV 会进行共 k 次的 EA 演化,创建 k 个 classifiers。而 k-CV 的 test 辨识率,则是 k 组 test sets 对应到 EA 训练所得的 k 个 classifiers 辨识率之平均值。