Machine Learning学习笔记(十四)集成学习(Boosting,Bagging,组合策略)

集成学习

在一些数据挖掘竞赛中,后期我们需要对多个模型进行融合以提高效果时,常常会用到Bagging,Boosting,Stacking等这几个框架算法。

集成学习在机器学习算法中具有较高的准确率,不足之处就是模型的训练过程可能比较复杂,效率不是很高。目前接触较多的集成学习主要有2种:基于Boosting的和基于Bagging,前者的代表算法有Adaboost、GBDT、XGBOOST、后者的代表算法主要是随机森林。


集成学习主要思想:利用一定的手段学习出多个分类器,而且这多个分类器要求是弱分类器,然后将多个分类器进行组合公共预测。核心思想就是如何训练处多个弱分类器以及如何将这些弱分类器进行组合,个体分类器应该“好而不同”。

弱分类器如何选择:一般采用弱分类器的原因在于将误差进行均衡,因为一旦某个分类器太强了就会造成后面的结果受其影响太大,严重的会导致后面的分类器无法进行分类,常用的弱分类器可以采用误差小于0.5的,比如逻辑斯蒂回归,SVM,神经网络等。

如何生成个体学习器:

(1)个体学习器间存在强依赖关系,必须串行生成的序列化方法,例如基于Boosting;

(2)个体学习器间不存在强依赖关系,可同时生成的并行化方法,例如基于Bagging和随机森林。


Boosting算法:

基本思想:先从初始训练集上训练一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器,如此反复进行,直至基学习器数目达到实现指定的值T,最终将这T个基学习器进行加权结合。Boosting也是集合了多个决策树,但是Boosting的每棵树是顺序生成的,每一棵树都依赖于前一颗树。顺序运行会导致运行速度慢

Boosting有很多种,比如AdaBoost(Adaptive Boosting), Gradient Boosting等,这里以AdaBoost,Gradient Boosting为典型讲下。

(1)Adaboost算法

基本思想:AdaBoost,运用了迭代的思想。每一轮都加入一个新训练一个预测函数,直到达到一个设定的足够小的误差率,或者达到最大的树的数目。

算法流程:

①开始的时候每一个训练样本都被赋予一个初始权重,用*所有样本*训练第一个预测函数。计算该预测函数的误差,然后利用该误差计算训练的预测函数的权重系数(该预测函数在最终的预测函数中的权重,此处忽略公式)。接着利用误差更新样本权重(此处忽略公式)。如果样本被错误预测,权重会增加;如果样本被正确预测,权重会减少。通过权重的变化,使下轮的训练器对错误样本的判断效果更好。

②以后每轮训练一个预测函数。根据最后得出的预测函数的误差计算新训练的预测函数在最终预测中的权重,然后更新样本的权重。权重更新之后,所有样本用于下轮的训练。

③如此迭代,直到误差小于某个值或者达到最大树数。

这里涉及到两个权重,每轮新训练的预测函数在最终预测函数中所占的权重和样本下一轮训练中的权重。这两个权重都是关于 每轮训练的预测函数产生的误差 的函数。

Adaboost的算法: 
假设训练数据集为T={(X1,Y1),(X2,Y2),(X3,Y3),(X4,Y4),(X5,Y5)} 其中Yi={-1,1}

1、初始化训练数据的分布  
训练数据的权重分布为D={W11,W12,W13,W14,W15},其中W1i=1/N。即平均分配。

2、选择基本分类器  
这里选择最简单的线性分类器y=aX+b ,分类器选定之后,最小化分类误差可以求得参数。

3、计算分类器的系数和更新数据权重  
误差率也可以求出来为e1.同时可以求出这个分类器的系数。基本的Adaboost给出的系数计算公式为 
这里写图片描述 
上面求出的am就是这个分类器在最终的分类器中的权重。然后更新训练数据的权重分布。如果样本被错误预测,权重会增加;如果样本被正确预测,权重会减少。 
总而言之:Boosting每次迭代循环都是利用所有的训练样本,每次迭代都会训练出一个分类器,根据这个分类器的误差率计算出该分类器的在最终的分类器中的权重,并且更新训练样本的权重。这就使得每次迭代训练出的分类器都依赖上一次的分类器,串行速度慢。 
Boosting最终的组合弱分类器方式: 
通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。 
这里写图片描述

(2)

这里写图片描述

简单理解上面流程,其中N为样本个数,M为树的数目。其中(a),(b),(c)步骤表示根据梯度计算出下一棵树以及下一棵树在组合中的权重。 
注意:这里写图片描述是损失函数对f(x)求偏导,并不是对x求偏导。

Gradient Boost与传统的Boost的区别是,Gradient Boost会定义一个loassFunction,每一次的计算是为了减少上一次的loss,而为了消除loss,我们可以在loss减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boost中,每个新的模型的建立是为了使得之前模型的loss往梯度方向减少,与传统Boost对正确、错误的样本进行加权有着很大的区别。


Bagging算法

(1)基本思想:自助采样法,给定包含m个样本的数据集,随机取出一个样本放入采样集中,再把该样本放回初始数据集,这样经过m次随机采样操作,可以得到含m个样本的采样集。照这样,可以采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。结合时对多分类任务使用简单投票法,对回归任务使用简单平均法。

(2)优点: a.训练一个Bagging集成与直接使用基学习算法训练一个学习器的复杂度同阶,高效;b.标准的AdaBoost只适用于二分类,Bagging能直接用于多分类,回归等任务;c.因为自助采样,每个基学习器只使用了出事训练集中约63.2%的样本,剩下的样本可以用作验证集等等。

(3) 特点:关注降低方差,在易受样本扰动的学习器上效用更为明显。

(4)随机森林算法(RandomForest,简称RF)

基本思想:RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。(即先从节点的属性集合M中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分,一般k远小于M,取k= )

特点:两个随机过程避免了过拟合现象的出现(一是输入数据是随机的从整体的训练数据中选取一部分作为一棵决策树的构建,而且是有放回的选取,第二个是随即特征的选取)。

过程:a. 从训练数据中选取n个数据作为训练数据输入,有放回的选取,这样会造成一部分数据无法被取到,这部分数据被称为袋外数据,可以使用其做误差估计;b.选取了输入的训练数据之后,需要构建决策树,随机选取k个特征;c.构造决策时,按照选取最小的基尼指数进行分裂节点的选取进行决策树的构建,直到该节点所有训练样例都属于同一类或达到树的最大深度;d,重复b、c,得到随机森林;e. 多数投票进行决策。

注意点:不需要剪枝,构建决策树时分裂点的选择是依据最小基尼系数的。

基尼系数:

优点:1.两个随机性的引入使得随机森林不容易陷入过拟合还具有很好的抗噪声能力;2.容易做成并行化方法;3.实现简单;4.能够处理高纬度的数据,并且不需要做特征选择。

缺点:对噪声敏感。

如何在随机森林中避免出现过拟合?1.对树的深度进行控制;2.把模型训练比较复杂,看合并节点后的子树能否降低泛化误差。

对于Bagging需要注意的是,每次训练集可以取全部的特征进行训练,也可以随机选取部分特征训练,例如随机森林就是每次随机选取部分特征

讲完Boosting,Bagging,我们来总结下这两种框架算法的异同点: 

1)样本选择上: 
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。

Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

2)样例权重:

Bagging:使用均匀取样,每个样例的权重相等

Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

3)预测函数:

Bagging:所有预测函数的权重相等。

Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

4)并行计算:

Bagging:各个预测函数可以并行生成

Boosting:理论上各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。计算角度来看,两种方法都可以并行。bagging, random forest并行化方法显而意见。boosting有强力工具stochastic gradient boosting

5)bagging是减少variance,而boosting是减少bias 
在机器学习中,我们用训练数据集去训练(学习)一个model(模型),通常的做法是定义一个Loss function(误差函数),通过将这个Loss(或者叫error)的最小化过程,来提高模型的性能(performance)。然而我们学习一个模型的目的是为了解决实际的问题(或者说是训练数据集这个领域(field)中的一般化问题),单纯地将训练数据集的loss最小化,并不能保证在解决更一般的问题时模型仍然是最优,甚至不能保证模型是可用的。这个训练数据集的loss与一般化的数据集的loss之间的差异就叫做generalization error。而generalization error又可以细分为Bias和Variance两个部分。 

error=Bias+Variance 
这里写图片描述 
可以通过降低Bias或者降低Variance来减小error

Bagging对样本重采样,对每一重采样得到的子样本集训练一个模型,最后取平均。由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的bias和variance(事实上,各模型的分布也近似相同,但不独立)。由于这里写图片描述,所以bagging后的bias和单个子模型的接近,一般来说不能显著降低bias。另一方面,若各子模型独立,则有这里写图片描述,此时可以显著降低variance。若各子模型完全相同,则这里写图片描述,此时不会降低variance。bagging方法得到的各子模型是有一定相关性的,属于上面两个极端状况的中间态,因此可以一定程度降低variance。为了进一步降低variance,Random forest通过随机选取变量子集做拟合的方式de-correlated了各子模型(树),使得variance进一步降低。boosting从优化角度来看,是用forward-stagewise这种贪心法去最小化损失函数这里写图片描述。例如,常见的AdaBoost即等价于用这种方法最小化exponential loss:这里写图片描述。所谓forward-stagewise,就是在迭代的第n步,求解新的子模型f(x)及步长a(或者叫组合系数),来最小化这里写图片描述,这里这里写图片描述是前n-1步得到的子模型的和。因此boosting是在sequential地最小化损失函数,其bias自然逐步下降。但由于是采取这种sequential、adaptive的策略,各子模型之间是强相关的,于是子模型之和并不能显著降低variance。所以说boosting主要还是靠降低bias来提升预测精度。  
6)Bagging里面每个分类器是强分类器,因为他降低的是方差,方差过高需要降低是过拟合。

      boosting里面每个分类器是弱分类器,因为他降低的是偏差,偏差过高是欠拟合。

组合策略

为什么要结合学习器:(1)统计方面,由于假设空间往往很大,可能有多个假设在训练集上达到同等性能。此时若使用单学习器可能因误选导致泛化性能不佳;(2)计算方面,单个学习算法容易陷入局部极小;(3)表示方面,某些学习任务的真实假设可能不在当前学习算法的假设空间,此时使用多个学习器扩大假设空间。

算法:平均法(加权(个体学习器性能相差较大),简单(性能相近)),投票法(绝对多数(超过半数标记。否则拒绝预测),相对多数,加权投票),学习法(通过另一个学习器来进行结合,Stacking算法

Stacking算法:

基本思想:先从初始数据集训练出初级学习器,然后生成一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而出事样本的标记仍被当作样例标记。

注意点:若直接用初级学习器的训练集来产生次级训练集,则过拟合风险会比较大;一般会通过交叉验证等方式,用训练初级学习器未使用的样本来产生次级学习器的训练样本。

如何增强集成学习的多样性?

(1)     数据样本扰动(基于采样法,给定初始数据集,可以产生不同的数据子集,例如Bagging的自助采样,AdaBoost的序列采样),适合不稳定的基学习器(决策树,神经网络等)。

(2)     输入属性扰动(不同的属性子集提供了观察数据的不同视角),适合于冗余属性多的数据集。

(3)     输出表示扰动(对训练样本的类标记稍作变动或者对输出表示进行转化)

(4)     算法参数扰动(修改基学习器的参数,如神经网络层数等等)。

参考链接

[1]:https://blog.csdn.net/cppjava_/article/details/68485565

猜你喜欢

转载自blog.csdn.net/weixin_41806692/article/details/82433046