在集成学习中,通常认为Bagging的主要作用是降低方差,而Boosting的主要作用是降低偏差。Boosting能降低偏差很好理解,因为其原理就是将多个弱学习器组合成强学习器。但Bagging为什么能降低方差?或者说,为什么将多个强学习器组合起来方差就会降低?这是本篇想要探讨的问题,而在这之前我认为有必要先搞清楚方差和偏差的基本概念。

方差

首先来看方差的定义:设X为随机变量,则方差\(Var(X) = E[(X-E[X])^2]\),表示X与平均值\(E[X]\)之间差异的平方的期望值,用于刻画X取值的散布程度。

方差有两个重要的性质,后文会用到:

  1. c为常数,则 \[Var(cX) = E[(cX - E[cX])^2] = c^2E[(X-E[X])^2] = c^2Var(X) \qquad (1)\]

  2. 独立随机变量之和的方差等于各变量的方差之和:

    ​ \[Var(X_1 + \cdots + X_n) = Var(X_1) + \cdots +Var(X_n) \qquad (2)\]

模型的偏差和方差

通常对于一个模型而言,比起其在训练集的表现,通常我们更关心其在测试集上的表现,或者说希望了解其泛化性能。偏差-方差分解 (bias-variance decomposition)就是其中的一种重要工具。下图形象地展示了偏差与方差的区别:

要理解模型的偏差和方差,首先需要做一个假设 (PRML中称之为“思维实验(thought experiment)")。假设我们有很多个数据集,每个数据集中的样本都是从总体分布\(\mathcal{P}\)中抽样而得。对于其中一个特定的数据集\(\mathcal{D}\),在此数据集上学习算法得到的单模型为\(f(\textbf{x};\mathcal{D})\)。可以看到对于不同的数据集\(\mathcal{D}\),学习到的模型都是不一样的,因此一个学习算法的期望预测为\(\bar{f}(\textbf{x}) = \mathbb{E}_{\mathcal{D}}[f(\textbf{x};\mathcal{D})]\),该值表示对于一个特定的样本\(\textbf{x}\),不同单模型的平均预测值。

偏差 (bias) 定义为:\(bias = \bar{f}(\textbf{x}) - y\),为模型的期望预测与真实值之间的差异。

方差 (variance) 定义为:\(variance = \mathbb{E}_\mathcal{D}[(f(\textbf{x};\mathcal{D})-\bar{f}(\textbf{x}))^2]\),衡量模型对不同数据集\(\mathcal{D}\)的敏感程度,也可以认为是衡量模型的不稳定性。若方差大,则表示数据的微小变动就能导致学习出的模型产生较大差异。可能的情形是在训练集上拟合的很好,到了测试集上由于数据的改变致使准确率下降很多,这是典型的过拟合。

而对比上文中方差的公式 (\(Var(X) = E[(X-E[X])^2]\)),这里实际上是将\(f(\textbf{x})\)视为随机变量,而其随机性来源于从同一个分布抽样得到的不同数据集。

因此有了偏差和方差的定义,我们就能推导出模型的期望泛化误差:\[\begin{align} \mathbb{E}_\mathcal{D}[E_{out}(f;\mathcal{D})] & = \mathbb{E}_\mathcal{D}[(f(\textbf{x};\mathcal{D})-y)^2] \\ & =\mathbb{E}_\mathcal{D}[(f(\textbf{x};\mathcal{D}) - \bar{f}(\textbf{x}) + \bar{f}(\textbf{x}) - y)^2] \\& = \mathbb{E}_\mathcal{D}[(f(\textbf{x};\mathcal{D}) - \bar{f}(\textbf{x}))^2] + \mathbb{E}_\mathcal{D}[(\bar{f}(\textbf{x}) - y)^2] + \mathbb{E}_\mathcal{D}[2(f(\textbf{x};\mathcal{D}) - \bar{f}(\textbf{x}))(\bar{f}(\textbf{x}) - y)] \\&\\& 由于\mathbb{E}_\mathcal{D}[f(\textbf{x};\mathcal{D})] = \bar{f}(\textbf{x}),最后一项消去 \\& \\& = \underbrace{\mathbb{E}_\mathcal{D}[(\bar{f}(\textbf{x}) - y)^2]}_{(bias)^2} + \underbrace{\mathbb{E}_\mathcal{D}[(f(\textbf{x};\mathcal{D} - \bar{f}(\textbf{x}))^2]}_{variance} \end{align}\]

模型的期望泛化误差由偏差和方差组成。一般来说,简单模型偏差高,方差低;复杂模型方差高,偏差低。如下图所示:

上图显示出模型复杂度对偏差和方差的影响,左面三幅图是100个数据集生成的100个模型,从上至下的单模型复杂度提升;右面三幅图中红线代表左图中各个单模型的平均,绿线表示真实函数。从左面三幅图可以看到模型越复杂方差也会越大,然而将模型平均后会比较接近真实函数,这说明复杂模型偏差小,而简单模型的情况则正好相反。

可以看到,一开始我们说偏差-方差分解的理论是一个“思维实验”,是因为其是带有幻想性质的。现实中我们不会有很多个数据集,而往往只有一个数据集,如果选用的算法比较复杂,即方差大,则更可能的情况是用我们手上的数据集拟合而成的模型恰好是离真实函数较远,这就产生了过拟合,而这种情况实际上经常发生。所以为什么要降低方差?一句话解释:方差大会导致过拟合,进而致使模型泛化性能降低。

通常降低方差的方法之一是将多个模型平均起来。假设有n个独立同分布的模型,每个模型的方差均为\(\sigma^2\),则利用上文中方差的性质 (1) 和 (2) 可得:

​ \[Var(\frac{1}{n}\sum\limits_{i=1}^n X_i) = \frac{1}{n^2}Var(\sum\limits_{i=1}^nX_i) = \frac{\sigma^2}{n} \qquad (3)\]

这样模型均值的方差仅为单模型方差的\(\frac1n\)。然而在只有一个数据集的情况下只能训练出一个模型,也就没法求平均。所以为了缓解这个问题,可以采用有放回抽样来模拟生成多个数据集,将每个数据集训练得到的模型平均来降低方差,即是Bagging的基本思想。

Bagging

设单模型的期望为\(\mu\),则Bagging的期望预测为

​ \[E(\frac{1}{n}\sum\limits_{i=1}^n X_i) = \frac1nE(\sum\limits_{i=1}^n X_i) = E(X_i) \approx \mu\]

说明Bagging整体模型的期望近似于单模型的期望,这意味整体模型的偏差也与单模型的偏差近似,所以Bagging通常选用偏差低的强学习器。

Bagging的抽样是有放回抽样,这样数据集之间会有重复的样本,因而违反了公式 (3) 中的独立性假设。在这种情况下设单模型之间具有相关系数 \(0<\rho<1\),则模型均值的方差为:\[Var(\frac{1}{n}\sum\limits_{i=1}^n X_i) = \frac{\sigma^2}{n} + \frac{n-1}{n}\rho\sigma^2\]

上式中随着n增大,第一项趋于0,第二项趋于\(\rho\sigma^2\),所以Bagging能够降低整体方差。而Bagging的拓展算法 —— 随机森林,则通过在树内部结点的分裂过程中,随机选取固定数量的特征纳入分裂的候选项,这样就进一步降低了单模型之间的相关性,总体模型的方差也比Bagging更低。


Reference :

  1. Christopher M. Bishop. Pattern Recognition and Machine Learning
  2. Yaser S. Abu-Mostafa, etc. Learning From Data
  3. 周志华.《机器学习》
  4. 陈希孺.《概率论与数理统计》
  5. http://scott.fortmann-roe.com/docs/BiasVariance.html

/

Bagging与方差的更多相关文章

  1. 模型融合---为什么说bagging是减少variance,而boosting是减少bias?

    1.bagging减少variance Bagging对样本重采样,对每一重采样得到的子样本集训练一个模型,最后取平均.由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的bias和var ...

  2. [白话解析] 通俗解析集成学习之bagging,boosting & 随机森林

    [白话解析] 通俗解析集成学习之bagging,boosting & 随机森林 0x00 摘要 本文将尽量使用通俗易懂的方式,尽可能不涉及数学公式,而是从整体的思路上来看,运用感性直觉的思考来 ...

  3. 机器学习算法总结(三)——集成学习(Adaboost、RandomForest)

    1.集成学习概述 集成学习算法可以说是现在最火爆的机器学习算法,参加过Kaggle比赛的同学应该都领略过集成算法的强大.集成算法本身不是一个单独的机器学习算法,而是通过将基于其他的机器学习算法构建多个 ...

  4. 集成学习之Boosting —— Gradient Boosting原理

    集成学习之Boosting -- AdaBoost原理 集成学习之Boosting -- AdaBoost实现 集成学习之Boosting -- Gradient Boosting原理 集成学习之Bo ...

  5. Bagging与随机森林算法原理小结

    在集成学习原理小结中,我们讲到了集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系.另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合. ...

  6. 转载:bootstrap, boosting, bagging 几种方法的联系

    转:http://blog.csdn.net/jlei_apple/article/details/8168856 这两天在看关于boosting算法时,看到一篇不错的文章讲bootstrap, ja ...

  7. bootstrap, boosting, bagging 几种方法的联系

    http://blog.csdn.net/jlei_apple/article/details/8168856 这两天在看关于boosting算法时,看到一篇不错的文章讲bootstrap, jack ...

  8. Jackknife,Bootstraping, bagging, boosting, AdaBoosting, Rand forest 和 gradient boosting的区别

    引自http://blog.csdn.net/xianlingmao/article/details/7712217 Jackknife,Bootstraping, bagging, boosting ...

  9. 以Random Forests和AdaBoost为例介绍下bagging和boosting方法

    我们学过决策树.朴素贝叶斯.SVM.K近邻等分类器算法,他们各有优缺点:自然的,我们可以将这些分类器组合起来成为一个性能更好的分类器,这种组合结果被称为 集成方法 (ensemble method)或 ...

随机推荐

  1. javascript的介绍,实现和输出以及语法-javascript学习之旅(1)

    javascript的介绍 : 1.javascript死互联网最流行的脚本语言,可用于web和html,并且可用于服务器,pc和移动端 2.javascript脚本语言: 1.是一种轻量级的脚本语言 ...

  2. HTML5 全屏 API

    翻译人员: 铁锚 原文日期: 2013年12月23日 翻译日期: 2013年12月29日 原文链接: Fullscreen API 在越来越真实的web应用程序中,JavaScript也变得越来越给力 ...

  3. 【翻译】Ext JS最新技巧

    原文:Top Support Tips Mitchell Simoens:控制滚动指示器的自动隐藏 Sencha Touch有一个跨平台的,在所有平台看起来和工作效果都一样的滚动条.两条轴(x和y,水 ...

  4. Cocos2D场景中对象引用为nil时的判断

    如果该对象在SpriteBuilder中属性中设置了name,则检查是否 [self.scene getChildByName:@"theNameOfTheNode" recurs ...

  5. 操作系统 - 死锁(Deadlock)的概述、条件、对策

    资源 可抢占资源(preemptable resource)可以从拥有它的进程中抢占而不会产生任何副作用,存储器就是一类可抢占的资源.可抢占资源有时有潜在的死锁危险,通常可以通过在进程之间重新分配资源 ...

  6. LDA实现

    topic model本质上就一个套路,在doc-word user-url user-doc等关系中增加topic层,扩充为2层结构,一方面可以降维,另一方面挖掘深层次的关系,用户doc word ...

  7. iOS监听模式系列之本地通知Notification

    本地通知 本地通知是由本地应用触发的,它是基于时间行为的一种通知形式,例如闹钟定时.待办事项提醒,又或者一个应用在一段时候后不使用通常会提示用户使用此应用等都是本地通知.创建一个本地通知通常分为以下几 ...

  8. C语言笔试经典-查找多位数重复数字以及次数

    从键盘输入一个多位的整数 用程序判断 这个数里面有没有 重复的数字  有重复的数字就打印  哪个数字重复了  重复了几次 例如:输入:1122431 打印结果: 1重复 出现3次 2重复 出现2次, ...

  9. Android Xlistview的源码浅度分析 监听ListView上下滑动 以及是否到顶和底部

    如转载 请注明出处 http://blog.csdn.net/sk719887916 比如我们很多项目中会用到listview 并且要对listview滑动方向进行判断 也有需要的到listview是 ...

  10. 关于并发下内存及CPU使用情况的思考

    鉴于昨天的文章<<使用Interlocked在多线程下进行原子操作,无锁无阻塞的实现线程运行状态判断>>里面有一个封装好的无锁的类库可以判断并发下的结束状况,我们可以完成并发时 ...