个人总结:从 AdaBoost 到 GBDT 梯度提升树

谈过了AdaBoost,就不由得要谈到提升树,谈到提升树,就不得不提到梯度提升树。

提升树(boosting tree)。对于二类分类的算法,决策树内部为CART分类树,此时就为AdaBoost基学习器为CART分类树的特殊情况;对于回归问题,提升树内部决策树是二叉回归树,在每次迭代中通过拟合当前模型的残差生成一个新的回归树,并与之前的弱学习器结合生成新的强学习器,若最后生成的强学习器满足误差要求,则为所求的提升树。(与AdaBoost回归的区别在AdaBoost每次迭代通过分类误差率更新样本的权重,并计算alpha值,最终取中位数的alpha对应的弱学习器为强学习器,内部细节请看:AdaBoost

梯度提升树,GBDT,Gradient Boost Decision Tree;或者GBT(Gradient Boosting Tree),GBRT(Gradient Boosting Reggression Tree), MART(Multiple Additive Reggression Tree),其实都是指的同一种算法。后面简称GBDT。梯度提升树与提升树的区别在于,提升树采用残差,而梯度提升树采取拟合当前模型损失函数的负梯度(在损失函数为均方误差的时候,相当于就是残差,其它误差函数不一定就是残差),来生成一个新的CART回归树。并且在GBDT中,只能使用CART回归树,所以在在GBDT中,结果是累加所有树的结果(不管是回归还是分类问题)

在GBDT的迭代中,假设前一轮得到的强学习器是,损失函数是,本轮迭代的目标是找到一个CART回归树模型的弱学习器,让本轮的损失最小,这里和提升树的思路是一致的;而AdaBoost,则是在每次迭代中找到每个样本的相对误差,最后找到弱学习器的权重系数。

为什么有了提升树还需要梯度提升树

提升树利用加法模型与前向分布算法实现学习的优化过程,当损失函数是平方损失或指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,往往每一步优化并不容易,针对这一问题Friedman在2000年提出了梯度提升方法,该方法是最速下降法的近似方法,利用损失函数的负梯度作为回归树提升问题中残差的近似值,拟合一个回归树。

GBDT的负梯度拟合

第t轮第i个样本的损失函数负梯度表示为

,对应第i个样本x_i。

使用(xi, r_ti)可以拟合出一棵CART回归树,与CART回归树找最佳切分点同理(CART回顾),,只不过此时的y_i被换为了r_ti。对左右节点依次递归,最后得到决策树,其对应的叶子节点区域R_tj,j = 1, 2, ...J,J为叶子节点个数。这就是第t棵回归树。

针对每个叶子节点里的样本,我们求使损失函数最小,也就是拟合叶子节点的输出值c_tj,可以理解为CART回归树通过拟合残差产生叶子节点的过程:

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

最终的强学习器的表达式:

每一棵树都在学习残差,所以最后的输出是将各个树学习的残差相加,来贴近原始真实值。

GBDT的回归

(1)初始化弱学习器

(2)for循环,对迭代次数t = 1, 2, ..T

  1.  对样本i = 1, 2, ... m,计算负梯度
  2. 利用(x_i, r_ti)可以拟合回归树,得到第t棵回归树,其对应的叶子节点区域为R_tj, j=1,2,...,J,  J为叶子节点个数。
  3. 对每个叶子节点区域,计算最佳拟合值(线性搜索),这里是和前面t-1棵树加上当前决策树,损失减少最多。
  4. 更新强学习器

(3)  得到最终的强学习器

              

从这里就可以看出,GBDT本质上通过累加“残差”(打引号的原因是因为GBDT用负梯度近似了提升树的残差)来达到最后生成强学习器的目的。里面每一棵回归树和决策树很相似,只是回归树把落入叶子节点的样本,对于他们的标签求了个

GBDT的分类

由于分类是离散值,所以不能直接用输出类别去拟合类别输出的误差。

解决这个问题主要有两种方法,一种是指数损失函数,此时GBDT退化为AdaBoost算法:AdaBoost分类问题的损失函数优化;另外一种是类似于逻辑回归的对数似然损失函数,用的是类别的预测概率值和真实概率值的差来拟合损失。

GBDT二分类

使用对数损失函数:

这个地方的对数损失函数为什么这么写是因为:

P(Y=y|x) = \left\{\begin{matrix} h_{\theta}(x) = g(f(x)) = \frac{1}{1+exp\left \{ -f(x) \right \}},\; \; \; \; y =1\\ 1-h_{\theta}(x) = 1-g(f(x))= \frac{1}{1+exp\left \{ f(x) \right \}},\; \; \; \; y =-1 \end{matrix}\right.

再加上log并将分子提出去就得到了上述形式。在y=0,1时,对数损失(或者说logistic loss)有不同的写法,类似逻辑回归中使用的形式。至于为什么会产生两种形式,可以看文章:Which loss function is correct for logistic regression?

其中f(x) = log\left [ \frac{P(y=1|x)}{P(y=-1|x)} \right ],这里可以看出GBDT实际上输出的是一个对数几率,对数几率再通过sigmoid得到概率,每次的更新实际上是对概率的残差进行拟合。

(1)初始化弱学习器

,其中y属于{-1,1}。

(2)for循环,对迭代次数t = 1, 2, ..T

  1.  对样本i = 1, 2, ... m,计算负梯度,这里只能视作概率伪残差。
  2. 利用(x_i, r_ti)可以拟合回归树,得到第t棵回归树,其对应的叶子节点区域为R_tj, j=1,2,...,J,  J为叶子节点个数。
  3. 对每个叶子节点区域,计算最佳拟合值,这里是和前面t-1棵树加上当前决策树,损失减少最多。
  4. 由于上式较难优化,采用Newton-Raphson公式进行近似求解,结果为
  5. 更新强学习器

(3)  得到最终的强学习器

              

(4)最终输出得到对数几率,再通过sigmoid函数就可以得到概率。然后可以设置阈值,大于阈值输出为正,否则输出为负。

二分类和回归非常相似,仅仅在拟合回归树时有些许差别。

GBDT多分类

多分类GBDT和二分类GBDT的差别在于多元逻辑回归和二元逻辑回归的复杂度差别。假设类别数为K,此时对数似然损失函数:

。其中如果输出类别为k,则y_k为1,否则为0。

使用softmax公式来计算第k类概率p_k(x)的表达式

,可以看出,对于多分类需要对每个类别创建一棵回归树f_l(x), l = 1,2..K,f_k(x)可能输出1或者0,如果该判断第k类的决策树认为输入x,应该生成第k类,则f_k(x) = 1,否则为0。

同样在此处开始一个for循环,迭代次数为t = 1, 2, ...T:

通过将上述两式进行合并,再求负梯度

,l = 1,2...K, 这里可以看出就是通过类别的预测概率和真实概率值的差来拟合损失。

通过对上述“残差”进行拟合,得到K棵决策树(分别预测K个类别),各个叶子节点对应的最佳负梯度拟合值为

,其中l = 1, 2,... K

同样使用Newton-Raphson公式来近似,结果为

最后将其加起来得到最终的强学习器,此处与二分类的差别在于多了一个类别变量。在最后对每个分类器的输出进行一个softmax计算,即可得出最后的类别概率。

GBDT常用损失函数

对于分类,有(1)指数损失函数 和(2)对数损失函数,如果是指数损失函数,则退化为AdaBoost分类问题的损失函数优化;如果是对数损失函数,则有刚刚提到的二分类与多分类。

对于回归,常见的损失有四种:

(a)均方差损失,最常见:,此时的负梯度就相当于残差的两倍(当然在前面加一个1/2就是残差)。均方差损失对于异常值的鲁棒性较差,会影响到后面模型的表现,所以有了后面的Huber和Quantile。

(b)绝对损失:,对应负梯度误差,相对于均方差损失涉及到二次幂,此时对异常值的鲁棒性已经增强了很多。

(c)Huber损失:均方差与绝对损失的折中,对于远离中心的异常点(偏差大),采用绝对损失;而中心附近的点(偏差小,检验方差),采用均方差。损失函数:

对应的负梯度误差为:

(d)分位数损失,对应的是分位数回归的损失函数,表达式为

其中θ为分位数,需在回归前指定,对应负梯度误差为:

GBDT的正则化

主要有三种:

第一种是和AdaBoost类似的步长(learning rate)。定义为v,取值范围为0-1,对于前面的弱学习器的更新

      ————》

这种方式也叫作Shrinkage,认为每次走一小步来逼近结果的效果,比每次迈一大步更快逼近的方式更容易防止过拟合。

通常用步长和迭代最大次数一起来决定算法的拟合效果。

第二种方式是通过子采样比例(subsample),取值为(0, 1]。这里和随机森林的bootstrap不同,bootstrap为有放回采样,这里的有放回采样指的是,先抽一个,再放回去,所以极端情况是抽出来的所有样本都一样;而这里为不放回采样,可以保证样本的不重复性。选择小于1的比例可以降低方差,但是会增加偏差,因此推荐在0.5-0.8之间。使用了子采样的GBDT称为随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。

第三种方式为对弱学习器即CART回归树进行剪枝。CART的剪枝

GBDT小结

主要优点:

1、各种类型的问题(分类,回归),各种类别的数据(离散,连续)都可以处理

2、相对于SVM在相对少的调参时间下,预测的准确率较高。

3、Huber和Quantile等损失函数对异常值的鲁棒性很强。

主要缺点:

1、难以进行并行操作,这是由于boosting框架下的算法上下两棵树有联系导致。不过自采样的SGBT可以达到部分并行。

GBDT细节理解

  • GBDT的损失函数是全局的多棵决策树一起决定的,而节点分裂的准则值只针对当前这棵决策树,使其损失最小,所以是整体损失函数和局部损失函数的区别;“平方误差最小”只针对单棵CART回归树,但是GBDT的损失函数不需要和CART相同
  • 梯度提升树使用多棵决策树,渐进地去拟合,表达能力强,这样很多复杂的,难以用多项式模型表达的模型问题都可以拟合出来,也就是算法的上限比较高。
  • 在分类问题中,需将类别输出先转化为概率连续值;对于离散特征,需先进行数值化。可通过one-hot等方法。
  • 当使用指数损失函数做分类问题时,GBDT退化为AdaBoost,但是此时也可以进行多分类,此时要改为
  • 单独的CART树不需要做归一化,但是GBDT每一步需要利用负梯度进行拟合,如果不标准化可能前后每次迭代的拟合负梯度值的参数很不稳定(方差大),因此导致最后boost在一起的结果不好,因此一般来说GBDT还是要标准化的。
  • AdaBoost v.s. GBDT:最主要的区别在于两者如何识别模型的问题。AdaBoost用错分数据点来识别问题,调整错分数据点的权重来改进模型。Gradient Boosting通过负梯度来识别问题,通过计算负梯度来改进模型。
  • GBDT v.s. LR :从决策边界来说,线性回归的决策边界是一条直线,而逻辑回归根据是否使用核函数可以是一条直线或者曲线,而GBDT的决策边界可能是很多条线。
  • 为什么GBDT不能用分类树?因为GBDT始终围绕“残差”这个概念来进行,若是分类树的话,输出为类别,相减没有意义。
  • 针对GBDT多分类进行训练时,是对每个可能的类别(K>=3)都要训练一棵分类回归树,如果样本x属于第二类,则可以用一个[0, 1, 0]的向量来表示。0表示样本属于该类,1表示样本不属于该类。所以实际上每轮都是同时训练三棵树。将(x,0),(x, 1), (x, 0)分别输入三棵树分别得到f1(x),f2(x),f3(x),分别于真实标签[0, 1, 0]进行相减得到残差y11,y22,y33,又可训练出三棵树。下一轮分别将(x,y11)(x,y22) (x, y33)输入三棵树,又可以得到新的残差。最后生成强学习器,然后用softmax公式预测最终的概率。
  • GBDT能否构建特征?这种说法并不是很准确,但是可以利用GBDT去产生特征的组合,通过算法自动高效地去寻找到有效的特征组合。Facebook在2014年发表的一篇论文就是这种尝试下的产物,利用gbdt去产生有效的特征组合,以便于逻辑回归的训练,提升模型最终的效果。比如用GBDT生成了两棵树,第一棵有三个叶子节点,第二棵有两个叶子节点,将样本x输入第一棵树落到了第二个叶子节点,输入到第二棵树落到了第一个叶子节点,则可以生成一个五维的特征向量[0,1,0,1,0]。将其与原来的特征一起输入到逻辑回归当中进行训练。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值