“团结就是力量”这句老话很好地表达了机器学习领域中强大「集成方法」的基本思想。总的来讲,许多机器学习竞赛(包括 Kaggle)中最优秀的解决方案所采用的集成方法都创建在一个这样的假设上:将多个模型组合在一块儿一般能够产生更强大的模型。html
集成(Ensemble)方法就是针对同一任务,将多个或多种分类器进行融合,从而提升总体模型的泛化能力。对于一个复杂任务,将多个模型进行适当地综合所得出的判断,一般要比任何一个单独模型的判读好。也就是咱们常说的“三个臭皮匠,顶过诸葛亮”。算法
不过对于组合分类器必须知足两点:api
(1) 基模型之间应该是相互独立的
(2) 基模型应好于随机猜想模型框架
集成方法目前分为两种:Bagging 与 Boosting,下面分别介绍。dom
bagging的算法过程以下:机器学习
一、从原始样本集中使用Bootstraping 方法随机抽取n个训练样本,共进行k轮抽取,获得k个训练集(k个训练集之间相互独立,元素能够有重复)。ide
二、对于n个训练集,咱们训练k个模型(这个模型可根据具体的状况而定,能够是决策树,KNN等)。函数
三、对于分类问题:由投票表决产生的分类结果;对于回归问题,由k个模型预测结果的均值做为最后预测的结果(全部模型的重要性相同)。学习
boosting的算法过程以下:优化
一、对于训练集中的每一个样本创建权值$w_{i}$,表示对每一个样本的权重, 其关键在与对于被错误分类的样本权重会在下一轮的分类中得到更大的权重(错误分类的样本的权重增长)。
二、同时加大分类偏差几率小的弱分类器的权值,使其在表决中起到更大的做用,减少分类偏差率较大弱分类器的权值,使其在表决中起到较小的做用。每一次迭代都获得一个弱分类器,须要使用某种策略将其组合,最为最终模型(AbaBoost给每一个迭代以后的弱分类器一个权值,将其线性组合做为最终的分类器,偏差小的分类器权值越大)。
关于Boosting的两个核心问题:
一、在每一轮如何改变训练数据的权值或几率分布?
经过提升那些在前一轮被弱分类器分错样例的权值,减少前一轮分正确样例的权值,来使得分类器对误分的数据有较好的效果。
二、经过什么方式来组合弱分类器?
经过加法模型将弱分类器进行线性组合,好比AdaBoost经过加权多数表决的方式,即增大错误率小的分类器的权值,同时减少错误率较大的分类器的权值。而提高树经过拟合残差的方式逐步减少残差,将每一步生成的模型叠加获得最终模型。
Bagging和Boosting的区别:
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每一个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
Bagging:使用均匀取样,每一个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:
Bagging:全部预测函数的权重相等。
Boosting:每一个弱分类器都有相应的权重,对于分类偏差小的分类器会有更大的权重。
4)并行计算:
Bagging:各个预测函数能够并行生成
Boosting:各个预测函数只能顺序生成,由于后一个模型参数须要前一轮模型的结果。
5)Bagging是减小variance(方差),而Boosting是减小bias(误差)
Bagging对样本重采样,对每一重采样获得的子样本集训练一个模型,最后取平均。因为子样本集的类似性以及使用的是同种模型,所以各模型有近似相等的bias和variance(事实上,各模型的分布也近似相同,但不独立)。因为$E\left [ \frac{\sum X_{i}}{n} \right ]=E\left [X_{i} \right ]$,因此bagging后的bias和单个子模型的接近,通常来讲不能显著下降bias。另外一方面,若各子模型独立,则有$Var\left ( \frac{\sum X_{i}}{n} \right )=\frac{Var\left (X_{i} \right )}{n}$,此时能够显著下降variance。若各子模型彻底相同,则$Var\left ( \frac{\sum X_{i}}{n} \right )=Var\left (X_{i} \right )$,此时不会下降variance。bagging方法获得的各子模型是有必定相关性的,属于上面两个极端情况的中间态,所以能够必定程度下降variance。为了进一步下降variance,Random forest经过随机选取变量子集作拟合的方式de-correlated了各子模型(树),使得variance进一步下降。(用公式能够一目了然:设有i.d.的n个随机变量,方差记为$\sigma ^{2}$,两两变量之间的相关性为$\rho $,则$\frac{\sum X_{i}}{n}$的方差为$\rho \ast \sigma ^{2}+(1-\rho )\ast \sigma ^{2}/n$,Bagging下降的是第二项,Random Forest是同时下降两项。)
Boosting从优化角度来看,是用Forward-Stagewise这种贪心法去最小化损失函数$L(y,\sum a_{i}f_{i}(x))$。例如,常见的AdaBoost即等价于用这种方法最小化Exponential Loss:$L(y,f(x))=exp(-yf(x))$。所谓Forward-Stagewise,就是在迭代的第n步,求解新的子模型$f(x)$及步长$a$(或者叫组合系数),来最小化$L(y,f_{n-1}(x)+af(x))$,这里$f_{n-1}(x)$是前n-1步获得的子模型的和。所以Boosting是在Sequential地最小化损失函数,其bias天然逐步降低。但因为是采起这种Sequential、Adaptive的策略,各子模型之间是强相关的,因而子模型之和并不能显著下降variance。因此说Boosting主要仍是靠下降bias来提高预测精度。
这两种方法都是把若干个分类器整合为一个分类器的方法,只是整合的方式不同,最终获得不同的效果,将不一样的分类算法套入到此类算法框架中必定程度上会提升了原单一分类器的分类效果,可是也增大了计算量。
下面是将决策树与这些算法框架进行结合所获得的新的算法:
1)Bagging + 决策树 = 随机森林
2)AdaBoost + 决策树 = 提高树
3)Gradient Boosting + 决策树 = GBDT
参考
https://baijiahao.baidu.com/s?id=1633580172255481867&wfr=spider&for=pc
https://www.pianshen.com/article/1393124418/