bagging、boosting总结

https://zhuanlan.zhihu.com/p/32877396

方差、偏差与bagging、boosting的关系

偏差指的是算法的期望预测与真实值之间的偏差程度,反映了模型本身的拟合能力;

方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。

当模型越复杂时,拟合能力就越好,模型的偏差就越小。但此时如果换一组数据可能模型的变化就会很大,即模型的方差变大。

对于bagging算法来说,由于我们并行的训练很多的分类器的目的就是降低这个方差,因为采用了相互独立的弱分类器的数量多了,最终得到的值就会越中和。所以在构建每个弱学习器的时候就应该想办法使每个弱分类的偏差比较小,所以一般会采用深度很深并且不剪枝的决策树。

对于boosting来说,每一步我们都会在上一轮的基础上更加的接近标签值,所以可以保证偏差比较小。 因此我们在构建每个弱分类器的时候,需要选择方差更小的弱学习器,即更简单的弱学习器,所以我们选择深度很浅的决策树。

 

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

随机森林是bagging的一个特化进阶版,所谓的特化是因为随机森林的弱学习器都是决策树。所谓的进阶是随机森林在bagging的样本随机采样基础上,又加上了特征的随机选择,其基本思想没有脱离bagging的范畴。tip:一般的bagging算法是从总样本中随机抽取k个样本,一共抽取n次。这样就会有n个数据集。每个数据集使用一个弱学习器进行训练。随机森林在抽取样本时,不只是样本是随机的,样本所使用的特征也是随机选择的。

 

Bagging:

Bagging即套袋法,其算法过程如下:

  1. 从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)

  2. 每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)

  3. 对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

Boosting:

      AdaBoosting方式每次使用的是全部的样本,每轮训练改变样本的权重。下一轮训练的目标是找到一个函数f 来拟合上一轮的残差。当残差足够小或者达到设置的最大迭代次数则停止。Boosting会减小在上一轮训练正确的样本的权重,增大错误样本的权重。(对的残差小,错的残差大)

      梯度提升的Boosting方式是使用代价函数对上一轮训练出的模型函数f的偏导来拟合残差。

 

                                                      Adaboost

Adaboost就是它在训练弱分类器之前,会给每个样本一个权重,训练完一个分类器,增加分错样本的权重,减少分对样本的权重。权值更新过的样本被用于下一个分类器。当所有分类器训练完知后,加大分类错误率小的弱分类器,减小分类错误率大的弱分类器。

 

GBDT训练弱分类器关注的是残差,也就是上一个弱分类器的表现与完美答案之间的差距,GBDT每一次训练分类器,都是为了减少这个差距

 

                                                      XGBOOST

xgboost是通过不断添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数f(x),去拟合上次预测的残差。(每一次迭代,都在现有树的基础上,增加一棵树去拟合前面树的预测结果与真实值之间的残差)

 

                                                                 GBDT

GBDT是梯度提升决策树(Grandient Boost Decision Tree)的简称。GBDT分类和回归时的基学习器都是CART回归树,因为是拟合残差的。GBDT和Adaboost一样可以用前向分布算法来描述,不同之处在于Adaboost算法每次拟合基学习器时,输入的样本数据是不一样的(每一轮迭代时的样本权重不一致),因为Adaboost旨在重点关注上一轮分类错误的样本,GBDT算法在每一步迭代时是输出的值不一样,本轮要拟合的输出值是之前的加法模型的预测值和真实值的差值(模型的残差,也称为损失)。

 

   XGBoost和GBDT的区别

   1)将树模型的复杂度加入到正则项中,来避免过拟合,因此泛化性能会优于GBDT。

   2)传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。

  3)GBDT只支持CART作为基分类器,xgboost除了以CART作为基学习器之外,还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。

  4)列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。

  5)在寻找最佳分割点时,考虑到传统的贪心算法效率较低,实现了一种近似贪心算法,用来加速和减小内存消耗,除此之外还考虑了稀疏数据集和缺失值的处理,对于特征的值有缺失的样本,XGBoost依然能自动找到其要分裂的方向。

  6)XGBoost支持并行处理,XGBoost的并行不是在模型上的并行,而是在特征上的并行,将特征列排序后以block的形式存储在内存中,在后面的迭代中重复使用这个结构。这个block也使得并行化成为了可能,其次在进行节点分裂时,计算每个特征的增益,最终选择增益最大的那个特征去做分割,那么各个特征的增益计算就可以开多线程进行。(xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行)

     7)如果不考虑工程实现、解决问题上的一些差异,xgboost与gbdt比较大的不同就是目标函数的定义,但这俩在策略上是类似的,都是聚焦残差(更准确的说, xgboost其实是gbdt算法在工程上的一种实现方式)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值