机器学习数据挖掘——模型评估与选择2

在上一篇文章我介绍了评估模型的标准——泛化误差最小,以及浅谈了拟合不足与过拟合的问题(也是要结合训练误差和泛化误差来判断的)。

这篇文章将要介绍怎么进行分割数据集使得模型的构造能更有代表性也能使泛化误差的估计更准确。

在现实的数据挖掘任务中,我们针对不同的目的往往有很多不同的算法可供选择,能构造出不同的模型,甚至同一种算法的不同参数配置也会产生不同的模型,这就产生了很多问题,这些算法和模型可以任意选择吗?评估的标准是什么?模型只能选择一个吗,可不可以组合几个模型达到更佳的效果呢?

对于模型的选择,我们在上一篇文章也提到过可通过泛化误差最小化来选择,可是我们说过我们总是期望用于构建模型的数据集越大越好,数据集越大,构建出来的模型应用于总体的效果就越好(这与传统统计学中以样本估计总体是一样的道理,我们假设所采集的样本点是独立同分布且服从于总体分布也是为了是模型能拥有强泛化能力。),我们也不能单纯的就用用来训练模型的训练集来作为测试集估计泛化误差,这会使估计的泛化误差过于乐观,那么怎么进行训练集和测试集的分割呢?

我们这里介绍几种数据集的分割方法:

1.留出法(hold-out):

直接将数据集D划分为两个互斥的集合。

留出法需要解决的问题:

(1)划分比例问题。需要保证训练集足够大(即保真性足够高),又不能让测试集太小(即对泛化误差的估计准确度足够高);数据集的划分没有规定的比例,常见的做法是2/3—4/5用作训练集,其余用作测试集。

(2)划分时数据分布一致性的问题。在进行训练集与测试集划分时应该尽可能保持数据的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响结果。(类似于统计学中的分层抽样,这里用二分类任务举个栗子:假设我们有1000个样本,其中有700个正例,300个反例,我们需要按7:3的比例分割数据集,恰好将700个正例分为训练集,300个反例分为测试集,这个时候用测试集去评估分类器的效果,显然使错误率达到了100%,所以数据集在进行分割时里面正例反例的比例也是要进行考虑的。)

(3)数据集的划分次数问题。在上面探讨的问题中我们说到了划分时的数据分布一致性问题,假设我们有1000个样本数据,考虑了划分比例和划分数据分布一致性的问题,我们将700个数据划分到训练集,其中有490个正例,210个反例,剩余的300个数据划分到测试集,其中有210个正例,90个反例,从700个正例里面挑选490个正例,从300个反例里面挑选210个反例,有很多种分配方式,不同的分配方式可得到不同的数据集,训练出的模型的泛化误差也不一样,单次使用留出法得到的估计结果往往并够稳定可靠,在使用留出法时一般要采用若干次随机划分、重复进行试验之后取平均值作为留出法的平均结果。

2.交叉验证法(其特殊情况:留一法):

将数据集D分为k个大小相似的互斥子集。

同样的,每个子集都要保证数据划分时的分布一致性问题,取其中一个子集作为测试集,其余的k个子集作为训练集,这样可以构建k次模型,最终返回的是这k次测试结果的均值,显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值。同样的,类似于上面介绍的留出法,为了减小因样本划分不同而引入的差别,k折交叉验证要随机使用不同的划分重复P次,最终的评估结果是这p次结果的平均值。常见的有“10次10折交叉验证”。

留一法是交叉验证法的特殊情况,取k为样本大小m,则每个子集的大小为1,每次只取一个样本用于测试,其余的m-1个样本用于训练,这样每个样本都参与了训练也参与了测试。留一法评估的结果往往较为准确,但是当样本量较大时,训练m个模型的开销就显得太大了。

3.自助法:

上面介绍的几种方法中要么会因训练样本规模不同而导致估计偏差,要么虽然受训练样本规模影响较小,但是计算复杂度有太高了。

于是我们引入自助法,这是一种能从大小为m的数据集中抽取出m个数据的一种方法,我想你已经猜到了,采用的就是放回抽样,根据极限的知识,我们可得到,进行m次这样的放回抽样,大概会有36.8%的样本点不会出现在抽取的数据集中,这样我们就可以用这没抽取到的样本作为测试集使用,也就是求取总数据集和抽取的数据集的差集作为测试集,这样既避免了泛化误差估计过于乐观的问题,又解决了训练集太小的问题。这种方法的缺点就是,在估计的过程中会扭曲初始数据集的分布,这自然会引入估计偏差,所以这种方法只适用于数据集较小的情况。

猜你喜欢

转载自blog.csdn.net/weixin_42144636/article/details/81215891