(二):GBDT算法梳理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(二):GBDT算法梳理相关的知识,希望对你有一定的参考价值。

参考技术A

GBDT(Gradient Boosting Decision Tree)是一种采用加法模型(即基函数的线性组合)与前向分步算法并以决策树作为基函数的提升方法。通俗来说就是,该算法由多棵决策树组成,所有树的结论加起来形成最终答案。
GBDT也是集成学习Boosting家族的成员,但是却和传统的Adaboost有很大的不同。回顾下Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。

在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是ft−1(x), 损失函数是L(y,ft−1(x)), 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x),让本轮的损失函数L(y,ft(x)=L(y,ft−1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。

要理解GBDT算法,得先来了解一下什么是前向分步算法。下面一起来瞧瞧。

我们将

作为加法模型,其中b(x;γm)为基函数,γm为基函数的参数,βm为基函数的系数,βm表示着对应的基函数在加法模型f(x)中的重要性。

在给定训练数据和损失函数L(y,f(x))的条件下,学习加法模型成为经验风险极小化 (即损失函数极小化问题) :

前向分步算法求解这一优化问题的思路: 因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步去逼近上述的目标函数式,就可简化优化的复杂度,每一步只需优化如下损失函数:

前向分步算法流程:

因此,前向分布算法将同时求解从m=1到M的所有参数βm, rm的优化问题简化为逐次求解各个βm, rm的优化问题。

提升树利用加法模型与前向分步算法实现学习的优化过程,当损失函数是平方损失和指数损失函数时,每一步优化很简单,但对一般损失函数而言,每一步的优化并不容易。Freidman提出了 梯度提升算法 (gradient boosting),其关键是利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值,拟合一个回归树(用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树)。第t轮的第i个样本的损失函数的负梯度表示为:

. 其中 J 为叶子节点的个数。

针对每一个叶子节点里的样本,我们求出使损失函数最小,也就是拟合叶子节点最好的的输出值Ctj

如下:

这样我们就得到了本轮的决策树拟合函数如下:

从而本轮最终得到的强学习器的表达式如下:

通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无轮是分类问题还是回归问题,我们通过其损失函数的负梯度的拟合,就可以用 GBDT 来解决我们的分类回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。

在GBDT算法中,损失函数的选择十分重要。针对不同的问题,损失函数有不同的选择。

1.对于分类算法,其损失函数一般由对数损失函数和指数损失函数两种。

(1)指数损失函数表达式:

(2)对数损失函数可分为二分类和多分类两种。

2.对于回归算法,常用损失函数有如下4种。

(1)平方损失函数

(2)绝对损失函数

对应负梯度误差为:

(3)Huber损失 ,它是均方差和绝对损失的折中产物,对于远离中心的异常点,采用绝对损失误差,而对于靠近中心的点则采用平方损失。这个界限一般用分位数点度量。损失函数如下:

对应的负梯度误差为:

(4)分位数损失。 它对应的是分位数回归的损失函数,表达式为:

其中 θ为分位数,需要我们在回归之前指定。对应的负梯度误差为:

对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。

这里我们再看看GBDT分类算法,GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。
为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法是用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。本文仅讨论用对数似然损失函数的GBDT分类。而对于对数似然损失函数,我们又有二元分类和多元分类的区别。

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

在scikit-learn中,GradientBoostingClassifier为GBDT的分类类, 而GradientBoostingRegressor为GBDT的回归类。两者的参数类型完全相同,当然有些参数比如损失函数loss的可选择项并不相同。这些参数中,类似于Adaboost,我们把重要参数分为两类,第一类是Boosting框架的重要参数,第二类是弱学习器即CART回归树的重要参数。
下面我们就从这两个方面来介绍这些参数的使用。

这次基本上是个CRUD boy,对于这些资料都大部分没有消化完成,还不知道能用在哪个地方。
参考资料:

3、GBDT算法梳理 https://juejin.im/post/5c7b7bf451882530a269a1ba

GBDT算法梳理

1.GBDT(Gradient Boosting Decision Tree)思想

  Boosting :

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

  Gradient boosting

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

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

  

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

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

        模型最终可以描述为:

              技术分享图片

 

2.负梯度拟合

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

技术分享图片

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

技术分享图片

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

技术分享图片

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

3.损失函数

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

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

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

        技术分享图片

 

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

    

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

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

        技术分享图片

 

 

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

        技术分享图片

 

 

      对应负梯度误差为:

        技术分享图片

4.回归分类

技术分享图片

 

 

5.多元分类

技术分享图片

 

        技术分享图片

        对于上式,我曾详细地推导过一次,大家可以看这里-->  深度学习数学推导之Sigmoid,Softmax,Cross-entropy

 

 技术分享图片

 

6.正则化

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

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

                                              技术分享图片

 

      如果我们加上了正则化项,则有技术分享图片

 

     技术分享图片的取值范围为技术分享图片

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

 

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

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

 

7.优缺点

  GBDT主要的优点有:

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

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

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

  GBDT的主要缺点有:

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

8.sklearn参数

sklearn.ensemble.GradientBoostingRegressor(
                loss=ls,      ##默认ls损失函数‘ls‘是指最小二乘回归lad‘(最小绝对偏差)‘huber‘是两者的组合
                n_estimators=100, ##默认100 回归树个数 弱学习器个数
                learning_rate=0.1,  ##默认0.1学习速率/步长0.0-1.0的超参数  每个树学习前一个树的残差的步长
                max_depth=3,   ## 默认值为3每个回归树的深度  控制树的大小 也可用叶节点的数量max leaf nodes控制
                 subsample=1,  ##用于拟合个别基础学习器的样本分数 选择子样本<1.0导致方差的减少和偏差的增加
                min_samples_split=2, ##生成子节点所需的最小样本数 如果是浮点数代表是百分比
                min_samples_leaf=1, ##叶节点所需的最小样本数  如果是浮点数代表是百分比
                max_features=None, ##在寻找最佳分割点要考虑的特征数量auto全选/sqrt开方/log2对数/None全选/int自定义几个/float百分比
                max_leaf_nodes=None, ##叶节点的数量 None不限数量
                min_impurity_split=1e-7, ##停止分裂叶子节点的阈值
                verbose=0,  ##打印输出 大于1打印每棵树的进度和性能
                warm_start=False, ##True在前面基础上增量训练 False默认擦除重新训练 增加树
                random_state=0  ##随机种子-方便重现
)

 

9.应用场景

 GBDT几乎可用于所有回归问题(线性/非线性),相对logistic regression仅能用于线性回归,GBDT的适用面非常广。亦可用于二分类问题(设定阈值,大于阈值为正例,反之为负例)。

 

 

 

https://www.jianshu.com/p/d55f7aaac4a7

https://www.cnblogs.com/peizhe123/p/5086128.html

http://www.cnblogs.com/duan-decode/p/9889955.html

http://www.cnblogs.com/sandy-t/p/6863918.html

 

https://blog.csdn.net/qq_20412595/article/details/82589378 

 




以上是关于(二):GBDT算法梳理的主要内容,如果未能解决你的问题,请参考以下文章

GBDT算法梳理

XGB算法梳理

足矣

足矣

足矣

浅析GBDT+LR