GBDT

 

GBDT 的全称是 Gradient Boosting Decision Tree,梯度提升树,是GB(梯度提升)+DT(决策树),在传统机器学习算法中,GBDT算的上TOP3的算法。想要理解GBDT的真正意义,那就必须理解GBDT中的Gradient Boosting 和Decision Tree分别是什么?

目录

1. Decision Tree:CART回归树

2. Gradient Boosting: 拟合负梯度

3.GBDT(Gradient Boosting Decision Tree)思想

Boosting :

Gradient boosting

1.GBDT

2.负梯度拟合

3.损失函数

4.正则化

4.优缺点

5.GBDT和XGBoost区别


1. Decision Tree:CART回归树

  首先,GBDT使用的决策树是CART回归树,无论是处理回归问题还是二分类以及多分类,GBDT使用的决策树通通都是都是CART回归树。为什么不用CART分类树呢?因为GBDT每次迭代要拟合的是梯度值,是连续值所以要用回归树。
  对于回归树算法来说最重要的是寻找最佳的划分点,那么回归树中的可划分点包含了所有特征的所有可取的值。在分类树中最佳划分点的判别标准是熵或者基尼系数,都是用纯度来衡量的,但是在回归树中的样本标签是连续数值,所以再使用熵之类的指标不再合适,取而代之的是平方误差,它能很好的评判拟合程度。


回归树生成算法:
输入:训练数据集D:
输出:回归树f(x).
在训练数据集所在的输入空间中,递归的将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
(1)选择最优切分变量j与切分点s,求解

                                           GBDT_第1张图片

遍历变量j,对固定的切分变量j扫描切分点s,选择使得上式达到最小值的对(j,s).
(2)用选定的对(j,s)划分区域并决定相应的输出值:

                                                  GBDT_第2张图片

(3)继续对两个子区域调用步骤(1)和(2),直至满足停止条件。
(4)将输入空间划分为M个区域 R1,R2,...RM​,生成决策树:

                                                                    GBDT_第3张图片


2. Gradient Boosting: 拟合负梯度

  梯度提升树(Grandient Boosting)是提升树(Boosting Tree)的一种改进算法,所以在讲梯度提升树之前先来说一下提升树。


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


提升树算法:
(1)初始化f0(x)=0
(2)对m=1,2,...,M

(a) 计算残差

                                                  

(b) 拟合残差r_{mi}学习一个回归树,得到h_{(mx))}

(c) 更新
(3)得到回归问题提升树   

                                                                  GBDT_第4张图片


上面伪代码中的残差是什么?
在提升树算法中,假设我们前一轮迭代得到的强学习器是

                                                                                    

损失函数是

                                                                                 

我们本轮迭代的目标是找到一个弱学习器

                                                                                       

最小化让本轮的损失

                                                                 

当采用平方损失函数时

                                                                            GBDT_第5张图片

这里,

                                                                            

是当前模型拟合数据的残差(residual)所以,对于提升树来说只需要简单地拟合当前模型的残差。
  回到我们上面讲的那个通俗易懂的例子中,第一次迭代的残差是10岁,第二 次残差4岁……


  当损失函数是平方损失和指数损失函数时,梯度提升树每一步优化是很简单的,但是对于一般损失函数而言,往往每一步优化起来不那么容易,针对这一问题,Friedman提出了梯度提升树算法,这是利用最速下降的近似方法,其关键是利用损失函数的负梯度作为提升树算法中的残差的近似值。
那么负梯度长什么样呢?
第t轮的第i个样本的损失函数的负梯度为:

                                                               GBDT_第6张图片

此时不同的损失函数将会得到不同的负梯度,如果选择平方损失

                                                                   

负梯度为

                                                       GBDT_第7张图片

此时我们发现GBDT的负梯度就是残差,所以说对于回归问题,我们要拟合的就是残差。
那么对于分类问题呢?二分类和多分类的损失函数都是loglosslog losslogloss,本文以回归问题为例进行讲解


3.GBDT(Gradient Boosting Decision Tree)思想

Boosting :

  给定初始训练数据,由此训练出第一个基学习器;
  根据基学习器的表现对样本进行调整,在之前学习器做错的样本上投入更多关注;
  用调整后的样本,训练下一个基学习器;
  重复上述过程 T 次,将 T 个学习器加权结合。

Gradient boosting

    Gradient boosting是 boosting 的其中一种方法,它主要的思想是,每一次建立单个学习器时,是在之前建立的模型的损失函数的梯度下降方向。

    我们知道损失函数(loss function)越大,说明模型越容易出错,如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降。

1.GBDT

    GBDT是 GB 和 DT(Decision Tree) 的结合,就是当 GB 中的单个学习器为决策树时的情况.决策树分为两大类,回归树和分类树。前者用于预测实数值,如明天的温度、用户的年龄、网页的相关程度;后者用于分类标签值,如晴天/阴天/雾/雨、用户性别、网页是否是垃圾页面。这里要强调的是,前者的结果加减是有意义的,如10岁+5岁-3岁=12岁,后者则无意义,如男+男+女=到底是男是女?GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量

  比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;
  如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。

    而分类树的结果显然是没办法累加的,所以GBDT中的树都是回归树,这点对理解GBDT相当重要

    我们通过一张图片,来说明gbdt的训练过程: 

 

GBDT_第8张图片

gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度,(此处是可以证明的)。

        弱分类器一般会选择为CART TREE(也就是分类回归树)。由于上述高偏差和简单的要求 每个分类回归树的深度不会很深。最终的总分类器 是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)。

        模型最终可以描述为:

              

2.负梯度拟合

我们希望找到一个 使得 最小,那么 就得沿着使损失函数L减小的方向变化,即:

GBDT_第9张图片

同时,最新的学习器是由当前学习器 与本次要产生的回归树 相加得到的:

因此,为了让损失函数减小,需要令:

GBDT_第10张图片

即用损失函数对f(x)的负梯度来拟合回归树。

3.损失函数

这里我们再对常用的GBDT损失函数做一个总结。

    对于分类算法,其损失函数一般有对数损失函数和指数损失函数两种:

    a) 如果是指数损失函数,则损失函数表达式为

        

    b) 如果是对数损失函数,分为二元分类和多元分类两种,参见4节和5节。

    对于回归算法,常用损失函数有如下3种:

    a)均方差,这个是最常见的回归损失函数了

        

    b)绝对损失,这个损失函数也很常见

        

      对应负梯度误差为:

        

4.正则化

  我们需要对GBDT进行正则化,防止过拟合。GBDT的正则化主要有三种方式。

    1) 第一种是步长(learning rate)。定义为,对于前面的弱学习器的迭代

                                              

                 如果我们加上了正则化项,则有

     的取值范围为

     对于同样的训练集学习效果,较小的意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。

       2)第二种是对于弱学习器即CART回归树进行正则化剪枝。

       3) 第三种正则化的方式是通过子采样比例(subsample)。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。

4.优缺点

  GBDT主要的优点有:

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

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

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

  GBDT的主要缺点有:

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

  上面两节分别将Decision Tree和Gradient Boosting介绍完了,下面将这两部分组合在一起就是我们的GBDT了。

5.GBDT和XGBoost区别

  1. GBDT是机器学习算法,XGBoost是该算法的工程实现
  2. 使用CART作为基分类器时,XGBoost显式的加入正则项来控制模型的复杂度,有利于防止过拟合,从而提高模型的泛化能力
  3. GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,同时使用一阶和二阶导数
  4. 传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器
  5. 传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机森林相似的策略,支持对数据进行采样
  6. 传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺失值得处理策略

你可能感兴趣的:(机器学习)