详解提升树模型(boosting tree)和梯度提升树模型(GBDT)

1、集成方法之Boosting

Boosting方法是集成学习中重要的一种方法,在集成学习方法中最主要的两种方法为Bagging和Boosting,在Bagging中,通过对训练样本重新采样的方法得到不同的训练样本集,在这些新的训练样本集上分别训练学习器,最终合并每一个学习器的结果,作为最终的学习结果,Bagging方法的具体过程如下图所示:

这里写图片描述

在Bagging方法中,最重要的算法为随机森林Random Forest算法。由以上的图中可以看出,在Bagging方法中,bb个学习器之间彼此是相互独立的,这样的特点使得Bagging方法更容易并行。与Bagging方法不同,在Boosting算法中,学习器之间是存在先后顺序的,同时,每一个样本是有权重的,初始时,每一个样本的权重是相等的。首先,第11个学习器对训练样本进行学习,当学习完成后,增大错误样本的权重,同时减小正确样本的权重,再利用第22个学习器对其进行学习,依次进行下去,最终得到bb个学习器,最终,合并这bb个学习器的结果,同时,与Bagging中不同的是,每一个学习器的权重也是不一样的。Boosting方法的具体过程如下图所示:

这里写图片描述

在Boosting方法中,最重要的方法包括:AdaBoostGBDT

2、Boosting Tree(提升树)

算法如下:

  提升树模型采用加法模型(基函数的线性组合)与前向分步算法,同时基函数采用决策树算法,对待分类问题采用二叉分类树,对于回归问题采用二叉回归树。提升树模型可以看作是决策树的加法模型:

  

  其中T()表示决策树,M为树的个数, Θ表示决策树的参数;

  提升树算法采用前向分部算法。首先确定f0(x) = 0,第m步的模型是:

  

  对决策树的参数Θ的确定采用经验风险最小化来确定:

  

  对于不同的问题采用的损失函数不同,在决策树中使用的就是0/1损失函数,这部分的推导和前面的adaBoost中的关于分类的推导相同,不做详细介绍。对与回归问题来说,一般采用平方误差函数。

  对于回归问题,关于回归树的生成可以参考CART算法中回归树的生成。对于以下问题:

  输入:

  输出:fM(x)

  对于一颗回归树可以表示为:

  

  那么在前向分步算法的第m步中也就是求解第m个回归树模型时,为了确定参数需要求解:

  

  当采用平方误差损失函数时,损失函数为:

  

  将上面的待求解式子带入到下面的平方误差函数中可以得到以下表达式:

  

  这就表明每一次进行回归树生成时采用的训练数据都是上次预测结果与训练数据值之间的残差。这个残差会逐渐的减小。

  算法流程:

  (1)、初始化f0(x) = 0;

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

   (a)按照 r= yi - fm-1(x)计算残差作为新的训练数据的 y

   (b) 拟合残差 r 学习一颗回归树,得到这一轮的回归树

   (c) 更新 

  (3) 得到回归提升树:

    

3、GBDT梯度提升树

  对于梯度提升树其学习流程与提升树类似只是不再使用残差作为新的训练数据而是使用损失函数的梯度作为新的新的训练数据的y值,具体的来说就是使用损失函数对f(x)求梯度然后带入fm-1(x)计算:

  

 GDBT与提升树之间的关系:

 提升树模型每一次的提升都是靠上次的预测结果与训练数据的label值差值作为新的训练数据进行重新训练,GDBT则是将残差计算替换成了损失函数的梯度方向,将上一次的预测结果带入梯度中求出本轮的训练数据,这两种模型就是在生成新的训练数据时采用了不同的方法,那么在这个背后有啥区别?使用残差有啥不好?

  李航老师《统计学习方法》中提到了在使用平方误差损失函数和指数损失函数时,提升树的残差求解比较简单,但是在使用一般的损失误差函数时,残差求解起来不是那么容易,所以就是用损失函数的负梯度在当前模型的值作为回归问题中残差的近似值。 这是不是说一般的损失函数的梯度也得好求才可以啊。

Reference

[1]https://blog.csdn.net/google19890102/article/details/51746402/

[2]https://www.cnblogs.com/daguankele/p/6557328.html

[3]https://www.jianshu.com/p/0e5ccc88d2cb

展开阅读全文

没有更多推荐了,返回首页