Bagging
一个复杂的模型可能会导致:高方差,怎么办?
多找几个这样的模型,组合取平均,这样结果就会好很多
放回式抽样,这样可以获得几笔不同的数据集:DataSet->n*DataSet
使用这几笔数据训练不同的分类器
在测试集中,再使用上述几个分类器,投票(分类)/ 取平均(回归)
对Decision Tree使用Bagging------>Random Forest
但是,如果仅仅训练集resample是不够的
还要:决策树划分节点的时候,某些节点只能使用部分特征(限制某些feature不能用)
最后,Out-of-Bag Validation for bagging(oob袋外验证,即一直没用被采样到的数据,拿来作为交叉验证)
OOB
如下图,O表示使用,X表示未使用
我们可以使用f2和f3组合作为随机森林,然后使用x3作为测试集(f2和f3都没使用x3)
Boosting
-
Bagging是用在很复杂(很强,越复杂越强嘛)的模型上(老大妈考虑太周到了,想办法让她不要太关注细枝末节),主要是想降低Variance(方差),避免过拟合
-
Bagging主要技巧:打散数据集,有放回的采样
-
Boosting是用在很弱的模型上的(能力互补的菜鸡分工合作),主要是想降低Bias(偏差)
-
Boosting主要技巧:对不能正确分类的数据集重点关注,加大权重
大致流程:
获取第一个分类器f1
.
寻找能辅助(互补)f1的分类器f2 (跟f1差不多的话就不行。不过怎么找?)
.
反复上述
.
组合所有分类器(注意顺序)
如果获取不同的分类器?
- 方法一:还是放回式采样
- 方法二:给每一笔数据设置不同的权重,构成不同的数据集。之后再Loss损失函数中反应出权重即可。
Adaboost
在训练集X1上获取了分类器f1,假设loss=0.25
改变权重获取训练集X2(X1变来的),使得f1的loss=0.5( 我们拿着放大镜看f1的弊端 [分类错误的数据加大权重,分类对的减小],从而我们可以找到f2来修复。)
- 第一次给f1出的是正常的卷子;
- 第二次给f1出的是**“会的都不考,考的都不会”**的那种卷子,f1就蒙了。不过蒙了好啊,说明老师找到f1不会的东西了。怎么办呢?我们就去找f2同学,让f2来做这套卷子。新的卷子,f2就做的比f1好多了。
- f2做完了这第二套卷子,也有不会的啊。老师就又给f2出了你f2 **“会的都不考,考的都不会”**的卷子,这下f2蒙了,于是f3登场…
- 就这样,找来了越来越多的同学,题目再难也都能有人会做了
而数学上的重点就是要找到上图√3(我们把它记为d),来使得f2更好,计算公式: d=√[ (1-loss) / loss ]
Gradient Boosting
回过来思考Adaboost,就是不断寻找 小分类器f(t) 来完善 最终的分类器g(t)
我们在寻找 f(t) 的时候,究竟是如何判断它是我们想要的呢?
答:Loss函数
Loss必然与g(t)产生联系:loss(g(t))
有联系,那就好办了–>梯度下降:
一看,什么鬼?
其实,跟之前是差不多的:
后面通过梯度求得的其实就是理想的新分类器
Stacking
至于stacking,我的感觉就是Bagging参考了boosting之后,对原本的投票(取平均)机制进行了更新(主要是添加权重)
有了数据X,有了4个模型(小明、老王、老李、小毛),但是不知道这四个模型哪个好哪个辣鸡,所以干脆针对它们的输出Y再来一次分类器(Final Classifier),并进行训练。
于是乎,我们就能很好地利用原有的4个模型了!-
再来看看最常见的stacking图:
给了训练集(X, Y),通过交叉验证的方式获得(X, Y’) - - - - - - - 多了一撇
每个模型都获得一个Y’
再进行第二次的分类器训练(Final Classifier)—>获得模型权重
最终,组合集成–>获得最终模型
PS:上图绿色主要是保证数据集与模型的对应(应该是的…)
本文主要参考台湾大学李宏毅ML课程,加之自己的理解所写