集成学习—Boosting、Bagging

集成学习

集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统(multi-classifier system).
如下图,集成学习的一般结构是:先产生一组“个体学习器”(individual learner),再用某种策略将它们结合起来。
        

个体学习器通常是用一个现有的学习算法从训练数据产生,例如C4.5决策树算法、BP神经网络算法等。此时集成中只包含同种类型的个体学习器,例如“决策树集成”中的个体学习器全是决策树,“神经网络集成”中就全是神经网络,这样的集成是“同质”(homogeneous)的,同质集成中的个体学习器也称为“基学习器”(base learner),相应的学习算法称为“基学习算法”(base learning algorithm)。有同质就有异质(heterogeneous),若集成包含不同类型的个体学习器,例如同时包含决策树和神经网络,那么这时个体学习器一般不称为基学习器,而称作“组件学习器”(component leaner)或直接称为个体学习器。

而根据个体学习器生成方式的不同,目前集成学习方法大致可分为两大类,即个体学习器间存在强依赖关系、必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表是Boosting,后者的代表是和Bagging和“随机森林”(Random Forest)。

1、Boosting

Boosting, 也称为增强学习或提升法,是一种重要的集成学习技术, 能够将预测精度仅比随机猜度略高的弱学习器增强为预测精度高的强学习器,

Boosting是一族可将弱学习器提升为强学习器的算法。这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多的关注,(通过改变训练样本的概率分布,提高前一轮弱分类器的分类错误的样本权重,降低正确分类的样本权重)然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到预先指定的值T,最终将这T个基学习器进行加权结合。在产生单个的基分类器时可用相同的分类算法,也可用不同的分类算法,这些算法一般是不稳定的弱分类算法,如神经网络(BP) ,决策树(C4.5)等。

Boosting算法要求基学习器对特定的数据分布进行学习,这一点是通过“重赋权法”(re-weighting)实现的,即在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重,对无法接受代全样本的基学习算法,则可通过“重采样法”(re-sampling)来处理,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得到的样本集对基学习器进行训练。一般而言,这两种做法没有显著的优劣差别。不过由于Boosting算法在训练的每一轮都会检查当前生成的基学习器的是否满足基本条件,若不符合则抛弃当前基学习器,并停止学习过程。在此种情况下,初始设置的学习轮数T也许还远未达到,这会导致最后的集成中只包含很少的基学习器而性能不佳。而若采用“重采样法”,则可以获得“重启动”机会以避免训练过程的过早停止,即在抛弃不满足条件的当前基学习器之后,再根据当前分布重新对训练样本进行重采样,再基于新的采样结果重新训练出基学习器,从而使得学习过程可以持续到预设的T轮完成。

而从偏差-方差分解的角度看,Boosting主要关注降低偏差(避免欠拟合),仔细想想便可理解,因为boosting算法每个分类器都是弱分类器,而弱分类器的特性就是high-bias & low variance(高偏差-低方差),其与生俱来的优点就是泛化性能好。因此,将多个算法组合起来之后,可以达到降偏差的效果,进而得到一个偏差小、方差小的泛化能力好的模型。因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。

Boosting也是集合了多个决策树,但是Boosting的每棵树是顺序生成的,每一棵树都依赖于前一颗树。顺序运行会导致运行速度慢

1.1、AdaBoost

AdaBoost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二类分类学习方法。

AdaBoost是adaptive boosting( 自适应增强 )的缩写,其运行过程如下:

  训练数据中的每个样本,并赋予其一个权重,这些权重构成了向量D,一开始,这些权重都初始化成相等值。首先在训练数据上训练出一个若分类器并计算该分类器的错误率,然后在同一数据集上再次训练弱分类器。在分类器的第二次训练中,将会重新调整每个样本的权重,其中第一次分对的样本的权重将会降低,而第一次分错的样本的权重将会提高。为了从所有弱分类器中得到最终的分类结果,AdaBoost为每个分类器都分配了一个权重值alpha,这些alpha值是基于每个弱分类器的错误率进行计算的。 计算出alpha值之后,可以对权重向量D进行更新,以使得那些正确分类的样本的权重降低而错分样本的权重升高。AdaBoost算法会不断地重复训练和调整权重的过程,直到训练错误率为0或弱分类器的数目达到指定值为止。

算法思想:

关于Adaboost,它是boosting算法,从bias-variance(偏差-方差)的角度来看,boosting算法主要关注的是降低偏差。仔细想想便可理解,因为boosting算法每个分类器都是弱分类器,而弱分类器的特性就是high-bias & low variance(高偏差-低方差),其与生俱来的优点就是泛化性能好。因此,将多个算法组合起来之后,可以达到降偏差的效果,进而得到一个偏差小、方差小的泛化能力好的模型。另外,Adaboost的损失函数是指数损失L(y,f(x))=e^{-yf(x)} 。

具体说来,整个Adaboost 迭代算法就3步:

  • 第一步:初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
  • 第二步:训练弱分类器。迭代M次,每次都根据错误率e m 不断修改训练数据的权值分布(此处需要确保弱学习器的错误率e小于0.5,因为二分类问题随机猜测的概率是0.5),样本权值更新规则为增加分类错误样本的权重,减少分类正确样本的权重;
  • 第三步:根据每个弱分类器器的系数α m ,将M个弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。

AdaBoost算法流程:

(1)初始化训练数据的权值分布,每一个训练样本最开始时都被赋予相同的权值:1/N。

                                     D_1 = (w_{11},w_{12},...w_{1N}),w_{1i} = \frac{1}{N},i=1,2,...,N   

(2)对m=1,2,...,M

  (a)使用具有权值分布D m的训练数据集学习,得到基本分类器(选取让误差率最低的阈值来设计基本分类器):

                                     G_m(x):\chi \rightarrow \begin{Bmatrix} -1,+1 \end{Bmatrix}

  (b)计算第m次分类器G m (x)在训练数据集上的分类误差率

                                     e_m = P(G_m(X_i) \neq y_i ) = \sum_{i=1}^{N} w_{mi}I(G_m(x_i) \neq y_i)
    e m = 未正确分类的样本数目/所有样本数目

  (c)计算第m次分类器G m (x)的系数

                                    \alpha_m = \frac{1}{2}log \frac{1-e_m}{e_m}
由上式可知,a m 随着e m 的减小而增大,意味着分类误差率越小的基本分类器在最终分类器中的作用越大。

  (d)更新训练数据集的权值分布(目的:得到样本的新的权值分布),用于下一轮迭代,使得被基本分类器Gm(x)误分类样本的权值增大,而被正确分类样本的权值减小。就这样,通过这样的方式,AdaBoost方法能“重点关注”或“聚焦于”那些较难分的样本上。
                                     D_{m+1}= (w_{m+1},w_{m+1,2},...w_{m+1,N})

                                    w_{m+1,i} = \frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i)),i=1,2,...,N           
    其中,Z m 是规范化因子,使得D m +1成为一个概率分布:

                                          Z_m = \sum_{i=1}^{N}w_{mi}exp(- \alpha_my_iG_m(x_i))
  ;通过简化,可把上述的更新权值公式简化为:
    * 正确分类时:  w_{2i} = \frac{w_{1i}}{2(1-e_m)} 
    * 错误分类时:w_{2i} = \frac{w_{1i}}{2e_m} 

(3)构建基本分类器的线性组合

                                    f(x) = \sum_{m=1}^{M}\alpha_mG_m(x)
     得到最终分类器:

                                    G(x) = sign(f(x)) = sign(\sum_{m=1}^M \alpha_mG_m(x))

公式推导过程详见链接

AdaBoost最基本的性质是能在学习过程中不断减少训练误差(训练误差以指数速率下降),即在训练数据集上的分类误差率。

AdaBoost的优点和缺点:

优点:

  •  (1)Adaboost提供一种框架,在框架内可以使用各种方法构建子分类器。可以使用简单的弱分类器,不用对特征进行筛选,也不存在过拟合的现象。
  •  (2)Adaboost算法不需要弱分类器的先验知识,最后得到的强分类器的分类精度依赖于所有弱分类器。无论是应用于人造数据还是真实数据,Adaboost都能显著的提高学习精度。
  •  (3)Adaboost算法不需要预先知道弱分类器的错误率上限,且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,可以深挖分类器的能力。Adaboost可以根据弱分类器的反馈,自适应地调整假定的错误率,执行的效率高。
  •  (4)Adaboost对同一个训练样本集训练不同的弱分类器,按照一定的方法把这些弱分类器集合起来,构造一个分类能力很强的强分类器,即“三个臭皮匠赛过一个诸葛亮”。
     

缺点:

  •  在Adaboost训练过程中,Adaboost会使得难于分类样本的权值呈指数增长,训练将会过于偏向这类困难的样本,导致Adaboost算法易受噪声干扰。此外,Adaboost依赖于弱分类器,而弱分类器的训练时间往往很长。

1.2、GBDT

原理

GBDT与传统的Boosting区别较大,它的每一次计算都是为了减少上一次的残差,而为了消除残差,我们可以在残差减小的梯度方向上建立模型,所以说,在GradientBoost中,每个新的模型的建立是为了使得之前的模型的残差往梯度下降的方法,与传统的Boosting中关注正确错误的样本加权有着很大的区别。

在GradientBoosting算法中,关键就是利用损失函数的负梯度方向在当前模型的值作为残差的近似值,进而拟合一棵CART回归树。

GBDT的会累加所有树的结果,而这种累加是无法通过分类完成的,因此GBDT的树都是CART回归树,而不是分类树。

优缺点:

GBDT的性能在RF的基础上又有一步提升,因此其优点也很明显,1、它能灵活的处理各种类型的数据;2、在相对较少的调参时间下,预测的准确度较高。

当然由于它是Boosting,因此基学习器之前存在串行关系,难以并行训练数据。

1.3、XGBoost

原理

XGBoost的性能在GBDT上又有一步提升,而其性能也能通过各种比赛管窥一二。坊间对XGBoost最大的认知在于其能够自动地运用CPU的多线程进行并行计算,同时在算法精度上也进行了精度的提高。

由于GBDT在合理的参数设置下,往往要生成一定数量的树才能达到令人满意的准确率,在数据集较复杂时,模型可能需要几千次迭代运算。但是XGBoost利用并行的CPU更好的解决了这个问题。

其实XGBoost和GBDT的差别也较大,这一点也同样体现在其性能表现上,详见XGBoost与GBDT的区别。

GBDT和XGBoost区别:

  • 传统的GBDT以CART树作为基学习器,XGBoost还支持线性分类器,这个时候XGBoost相当于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归);
  • 传统的GBDT在优化的时候只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数;
  • XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。从权衡方差偏差来看,它降低了模型的方差,使学习出来的模型更加简单,放置过拟合,这也是XGBoost优于传统GBDT的一个特性;
  • shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);
  • 列抽样。XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过 拟合,还能减少计算;
  • 对缺失值的处理。对于特征的值有缺失的样本,XGBoost还可以自动 学习出它的分裂方向;
  • XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行 的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代 中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

 

2、Bagging 

由Boosting内容可知,要想获得泛化性能强的集成,集成中的个体学习器应尽可能相互独立。而“独立”在现实任务中比较难以做到,不过我们可以设法使基学习器尽可能具有较大的差异。给定一个训练集,一种可能的做法是对训练样本进行采样,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器,这样,由于训练数据不同,我们获得的基学习器可望具有比较大的差异。然而,为获得好的集成,我们同时希望个体学习器不能太差。如果采样出的每个子集都完全不同,则每个基学习器只用到了一小部分训练数据,那甚至不能进行有效的学习,更不谈确保产生比较好的基学习器了。于是,为了解决这个问题,我们使用相互有交叠的采样子集

Bagging是 并行式集成学习 方法最著名的代表,它基于前面提到过的自助采样法(bootstrap sampling)。给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过m此随机采样操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。初始训练集中越有63.2%的样本出现在采样集中。(有放回的随机采样)

于是,我们可以采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再集成,这就是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对分类任务采用简单投票法,对回归任务使用简单平均法。若分类预测时出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者。

  • 包外估计(out-of-bag estimate):
      Bagging的自助采样做法为Bagging带来一个优点是:由于每个基学习器只使用了初始训练集中大约63.2%的样本,剩下的约36.8%的样本则可用作验证集来对泛化性能进行“包外估计”。
    从偏差-方差分解的角度看,Bagging主要关注降低方差(防止过拟合),因此它在不剪枝决策树、神经网络等容易受样本扰动的学习器上效用更为明显。

与标准AdaBoost只适用于二分类任务不同(为处理多分类或回归任务,AdaBoost需进行修改),Bagging能不经修改的用于多分类、回归等任务。

2.1、随机森林

随机森林(Random Forest,简称RF)是Bagging的一个扩展变体。其在以决策树作为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择。 因此可以概括RF包括四个部分:1、随机选择样本(放回抽样);2、随机选择特征;3、构建决策树;4、随机森林投票(平均)。

具体来说,传统决策树在选择划分属性时是在当前结点的属性集合(假定有d个属性)中选择一个最有属性;而在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统决策树相同;若令k=1,则是随机选择一个属性用于划分;一般情况下,推荐值k=log 2 d。

在构建决策树的时候,RF的每棵决策树都最大可能的进行生长而不进行剪枝;在对预测输出进行结合时,RF通常对分类问题使用简单投票法,回归任务使用简单平均法。

RF的重要特性是不用对其进行交叉验证或者使用一个独立的测试集获得无偏估计,它可以在内部进行评估,也就是说在生成的过程中可以对误差进行无偏估计,由于每个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用做验证集来对其泛化性能进行“包外估计”。

RF和Bagging对比:  

RF的收敛性与Bagging相似。随机森林的起始性能往往相对较差,特别是在集成中只包含一个基学习器时,这很容易理解,因为通过引入属性扰动,随机森林中个体学习器的性能往往有所降低。然而,随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差。值得一提的是,随机森林的训练效率常优于Bagging,因为在个体决策树的构建过程中,Bagging使用的是“确定型”决策树,在选择划分属性时要对结点的所有属性进行考察,而随机森林使用的“随机型”决策树则只需考察一个属性子集。

优缺点:

随机森林的优点较多,简单总结:

  • 1、在数据集上表现良好,相对于其他算法有较大的优势(训练速度、预测准确度);
  • 2、能够处理很高维的数据,并且不用特征选择,而且在训练完后,给出特征的重要性(可用于特征选择);
  • 3、容易做成并行化方法。

RF的缺点:在噪声较大的分类或者回归问题上会过拟合。

3、Boosting与Bagging对比

bagging算法只能改善模型高方差(high variance)情况,Boosting算法对同时控制偏差(bias)和方差都有非常好的效果,而且更加高效

猜你喜欢

转载自blog.csdn.net/choven_meng/article/details/82886443