机器学习-交叉验证


=Start=

缘由:

对于最近在看其中的一些机器学习相关的内容时,暂时只关心其大致的原理说明和相关对比,对于数学的推导和细节先放到一边,以后如果有机会的话再做了解,这里先记录一些(从其它比较好的书籍、文章中)整理出的结论和特点说明,方便快速理解加深印象。

正文:

参考解答:
一、训练集(training set)和测试集(testing set)

在模式识别(pattern recognition)与机器学习(machine learning)的相关研究中,经常会将数据集(dataset)分为训练集(training set)跟测试集(testing set)这两个子集,前者用以建立模型(model),后者则用来评估该模型对未知样本进行预测时的精确度,正规的说法是泛化能力(generalization ability)。怎么将完整的数据集分为训练集跟测试集,必须遵守如下要点:

  1. 只有训练集才可以用在模型的训练过程中,测试集则必须在模型完成之后才被用来评估模型优劣的依据。
  2. 训练集中样本数量必须够多,一般至少大于总样本数的50%。
  3. 两组子集必须从完整集合中均匀取样

其中最后一点特别重要,均匀取样的目的是希望减少训练集/测试集与完整集合之间的偏差(bias),但却也不易做到。一般的作法是随机取样,当样本数量足 够时,便可达到均匀取样的效果,然而随机也正是此作法的盲点,也是经常是可以在数据上做手脚的地方。举例来说,当辨识率不理想时,便重新取样一组训练集/ 测试集,直到测试集的识别率满意为止,但严格来说这样便算是作弊了。

二、交叉验证(cross validation)

交叉验证(cross validation)是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集 (training set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。常见的交叉验证方法如下:

第一种,简单交叉验证

所谓的简单,是和其他交叉验证方法相对而言的。首先,我们随机的将样本数据分为两部分(比如: 50%的训练集,50%的验证集),然后用训练集来训练模型,在验证集上验证模型及参数。接着,我们再把样本打乱,重新选择训练集和验证集,继续训练数据和检验模型。最后我们选择损失函数评估最优的模型和参数。 

特点:在分割训练集和验证集的时候,一般是随机的,这也正是容易出猫腻的地方。同一个模型和参数,分别在两次分割中,验证结果可能会出现很大的差距。所以,不太有说服力。

第二种,K折交叉验证(K-Folder Cross Validation, K-CV)

和第一种方法不同,K折交叉验证会把样本数据随机的分成K份,每次随机的选择K-1份作为训练集,剩下的1份做验证集。当这一轮完成后,重新随机选择K-1份来训练数据。若干轮(小于K)之后,选择损失函数评估最优的模型和参数。

特点:K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取 2。它可以有效的避免过拟合以及欠拟合状态的发生,最后得到的结果也比较具有说服力。

第三种,留一手交叉验证(Leave-one-out Cross Validation, LOO-CV

它是第二种情况的特例,此时K等于样本数N,这样对于N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型预测的好坏。此方法主要用于样本量非常少的情况,比如对于普通适中问题,N小于50时,我一般采用留一交叉验证。

特点:结果比较可靠。过程中没有随机因素会影响结果,确保了整个过程是可以被复制的。

三、一些补充说明

交叉检验在深度学习跑标准数据集的时候一般根本不会用到!!

当数据集比较小的时候,交叉验证可以“充分利用”有限的数据找到合适的模型参数,防止过度拟合。适用情况:数据集较小时。

但一般做深度学习跑标准数据集的时候用不到,因为数据集足够大!!

参考链接:

=END=


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注