目录 |
- 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以为它分数高训练得很好。