k-折交叉验证

一、k折交叉验证的目的(为什么要用k折交叉验证?)

1.根本原因:数据有限,单一的把数据都用来做训练模型,容易导致过拟合。(反过来,如果数据足够多,完全可以不使用交叉验证。)较小的k值会导致可用于建模的数据量太小,所以小数据集的交叉验证结果需要格外注意,建议选择较大的k值。
2.理论上:使用了交叉验证,模型方差“应该”降低了。
在理想情况下,我们认为k折交叉验证可以 O ( 1 / k ) O(1/k) O(1/k)的效率降低模型方差,从而提高模型的泛化能力。通俗地说,我们期望模型在训练集的多个子数据集上表现良好,要胜过单单在整个训练数据集上表现良好。(注意:但实际上,由于所得到的k折数据之间并非独立而是存在相关性,k折交叉验证到底能降低多少方差还不确定,同时可能会带来偏差上升。)

二、 从方差偏差的角度来看交叉验证

(1)什么是模型的偏差和方差?
在机器学习中,我们用训练集去训练(学习)一个model(模型),通常的做法是定义一个loss function(误差函数),通过将这个loss最小化过程,来提高模型的性能(performance)。然而我们学习一个模型的目的是为了解决实际的问题(或者说是训练数据集这个领域(field)中的一般化问题),单纯地将训练数据集的loss最小化,并不能保证在解决更一般问题时仍然是最优的,甚至不能保证模型是可用的。这个训练数据集的loss与一般化的数据集的loss之间的差异就叫generalization error=bias+variance。(注意:bias和variance是针对generalization(一般化,泛化)来说的。)
generalization error分为bias和variance两个部分。首先如果我们能够获得所有可能的数据集合,并在这个数据集合上将loss最小化,这样学习到的模型就可以称之为“真是模型”。当然,我们无论如何都不能获得并训练所有可能的数据,所以“真是模型”肯定存在,但是无法获得,我们最终的目标就是去学习一个模型使其更加接近这个“真实模型”。
而bias和variance分别从两个方面来描述我们学习到的模型与真实模型之间的差距。
Bias是“用所有可能的训练数据集训练出的所有模型的输出的平均值”与“真是模型”的输出值之间的差异
Variance则是“不同的训练数据集训练出的模型”的输出值之间的差异。也就是说bias反映的是模型在样本上的输出值与真实值之间的差距,即模型本省的精准度(或者说算法本省的拟合能力);variance反映的是模型每次输出结果与模型期望输出之间的误差,即模型的稳定性。
这里需要注意的是我们能够用来学习的训练数据集只是全部数据中的一个子集。举两个例子:

a. 开枪问题:
想象你开着一架黑鹰直升机,得到命令攻击地面上一只敌军部队,于是你连打数十梭子,结果有一下几种情况:
1.子弹基本上都打在队伍经过的一棵树上了,连在那棵树旁边等兔子的人都毫发无损,这就是方差小(子弹打得很集中),偏差大(跟目的相距甚远)。
2.子弹打在了树上,石头上,树旁边等兔子的人身上,花花草草也都中弹,但是敌军安然无恙,这就是方差大(子弹到处都是),偏差大(同1)。
3.子弹打死了一部分敌军,但是也打偏了些打到花花草草了,这就是方差大(子弹不集中),偏差小(已经在目标周围了)。
4.子弹一颗没浪费,每一颗都打死一个敌军,跟抗战剧里的八路军一样,这就是方差小(子弹全部都集中在一个位置),偏差小(子弹集中的位置正是它应该射向的位置)。
b. 打靶问题:
一次打靶实验,目标是为了打到10环,但是实际上只打到了7环,那么这里面的Error就是3。具体分析打到7环的原因,可能有两方面:一是瞄准出了问题,比如实际上射击瞄准的是9环而不是10环;二是枪本身的稳定性有问题,虽然瞄准的是9环,但是只打到了7环。那么在上面一次射击实验中,Bias就是1,反应的是模型期望与真实目标的差距,而在这次试验中,由于Variance所带来的误差就是2,即虽然瞄准的是9环,但由于本身模型缺乏稳定性,造成了实际结果与模型期望之间的差距。

衡量一个模型评估方法的好坏,主要是从偏差和方差两个方面进行的。
E r r o r = B a i s 2 + V a r i a n c e + N o i s e Error=Bais^2+Variance+Noise Error=Bais2+Variance+Noise
其中Noise不是真正的数据,是造成过拟合的原因之一。模型过度追求Low Bias会导致训练过度,对训练集判断表现优秀,导致噪声点也被拟合进去了。
(2)交叉验证k值对bias和variance的影响。
假设我们现在有一组训练数据,需要训练一个模型。在训练过程的最初,bias很大,因为我们的模型还没有来得及开始学习,也就是说与“真实模型”差距很大。然而此时variance却很小,因为训练数据集(training data)还没有来得及对模型产生影响,此时将模型应用于“不同的”训练数据集也不会有太大的差异。而随着训练过程的进行,bias变小,因为我们的模型变得“聪明”了,懂得了更多关于“真实模型”的信息,输出值与真实值之间更加接近了。但是如果我们训练的时间太久,variance就会变得很大,因为我们除了学习关于真实模型的信息,还会学到许多具体的,只针对我们使用的训练集(真实数据的子集)信息。而不同的可能训练数据集(真实数据集的子集)之间的某些特征和噪声是不一致的,这就导致了我们的模型在很多其他的数据集上无法获得很好的效果,也就是所谓的overfitting(过拟合)。
因此实际的训练过程中会用到validation set,会用到诸如early stopping以及regularization等方法来避免过拟合的发生,然而没有一种固定的策略方法适用于所有的task和data,所以bias和variance之间的trade off应该是机器学习永恒的主题。
(3)交叉验证方法
交叉验证是一种通过估计模型的泛化误差,从而进行模型选择的方法。基本思想是将训练数据分为两部分,一部分数据用来模型的训练,另一部分数据用于测试模型的误差,成为验证集。由于两部分数据不同,估计得到的泛化误差更接近真实的模型表现。
交叉验证的方法:
考虑两种极端情况:
·完全不使用交叉验证: k = 1 k=1 k=1,这个时候,所有数据都被用于训练,模型很容易过拟合,因此容易是低偏差、高方差。
·留一交叉验证(leave-one-out): k = n k=n k=n,每次从个数为n的样本集中,取出一个样本作为验证集,剩下的(n-1)个作为训练集,重复进行n次,最后平均n个结果作为泛化误差估计。
当k在1到n之间游走时,可以理解为方差和偏差妥协的结果。
·**k折交叉验证:**把数据分成k份,每次拿出一份作为验证集,剩下(k-1)份作为训练集,重复k 次。最后平均k次的结果,作为误差评估的结果。
(4) k到底该取多少?为什么大部分人都要取10?
k- fold 交叉验证是用来确定不同类型的模型(线性、指数等)哪一种更好,为了减少数据划分对模型评价的影响,最终选出来的模型类型(线性、指数等)是k次建模的误差平均值最小的模型。当k较大时,经过更多次数的平均可以学习得到更符合真实数据分布份模型,bias就较小了,但是这样一来模型就更加拟合训练数据集,再去测试集上预测的时候,预测误差的期望值就变大了,从而variance就大了;反之,k较小时模型不会过度拟合训练数据,从而bias较大,但是正因为没有过度拟合训练数据,variance也较小。
由于实际情况中,交叉的折数(fold)受很多因素的影响,所以k值取多少也没能给出准确的答案。一般两种流行的取值:(i)k=10,(ii)k=n,n指的是训练数据的总数,就是上面介绍的留一法。
(1)对于稳定的模型来说,留一法的结果较为统一,值得信赖。对于不稳定的模型,留一法往往比k折更为有效。
(2)模型稳定性较低时,增大k的取值可以给出更好的效果,但是要考虑计算的开销。
(3)2017年的一项研究给出了另一种经验式的选择方法,建议 K ≈ l o g ( n ) K\approx log(n) Klog(n)并且保证 n / K > 3 d n/K>3d n/K>3d,其中n表示数据量,d表述特征数。

三、Bias, Variance和Overfitting, Underfitting

过拟合(overfitting),就是我们对训练样本能够百分百命中,但是在测试时掉链子,拟合很差,也就是我们说的泛化性能不好。所以如果太追求在训练集上的完美二采用一个很复杂的模型,会使得模型把训练集中的噪声也当成真实数据分布特征,从而得到错误的数据分布估计。
一句话,过拟合会出现高方差问题。
欠拟合(underfitting),训练样本太少,导致模型不足以刻画数据分布,体现为在训练集上的错误率都很高。
一句话,欠拟合会出现高偏差问题

怎样避免过拟合和欠拟合?

避免欠拟合(训练不够充分)
1.寻找更好的特征–具有代表性的特征
2.用更多的特征–增大输入向量的维度
避免过拟合(刻画太细,泛化太差)
1.增大数据集合–使用更多的数据,噪声点比重减少
2.减少数据特征–减小数据维度,高维空间密度小
3.正则化方法–即在对模型的目标函数或代价函数加上正则项
4.交叉验证方法

致谢

https://www.jianshu.com/p/651f998a6398
https://blog.csdn.net/Li_yi_chao/article/details/82665745

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值