【机器学习】集成学习AdaBoost、GBDT、XGboost、LightGBM、RF算法的对比分析

一. boosting算法简介

boosting算法是集成学习算法的一种,主要目标为将弱学习器“提升”为强学习器。个体学习器之间存在强依赖关系,必须串行生成。
大部分Boosting算法都是根据前一个学习器的训练效果对样本点的权重进行调整,提高前一轮中学习误差率高的训练样本点的权重,使得误差率高的样本点在后一轮的弱学习器中得到更多的重视,再根据新的样本权重训练下一个学习器,如此迭代M次,最后将一系列弱学习器组合成一个强学习器。

1.Adaboost

(1) 算法简介

AdaBoost是基于boosting的思想,通过多个弱分类器的线性组合来得到强分类器。
在训练过程中,它不改变所给的训练数据,而是不断改变训练数据权值的分布,使得被误分类的数据样本在后一轮的训练中受到更大的关注。

同时采用加权多数表决的方法,加大分类误差率小的弱分类器的权值,使其在最后的表决中起更大的作用。所有弱分类器的权值之和并不为1,是通过最后结果的符号来决定实例的类别,该结果的绝对值表示分类的确信度。

(2)算法流程

输入为样本集T={(x,y1),(x2,y2),...(xm,ym)},输出为{-1, +1},弱分类器算法, 弱分类器迭代次数T。

输出为最终的强分类器H(x)
1.初始化样本集权重为:

\[D(1) = (w_{11}, w_{12}, ...w_{1m}) ;\;\; w_{1i}=\frac{1}{m};\;\; i =1,2...m \]

即每个样本权重初始化是一样的。

2.对于每一轮的迭代 t=1,2,...T:
(1) 使用具有权重 \(D_t\) 的样本集来训练数据,得到弱分类器 \(h_t\)
(2)计算弱分类器\(h_t\)的分类误差率

\[e_t = P(h_t(x_i) \neq y_i) = \sum\limits_{i=1}^{m}w_{ti}I(h_t(x_i) \neq y_i) \]

(3) 计算弱分类器的权重

\[\alpha_t = \frac{1}{2}log\frac{1-e_t}{e_t} \]

(4) 更新样本集的权重分布

\[w_{t+1,i} = \frac{w_{ti}}{Z_t}exp(-\alpha_ty_ih_t(x_i)) \;\; i =1,2,...m \]

这里Zk是规范化因子

\[Z_t = \sum\limits_{i=1}^{m}w_{ti}exp(-\alpha_ty_ih_t(x_i)) \]

3.构建最终分类器为:

\[H(x) = sign(\sum\limits_{t=1}^{T}\alpha_th_t(x)) \]

(3) 算法优缺点

Adaboost的主要优点有:

1)Adaboost作为分类器时,分类精度很高

2)在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。

3)作为简单的二元分类器时,构造简单,结果可理解。

4)不容易发生过拟合

Adaboost的主要缺点有:

1)对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。

2. GBDT

(1) 算法简介

Gradient Boosting是Boosting中的一大类算法,弱分类器之间有很强的依赖性,需要串行生成。
GBDT使用前向分布算法,训练中每轮迭代都去拟合损失函数在当前模型下的负梯度(当前模型残差的近似值),从而使得参数朝着最小化损失函数的方向更新。直到残差小于某个阈值或者达到迭代次数M。 最后将训练好的M个弱分类器以累加的形式得到最后的模型。

通俗的来讲,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。最后将每次拟合的岁数加起来便是模型输出的结果。

(2) 算法步骤

1.初始化弱学习器

\[f_0(x) = \underbrace{arg\; min}_{c}\sum\limits_{i=1}^{m}L(y_i, c) \]

2.迭代:t = 1,2,3...T有:
(1) 对样本i1,2...m,计算负梯度

\[r_{ti} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)} \]

(2) \((x_i,r_{ti})(i=1,2,3...m)\) 拟合一棵CART回归树,得到第t棵回归树,对应的叶子节点区域为 \(R_{tj})(j=1,2,3...J)\) ,其中J为回归树t的叶子节点的个数。

(3) 对叶子区域j=1,2,....J,计算最佳拟合值

\[c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} L(y_i,f_{t-1}(x_i) +c) \]

(4) 更新强学习器

\[f_{t}(x) = f_{t-1}(x) + \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj}) \]

3.强学习器f(x)的表达式

\[f(x) = f_T(x) =f_0(x) + \sum\limits_{t=1}^{T}\sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj}) \]

(3) 算法优缺点

GBDT主要的优点有:

  1) 可以灵活处理各种类型的数据,包括连续值和离散值。

  2) 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。

  3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。

GBDT的主要缺点有:

  1)由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。

(4) 为什么使用决策树作为基学习器

  1. 决策树较好的解释性和鲁棒性,能够自动发现特征间的高阶关系,并且也不需要对数据进行特殊的预处理如归一化等。
  2. 决策树的表达能力和泛化能力,可以比较方便的通过调节树的层数等来做折中。
  3. 数据样本的扰动对于决策树的影响较大,因此不同子样本集合生成的决策树基分类器随机性较大,这样的“不稳定学习器”更适合作为基分类器。此外, 在决策树节点分裂的时候,随机地选择一个特征子集,从中找出最优分裂属性, 很好地引入了随机性。

3.XGboost

(1)算法简介

xgboost是梯度提升树的一种高效系统实现,是对GBDT进一步的改进,包括对代价函数进行了二阶泰勒展开,在代价函数里加入了正则项,借鉴了随机森林的列采样方法,支持并行计算等。

(2) XGboost¶与GBDT 两者之间的区别和联系

1)GBDT是机器学习算法,XGBoost是该算法的工程实现。       

2)在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,提高模型的泛化能力。 
  
3)GBDT的损失函数只对误差部分做负梯度(一阶泰勒)展开,而XGBoost损失函数对误差部分做二阶泰勒展开,更加准确。    

4)传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器。            

5)传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机森林相似的策略,支持对数据进行采样。          

6)传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺失值的处理策略。

7)Boosting算法的弱学习器是没法并行迭代的,但是单个弱学习器里面最耗时的是决策树的特征分裂过程,XGBoost针对这个分裂做了比较大的并行优化。对于不同的特征的特征划分点,XGBoost分别在不同的线程中并行选择分裂的最大增益。同时,对训练的每个特征排序并且以块的的结构存储在内存中,方便后面迭代重复使用,减少计算量。  

4.Lightgbm

(1) 算法简介

LightGBM是一个实现GBDT算法的分布式高效框架。它通过leaf-wise分裂方法进行决策树的生成,通过基于直方图的算法寻找特征分割点,并支持并行学习,能够更高效的处理大数据,也得到了越来越广泛的应用。

(2)Lightgbm ¶与GBDT , XGboost之间的区别和联系

lightGBM在传统的GBDT算法上进行了如下优化:

要减少训练的复杂度,可以通过减少特征量和数据量来实现,即从行和列两个角度来减少数据,同时要尽可能少的影响最后的精度。在LightGBM中,就是这样做的,对应着GOSS和EFB.

  1) Gradient-based One-Side Sampling (GOSS):GBDT虽然没有数据权重,但每个数据实例有不同的梯度,根据计算信息增益的定义,梯度大的实例对信息增益有更大的影响,因此在下采样时,我们应该尽量保留梯度大的样本(预先设定阈值,或者最高百分位间),随机去掉梯度小的样本。此措施在相同的采样率下比随机采样获得更准确的结果,尤其是在信息增益范围较大时。

  2) Exclusive Feature Bundling (EFB):通常在真实应用中,虽然特征量比较多,但是由于特征空间十分稀疏,许多特征几乎是互斥的(例如许多特征不会同时为非零值,像one-hot),EFB通过捆绑互斥的特征,并将捆绑问题归约到图着色问题,通过贪心算法求得近似解,以减少特征数量。

  3) 对于树的分裂方法,它通过leaf-wise分裂产生比level-wise分裂更复杂的树,能够实现更高的准确率。虽然这样有时候会导致过拟合,但可以通过设置 max-depth 参数来防止过拟合的发生。(每一次的生长都是选取分裂增益最高的节点,而不是对一层中的所有节点都进行分裂)。

  4) 它使用基于直方图的算法,将连续的特征值分桶(buckets)装进离散的箱子(bins),并通过直方图做差加速计算兄弟节点的直方图,能够加速训练过程,并实现更少的内存占用。

  5) 它支持并行学习,包括特征并行和数据并行
  * 特征并行的主要思想是不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。(mapreduce思想)      
  * 数据并行则是让不同的机器先在不同的记录集合上构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。    

  6) 它还支持直接输入类别特征,在对离散类别特征分裂时,每个取值都当作一个桶,分裂时的增益算的是”是否属于某个类别“的增益,对于类别特征的操作类似于one-hot编码。

二. Bagging 算法简介

bagging算法中,个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成。
bagging的个体弱学习器的训练集是通过随机采样得到的。通过T次的有放回的随机采样,我们就可以得到T个采样集,对于这T个采样集,我们可以分别独立的训练出T个弱学习器,再对这T个弱学习器通过集合策略来得到最终的强学习器。

1. RandomForest

(1) 算法简介

随机森林算法是集成算法中德bagging算法,背后的思想是群体智慧的体现,它通过随机的行采样(bagging)和列采样(feature bagging)构造不同的训练集,建立一个决策树森林,利用加权平均方式或多数表决的方式得到最后的预测结果,使得整体模型的结果具有较高的精确度和泛化性能。它能够并行学习,对噪声和异常数据具有很好的过滤作用,因此有很广泛的应用。

(2) 算法步骤

输入为样本集D={(x,y1),(x2,y2),...(xm,ym)},弱分类器迭代次数T。
输出为最终的强分类器f(x)
1.对于t=1,2...,T:
1)对训练集进行第t次随机采样,共采集m次,得到包含m个样本的采样集Dt
2)用采样集Dt训练第t个决策树模型Gt(x),在训练决策树模型的节点的时候,在节点上所有的样本特征中选择一部分样本特征, 在这些随机选择的部分样本特征中选择一个最优的特征来做决策树的左右子树划分.

2.如果是分类算法预测,则T个弱学习器投出最多票数的类别或者类别之一为最终类别。如果是回归算法,T个弱学习器得到的回归结果进行算术平均得到的值为最终的模型输出。

(3) 算法的优缺点

RF的主要优点有:

1) 训练可以高度并行化,对于大数据时代的大样本训练速度有优势。个人觉得这是的最主要的优点。    

2) 由于采用随机采样,可以防止模型过拟合。训练出的模型的方差小,泛化能力强。   

3) 由于可以随机选择决策树节点划分的特征,这样在样本特征维度很高的时候,不用降维,无需做特征选择,仍然能高效的训练模型。

4) 相对于Boosting系列的Adaboost和GBDT, RF实现比较简单。

5) 对部分特征缺失不敏感。

6) 在训练后,可以给出各个特征对于输出的重要性,模型有可解释性

RF的主要缺点有:

1)在某些噪音比较大的样本集上,RF模型容易陷入过拟合。

2)取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。

参考链接

集成学习之Adaboost算法原理小结
GBDT算法原理以及实例理解
AdaBoost、GBDT、RF、XGboost、LightGBM的对比分析

posted @ 2020-12-25 11:29  亚北薯条  阅读(940)  评论(0编辑  收藏  举报