Ensemble,Bagging and Boosting

目录

 

- 1. Bagging

    - 1.1 bagging何时使用?

    - 1.2 举例:random forest

    - 1.3 out-of-bag validation

- 2. Boosting

    - 2.1 Adaboost

        - 2.1.1 Re-Weight dataset

        - 2.1.2 Adaboost 算法核心

        - 2.1.3 权重改变的简单数学推导

        - 2.1.4 adaboost算法框架

        - 2.1.5 Adaboost证明的直观理解

        - 2.1.6 Toy example辅助理解

        - 2.1.7 Adaboost的理论证明

        - 2.1.8 Adaboosting和bagging的区别

        - 2.1.9 Addition Gradient Boosting

- 3. Stacking

 

概述

终于学到大名鼎鼎的ensemble的原理了,比我想象的要复杂得多。

 

1. Bagging

 

sample多个数据集,然后分别train,train完之后做ensemble

 

还无法理解为什么可以得到低bais且低variance的表现?

  • 不同的模型它可能擅长不同的类别的数据,对不同类别的数据拟合得更好(假设overfit),而对此外的某些数据拟合的不好,那么多个模型求平均的结果是——原来某模型x对于擅长的数据A分数会被平均化,对于它和这种数据,x对A的预测分数会略微变低,bias升高,而对于各个x不擅长的数据B,它原来预测分数很低,一平均化,就变得高了起来。其中x和A对于任意对象都一样。所以结果就是,整体overfit变得不那么严重了,bias叠加变高,对于不擅长的东西,分数就上来了,所以variance变低。
  • 换句话来说,ensemble之后,整体上,擅长的数据类别会略微不擅长,不擅长的数据类别会变得擅长
  • 所以这里有个结论,如果模型之间擅长的东西约不一样,ensemble可以得到更好的效果(overfitting前提)
  • Bagging,多模型结果复合,理解为什么结果会好,这个对dnn模型有用
  • Boosting,看起来和Bagging并列,实际上要复杂很多,这是一种从弱模型学习出强模型的完整方法体系
  • Stacking,多模型vote,加权复合

1.1 bagging何时使用?

这个需要格外注意,bagging只在模型很容易overfitting的时候使用。而我们有一个错觉是:nn很容易overfitting,实际上不是的,在很多不太容易的task里面,nn难的是在train上取得很好的成绩。

1.2 举例:random forest

random forest是bagging版的decision tree。我没学过decision tree,但是看起不是很难,decision tree只要够深,他就能对所有数据集overfitting。所以适用于bagging,但对于random forest来说,sample data不够用。因而一般的策略是每次随机限制一些features和question不用。

1.3 out-of-bag validation

bagging有一个可以不切val set的代替方法,很简单,因为每次都有一部分data用不到,就可以拿它们来做validation。

train

f1

f2

f3

f4

x1

O

X

O

X

x2

O

X

X

O

x3

X

O

O

X

x4

X

O

X

O

例如上图:

Using RF = f2+f4 to test x1

Using RF = f2+f3 to test x2

Using RF = f1+f4 to test x3

Using RF = f1+f3 to test x4

2. Boosting

与bagging相反,boosting是针对很弱的模型的。它有个神奇的保证:只要模型准确率高于50%,那么boosting就可以保证得到100%的模型。

听起来是很神奇的,它的大致做法是:

  • 分类器,f1
  • 找到一个和f1互补的f2
  • 找到一个和f2互补的f3
  • ……
  • 最后把所有分类器整合起来ensemble

2.1 Adaboost

基本思想概述

上述留下一个问题——如何找到和f1互补的f2,这里有一个非常精彩的思路:找到f1不擅长的数据进行训练,得到f2,f2和f1差别大,ensemble效果好。如何找到不擅长的数据?上文我们提到sample的方法,只是这种似乎实现比较困难。于是,这里引入了Re-weighing dataset

2.1.1 Re-Weight dataset

这个其实很好理解,就是给原来loss function中的不同项赋予不同权重,使得模型对这些数据重视程度改变——变相创造了不同的数据集出来,这是adaboost非常有意思的地方。

另外,改变loss的权重,是我以前一直在想的一件事,torch中也留了api,原来是干这个的,我还想用来对付数据不平衡问题。

2.1.2 Adaboost 算法核心

  • 训练找到f
  • 通过改变权重的方式找到新的数据集d,f不擅长d,回到第一步(训练找到f2)

然后多个f进行ensemble,至于为什么多个擅长不同的模型合并效果好,参考上文ensemble的理解。

再来,具体的做法就是,预测对了就给这个数据低权重,预测错了就给数据高权重,然后用这个数据集训练出来的,就会擅长预测错的,不擅长原来预测对的。

 真实做法是,预测对的数据权重/d,预测错的*d,从数学上可以证明所谓的d的具体数值。

2.1.3 权重改变的简单数学推导

2.1.4 adaboost算法框架

 

上面为了整合两种情况,把d_t改成了α_t,实际意义不变,仍然是错误的上升,正确的下降。

如何ensemble?A make sense trick

这里做ensemble的时候,有一个很有意义的做法。

它在不同模型前面乘上上面计算出来的α_t,这一步非常make sense,假如该模型很正确,那么它对于的α_t必然比较大(因为错误的数据需要乘上α_t而变大),那么该模型的权重也合理应该大,于是刚好这个值拿来做它的权重。

这一切看上去,刚刚好,就是不知道数学上如何证明。

2.1.5 Adaboost正确性的直观理解

这并不是一个梯度下降的算法,所以没有所谓的损失函数,但是error rate的算法,可以视为一种评估。而,将

ensemble输出和label的乘积定义为margin,会发现,随着这个值的增大(多个模型对于每个结果的预测越来越肯定),error rate会不断变小。

2.1.6 Toy example辅助理解

这个例子很好,可视化全过程,如果不懂,查阅ppt或视频。

注: 理解下图的关键点是,第一个数据集对应的f擅长第一个数据集,第二个f擅长第二个数据集……

 

2.1.7 Adaboost的理论证明

略,请翻阅李老师的视频,讲得非常清楚

2.1.8 Adaboosting和bagging的区别

老师用一个例子来说明区别。

bagging的结果如下:

bagging的目的是让模型Variance变小,所以前提是bagging里面的哪些模型必须足够强大,比如decision tree 深度为5的情况下,不管你怎么bagging都是没有用的。

adboost结果如下:

对于深度为5的decision tree,adaboost却能够使得模型之间互补,它可以从很弱的模型里训练出很强大的模型。

 

 

2.1.9 Addition Gradient Boosting

这里指出adaboosting可以用整合到梯度下降的理论中,只不过boosting里的梯度下降是对函数梯度下降,比较开脑洞,我没能get到。

3. Stacking

 

这个实践上非常有用,应该看出bagging的权重自学习版本,思想其实就是拿多个系统的输出连接一个浅层nn进行权重学习。需要注意的是,它指出,final classifier训练的时候,必须使用未训练过的数据,防止其中有的模型对数据过拟合,训练得很差,而final classifier以为它分数高训练得很好。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值