交叉验证,K折交叉验证的偏差和方差分析

交叉验证

犀利的开头

在机器学习中,我们用训练数据集去训练(学习)一个model(模型),通常的做法是定义一个Loss function(误差函数),通过将这个Loss(或者叫error)的最小化过程,来提高模型的性能(performance)。然而我们学习一个模型的目的是为了解决实际的问题(或者说是训练数据集这个领域(field)中的一般化问题),单纯地将训练数据集的loss最小化,并不能保证在解决更一般的问题时模型仍然是最优,甚至不能保证模型是可用的。这个训练数据集的loss与一般化的数据集的loss之间的差异就叫做generalization error=bias+variance。
注:Bias和Variance是针对Generalization(一般化,泛化)来说的。

作者:路小墨
链接:https://www.zhihu.com/question/27068705/answer/82132134
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

generalization error分为Bias和Variance两个部分。首先如果我们能够获得所有可能的数据集合,并在这个数据集合上将loss最小化,这样学习到的模型就可以称之为“真实模型”,当然,我们是无论如何都不能获得并训练所有可能的数据的,所以“真实模型”肯定存在,但无法获得,我们的最终目标就是去学习一个模型使其更加接近这个真实模型
而bias和variance分别从两个方面来描述了我们学习到的模型与真实模型之间的差距。
Bias是 “用所有可能的训练数据集训练出的所有模型的输出的平均值” 与 “真实模型”的输出值之间的差异;
Variance则是“不同的训练数据集训练出的模型”的输出值之间的差异。
这里需要注意的是我们能够用来学习的训练数据集只是全部数据中的一个子集。想象一下我们现在收集几组不同的数据,因为每一组数据的不同,我们学习到模型的最小loss值也会有所不同,当然,它们与“真实模型”的最小loss也是不一样的。其他答主有提到关于cross validation中k值对bias和variance的影响,那我就从其他方面来举个例子。
假设我们现在有一组训练数据,需要训练一个模型(基于梯度的学习,不包括最近邻等方法)。在训练过程的最初,bias很大,因为我们的模型还没有来得及开始学习,也就是与“真实模型”差距很大。然而此时variance却很小,因为训练数据集(training data)还没有来得及对模型产生影响,所以此时将模型应用于“不同的”训练数据集也不会有太大差异。
而随着训练过程的进行,bias变小了,因为我们的模型变得“聪明”了,懂得了更多关于“真实模型”的信息,输出值与真实值之间更加接近了。但是如果我们训练得时间太久了,variance就会变得很大,因为我们除了学习到关于真实模型的信息,还学到了许多具体的,只针对我们使用的训练集(真实数据的子集)的信息。而不同的可能训练数据集(真实数据的子集)之间的某些特征和噪声是不一致的,这就导致了我们的模型在很多其他的数据集上就无法获得很好的效果,也就是所谓的overfitting(过学习)。
因此,在实际的训练过程中会用到validation set,会用到诸如early stopping以及regularization等方法来避免过学习的发生,然而没有一种固定的策略方法适用于所有的task和data,所以bias和variance之间的tradeoff应该是机器学习永恒的主题吧。
最后说一点,从bias和variance的讨论中也可以看到data对于模型训练的重要性,假如我们拥有全部可能的数据,就不需要所谓的tradeoff了。但是既然这是不现实的,那么尽量获取和使用合适的数据就很重要了。

作者:J JR
链接:https://www.zhihu.com/question/27068705/answer/82132134
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


交叉验证是一种通过估计模型的泛化误差,从而进行模型选择的方法。没有任何假定前提,具有应用的普遍性,操作简便, 是一种行之有效的模型选择方法。

1. 交叉验证的产生

人们发现用同一数据集,既进行训练,又进行模型误差估计,对误差估计的很不准确,这就是所说的模型误差估计的乐观性。为了克服这个问题,提出了交叉验证。基本思想是将数据分为两部分,一部分数据用来模型的训练,称为训练集;另外一部分用于测试模型的误差,称为验证集。由于两部分数据不同,估计得到的泛化误差更接近真实的模型表现。数据量足够的情况下,可以很好的估计真实的泛化误差。但是实际中,往往只有有限的数据可用,需要对数据进行重用,从而对数据进行多次切分,得到好的估计。

2. 交叉验证方法

  • 留一交叉验证(leave-one-out):每次从个数为N的样本集中,取出一个样本作为验证集,剩下的N-1个作为训练集,重复进行N次。最后平均N个结果作为泛化误差估计。
  • 留P交叉验证(leave-P-out):与留一类似,但是每次留P个样本。每次从个数为N的样本集中,取出P个样本作为验证集,剩下的N-P个作为训练集,重复进行

    次。最后平均N个结果作为泛化误差估计。

以上两种方法基于数据完全切分,重复次数多,计算量大。因此提出几种基于数据部分切分的方法减轻计算负担。

  • K折交叉验证:把数据分成K份,每次拿出一份作为验证集,剩下k-1份作为训练集,重复K次。最后平均K次的结果,作为误差评估的结果。与前两种方法对比,只需要计算k次,大大减小算法复杂度,被广泛应用。

3.模型选择方法的评价

衡量一个模型评估方法的好坏,往往从偏差和方差两方面进行。

Error = Bias^2 + Variance+Noise

  • 什么是Bias(偏差)

Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,即算法本身的拟合能力


  • 什么是Variance(方差)

Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。反应预测的波动情况。


  • 什么是Noise(噪声)

这就简单了,就不是你想要的真正数据,你可以想象为来破坏你实验的元凶和造成你可能过拟合的原因之一,至于为什么是过拟合的原因,因为模型过度追求Low Bias会导致训练过度,对测试集判断表现优秀,导致噪声点也被拟合进去了

作者:mrlevo520
链接:https://www.jianshu.com/p/8d01ac406b40
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

简单的例子理解Bias(偏差)和Variance(方差)

  • 举三个简单例子,
  1. 打靶问题
    一次打靶实验,目标是为了打到10环,但是实际上只打到了7环,那么这里面的Error就是3。具体分析打到7环的原因,可能有两方面:一是瞄准出了问题,比如实际上射击瞄准的是9环而不是10环;二是枪本身的稳定性有问题,虽然瞄准的是9环,但是只打到了7环。那么在上面一次射击实验中,Bias就是1,反应的是模型期望与真实目标的差距,而在这次试验中,由于Variance所带来的误差就是2,即虽然瞄准的是9环,但由于本身模型缺乏稳定性,造成了实际结果与模型期望之间的差距。
    作者:orangeprince
    链接:https://www.zhihu.com/question/27068705/answer/35151681
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  2. 开枪问题

想象你开着一架黑鹰直升机,得到命令攻击地面上一只敌军部队,于是你连打数十梭子,结果有一下几种情况:

1.子弹基本上都打在队伍经过的一棵树上了,连在那棵树旁边等兔子的人都毫发无损,这就是方差小(子弹打得很集中),偏差大(跟目的相距甚远)。

2.子弹打在了树上,石头上,树旁边等兔子的人身上,花花草草也都中弹,但是敌军安然无恙,这就是方差大(子弹到处都是),偏差大(同1)。

3.子弹打死了一部分敌军,但是也打偏了些打到花花草草了,这就是方差大(子弹不集中),偏差小(已经在目标周围了)。

4.子弹一颗没浪费,每一颗都打死一个敌军,跟抗战剧里的八路军一样,这就是方差小(子弹全部都集中在一个位置),偏差小(子弹集中的位置正是它应该射向的位置)。

作者:刑无刀
链接:https://www.zhihu.com/question/20448464/answer/24397161
来源:知乎
著作权归作者所有,转载请联系作者获得授权。


3.再来个射箭问题:假设你在射箭,红星是你的目标,以下是你的射箭结果

作者:Jason Gu
链接:https://www.zhihu.com/question/20448464
来源:知乎
著作权归作者所有,转载请联系作者获得授权。


分析:

我们可以看到,在Low Variance的一列,数据分布是非常集中的,恩,小伙子,你的稳定性很好,方差很小,表现的很聚集。而第二列就是High Variance的一列,机智的你可能一下就看出来了,没错,飘来飘去的,非常不稳定!


看下Low Bias这一行,命中红心的次数很多对不对,说明你还是有准头的,至少偏差不算大,我要是裁判,我就不管你没射中几只箭飘到哪去了(方差大,不集中),毕竟我看的是命中了多少(准确度),而High Bias这一行,明显可以看出一支箭都没射中,表现很差,偏离目标好远,负分滚粗!


综合起来看,我们需要的模型最好是两个L,又准确又稳定,妥妥的,但是,这个在现实模型中是不会存在的。你只能权衡着来

作者:mrlevo520
链接:https://www.jianshu.com/p/8d01ac406b40
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Bias,Variance和Overfitting(过拟合),Underfitting(欠拟合)

过拟合,也就是我对训练样本能够百分百命中了,超级拟合了,但是测试时候就掉链子,拟合很差,也就是我们说的泛化性能不好的问题,所以如果太追求在训练集上的完美而采用一个很复杂的模型,会使得模型把训练集里面的噪声都当成了真实的数据分布特征,从而得到错误的数据分布估计。

一句话,过拟合会出现高方差问题


欠拟合:训练样本太少,导致模型就不足以刻画数据分布了,体现为连在训练集上的错误率都很高的现象。

一句话,欠拟合会出现高偏差问题


怎么避免过拟合和欠拟合


避免欠拟合(刻画不够)

  1. 寻找更好的特征-----具有代表性的
  2. 用更多的特征-----增大输入向量的维度

避免过拟合(刻画太细,泛化太差)

  1. 增大数据集合-----使用更多的数据,噪声点比重减少

  2. 减少数据特征-----减小数据维度,高维空间密度小

  3. 正则化方法-----即在对模型的目标函数(objective function)或代价函数(cost function)加上正则项

  4. 交叉验证方法

    更多方法详解请看@一只鸟的天空--机器学习中防止过拟合的处理方法

作者:mrlevo520
链接:https://www.jianshu.com/p/8d01ac406b40
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


4. 为什么要用交叉验证(Cross-Validation)

1.交叉验证,这是仅使用训练集衡量模型性能的一个方便技术,不用建模最后才使用测试集

2.Cross-validation 是为了有效的估测 generalization error(泛化误差) 所设计的实验方法,而generalization error=bias+variance

首先:bias和variance分别从两个方面来描述了我们学习到的模型与真实模型之间的差距。Bias是 “用所有可能的训练数据集训练出的所有模型的输出的平均值” 与 “真实模型”的输出值之间的差异;Variance则是“不同的训练数据集训练出的模型”的输出值之间的差异。

作者:路小墨
链接:https://www.zhihu.com/question/27068705/answer/82132134
来源:知乎
著作权归作者所有,转载请联系作者获得授权。


可以发现,怎么来平衡Bias和Variance则成了我们最大的任务了,也就是怎么合理的评估自己模型呢?我们由此提出了交叉验证的思想,以K-fold Cross Validation(记为K-CV)为例,基本思想如下:(其他更多方法请看@bigdataage --交叉验证(Cross-Validation))

将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标.K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2. 而K-CV 的实验共需要建立 k 个models,并计算 k 次 test sets 的平均辨识率。在实作上,k 要够大才能使各回合中的 训练样本数够多,一般而言 k=10 (作为一个经验参数)算是相当足够了。

看不清上面的就来一幅更简单的

每次的training_set 红色, validation_set白色 ,也就是说k=5的情况了

注意:交叉验证使用的仅仅是训练集!!根本没测试集什么事!很多博客都在误导!

这也就解决了上面刚开始说的Variance(不同训练集产生的差异),Bias(所有data训练结果的平均值)这两大问题了!因为交叉验证思想集合了这两大痛点,能够更好的评估模型好坏!

说白了,就是你需要用下交叉验证去试下你的算法是否精度够好,够稳定!你不能说你在某个数据集上表现好就可以,你做的模型是要放在整个数据集上来看的!毕竟泛化能力才是机器学习解决的核心

Bias、Variance和K-fold的关系

下面解释一下Bias、Variance和k-fold的关系:k-fold交叉验证常用来确定不同类型的模型(线性、指数等)哪一种更好,为了减少数据划分对模型评价的影响,最终选出来的模型类型(线性、指数等)是k次建模的误差平均值最小的模型。当k较大时,经过更多次数的平均可以学习得到更符合真实数据分布的模型,Bias就小了,但是这样一来模型就更加拟合训练数据集,再去测试集上预测的时候预测误差的期望值就变大了,从而Variance就大了;反之,k较小时模型不会过度拟合训练数据,从而Bias较大,但是正因为没有过度拟合训练数据,Variance也较小。

作者:TANGent
链接:https://www.zhihu.com/question/27068705/answer/35286205
来源:知乎
著作权归作者所有,转载请联系作者获得授权。


致谢

@知乎--机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?
@知乎--方差和偏差
@bigdataage --交叉验证(Cross-Validation)
@一只鸟的天空--机器学习中防止过拟合的处理方法

作者:mrlevo520
链接:https://www.jianshu.com/p/8d01ac406b40
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

推荐阅读更多精彩内容