模型选择之交叉验证

在机器学习的模型训练中,我们通常需要比较多个模型,从中选出一个最优的模型作为我们的最终模型。我们知道,超参数(hyper parameter)经常会作为模型的一个组成部分出现,比如说,在正则化后的logistic regression中,正则项和损失函数之间的参数t就是一个超参数,不同的t取值对应了不同的模型,我们对于t的选取实际上也就是对模型的选择,我们试图找到一个t,使得t对应的模型最优。再比如说,带有高斯核函数的模型中,高斯核函数的那个参数实际上也是模型的超参数。

从理论角度讲,如果我们的训练数据量足够大,我们就可以事先选出一部分训练数据作为验证集(占训练数据集的1/4到1/3),并且用这部分数据来评估我们的模型。但是在实际当中,训练数据往往有限,上述方式基本上不可行,因为会造成训练数据的浪费。这时可以采取交叉验证的方式,具体地,k折交叉验证(k-fold cross-validation)用一部分数据来训练模型,然后用另一部分数据来测试模型的泛化误差。该算法的具体步骤如下:

1.      随机将训练数据等分成k份,S1, S2, …, Sk

2.      对于每一个模型Mi,算法执行k次,每次选择一个Sj作为验证集,而其它作为训练集来训练模型Mi,把训练得到的模型在Sj上进行测试,这样一来,每次都会得到一个误差E,最后对k次得到的误差求平均,就可以得到模型Mi的泛化误差。

3.      算法选择具有最小泛化误差的模型作为最终模型,并且在整个训练集上再次训练该模型,从而得到最终的模型。

对于k的选择,实践中一般取k =10。这里有一种情况,k = N,(N为训练样本数量)。在这种情况下,k折交叉验证也称为留一交叉验证(leave-one-out cross validation)。由于在留一交叉验证中,每一次训练模型的样本几乎是一样的,这样就会造成估计的偏差很小但方差很大的情况出现,另外,需要调用N次学习算法,这在N很大的时候,对于计算量也是不小的开销。

另一方面,如果取k = 10,那么交叉验证的方差会降低,但是偏差又会成为问题,这取决于训练样本的数量。当训练样本较小时,交叉验证很容易有较高的偏差,但是随着训练样本的增加,这种情况会得到改善。

由上分析可知,实践中主要还是选择10-折交叉验证较为理想。

上面介绍了交叉验证的步骤以及对于k值选择的分析。

接下来我想结合自己在工程中所犯的一个错误来说明交叉验证的正确使用方式。

对于一个文本分类问题,我们知道这样的问题往往具有很大量的特征,其特征数量基本上远远超过训练样本数量,但是这些特征中与类别相关的特征并不多,大都是无关特征。因此我的做法是这样的:

1.      特征选择。用信息增益的方式选择了与类别有很强关联性的特征。

2.      用上面选择出的特征来构造文本分类器。

3.      用交叉验证法来选择最优的模型并估计最终模型的泛化误差。

大家觉得上面的做法怎么样?正确吗?这就是我在最初尝试的做法。

我们首先来看看这样做的结果。由最终正确的方法得出的结果可知,分类器在验证集上的泛化误差在12%左右,而通过上述方法得到的分类器在验证集上的泛化误差为3%左右,这和真实数据差了很多,显然,上述方法出了问题。那么问题出在哪里呢?

注意到上述做法的第一步,在进行特征选择时,我用到了所有的训练样本,这就导致选择出来的特征“看见了所有的训练样本”,而后我再用交叉验证时,每次验证所用到的验证集实际上对于特征来讲已经是可见的了,这些验证集已经被“污染”。

正确的做法应该是这样:

1.      随机将训练样本等分成k份。

2.      对于每一份验证数据Sj,算法在S1, …, SJ-1, SJ+1, …, Sk上进行特征选择,并且构造文本分类器。把得到的文本分类器在验证集Sj上求泛化误差。

3.      把k个泛化误差求平均,得到最后的泛化误差。

从上面的例子可以看出,交叉验证应该贯穿整个模型建立的过程。上面的错误应该引起高度的重视,很多人在实践中都会不知不觉地犯这个错误。

最后需要注意的是,之前我们都是在讲交叉验证作为模型选择时的方法。交叉验证也可以用来评估单个模型的误差。比如说你实现了一个模型,并且想看看这个模型的效果,这时可以考虑交叉验证。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值