GBDT

4/14/2021 GBDT

# 请简述一下GBDT的原理

GBDT是论文《greedy function appoximation: a gradient boosting machine》中提出的一个梯度下降提升树框架,并不是一种特定的算法,而是泛指所有的梯度提升树算法,比如Xgboost和LightGBM等。

提升方法采用的是加法模型和前向分步算法来解决分类和回归问题,而以决策树作为基函数的提升方法称为提升树(boosting tree)。GBDT(Gradient Boosting Decision Tree)就是提升树算法的一种,它使用的基学习器是CART(分类和回归树),且是CART中的回归树。

它是一种迭代的决策树算法,通过多轮迭代,每轮学习都在上一轮训练的残差(用损失函数的负梯度来替代)基础上进行训练。在回归问题中,每轮迭代产生一棵CART回归树,迭代结束时将得到多棵CART回归树,然后把所有的树加总起来就得到了最终的提升树。

# 为什么回归树可以作为GBDT的迭代学习器?

GBDT中的树都是CART回归树,不是分类树,因为GBDT的核心在于累加所有树的结果作为最终结果,而只有回归树的结果可以累加,分类树的结果进行累加是没有意义的。尽管GBDT调整后也可以用于分类,但这不代表GBDT中用到的决策树是分类树。

由于GBDT的学习过程是通过多轮迭代,每次都在上一轮训练结果的残差的基础上进行学习,于是要求基学习器要足够简单,具有高偏差、低方差的特点。GBDT的基学习器是CART回归树,由于高偏差和简单的要求,每棵CART回归树的深度不会很深。

训练的过程就是通过降低偏差来不断提高最终的提升树进行分类和回归的精度,使整体趋近于低偏差、低方差。最终的提升树就是将每轮训练得到的CART回归树加总求和得到(也就是加法模型)。

# GBDT是如何用于分类问题的?

GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本的输出不是连续的值,而是离散的类别,一般用{-1, 0, 1, ...}这样的整数表示,导致我们无法直接用样本的输出去计算残差。

借鉴逻辑回归输出类别的预测概率分布的做法,在GBDT分类算法中,采用对数似然损失函数来计算残差,并用对数似然损失函数的负梯度作为残差的近似替代,然后用决策树去拟合残差。

对于二元分类GBDT分类算法,损失函数为L

其中。则此时的负梯度误差为

对于生成的决策树,我们各个叶子节点的最佳负梯度拟合值为

由于上式比较难优化,我们一般用已经算出来的负梯度和牛顿-拉弗森迭代法(Newton–Raphson )来近似求解:

除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同。

# 为什么GBDT将CART回归树树分成m棵二叉树(每棵树只有两个叶子节点),而不是求一棵m+1层的二叉树(最多有2m个叶子节点)?

在决策树的剪枝算法中,只要允许一棵树对的叶子节点足够多,那么训练数据集总是能训练到100%的准确率,但是模型的复杂度非常高,在测试数据上表现比较差。而GBDT把一棵树拆成m棵树,限制每棵树只有两个叶子节点,就可以解决拟合问题。GBDT要求基学习器具有足够简单、高偏差和低方差的特点,因此每棵CART回归树对的深度不会很深。

# GBDT是如何进行正则化的?

GBDT的正则化主要有三种方式。

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

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

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

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

使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。

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

# gbdt的残差为什么用负梯度代替?

GBDT并不是用负梯度代替残差,它建树时本身拟合的是负梯度!

  • 学习负梯度才能保证符合Boosting的基本要求

Freidman通过对loss泰勒一阶展开发现了真正的奥秘是应该学习负梯度才能保证符合Boosting的基本要求。即利用损失函数的负梯度作为在当前模型的值作为残差的近似值,这样就能保证每次迭代过程损失函数不断减小,所以第m颗基树拟合负梯度就能解决问题。

GBDT本身就是使用负梯度进行boost,残差反而是一种特例。更具体的说,损失函数为平方损失函数时梯度值恰好是残差。不过这是一个特例,其它的损失函数就不会有这样的性质。使用残差这个说法解释GBDT更容易理解,毕竟符合人的认知,也就是更具象化。

  • 负梯度可以扩展到更复杂的损失函数

提升树用加法模型与前向分布算法实现学习的优化过程。当损失函数为平方损失和指数损失函数时,每一步优化是很简单的。但对于一般损失函数而言,往往每一步都不那么容易。对于这问题,Freidman提出了梯度提升算法。这是利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值。

负梯度来替代残差是对损失函数的普及化。真正的目的是使损失函数快速减小。由于模型本身是加性模型,将当前迭代(第m次)损失函数在前一代(m-1次)损失处进行泰勒一介展开。

https://www.zhihu.com/question/63560633

# GBDT的优势有哪些?

  • 特征组合和发现重要特征

1、特征组合

原始特征经过GBDT转变成高维稀疏特征(GBDT的输出相当于对原始特征进行了特征组合,得到高阶特征或者说是非线性映射),然后将这些新特征作为FM(Factorization Machine)或LR(逻辑回归)的输入再次进行拟合。

2、发现重要特征

由于决策树的生长过程就是不断地选择特征、分割特征,因此由大量决策树组成的GBDT具有先天的优势,可以很容易得到特征的重要度排序,且解释性很强。

  • 泛化能力强

泛化误差可以分解为两部分,偏差(bias)和方差(variance)。

1、为了保证低偏差bias,采用了Boosting,每一步我们都会在上一轮的基础上更加拟合原数据,可以保证低偏差; 2、为了保证低方差,采用了简单的模型,如深度很浅的决策树。

两者结合,就能基于泛化性能相当弱的学习器构建出泛华能力很强的集成模型。

# GBDT中的缩减的作用是什么?

Shrinkage 的思想认为,每走一小步逐渐逼近结果的效果要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它并不是完全信任每一棵残差树。

Shrinkage 不直接用残差修复误差,而是只修复一点点,把大步切成小步。本质上 Shrinkage 为每棵树设置了一个 weight,累加时要乘以这个 weight,当 weight 降低时,基模型数会配合增大。

# 为什么基于残差的GBDT不是一个好的选择?

基于残差的gbdt在解决回归问题上不算是一个好的选择,一个比较明显的缺点就是对异常值过于敏感。来看一个例子:

很明显后续的模型会对第4个值关注过多,这不是一种好的现象,所以一般回归类的损失函数会用绝对损失或者huber损失函数来代替平方损失函数:

# 梯度提升树中为什么说目标函数关于当前模型的负梯度是残差的近似值?

https://www.zhihu.com/question/60625492

# 为什么xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

https://www.zhihu.com/question/45487317

# 为什么在实际的kaggle比赛中,GBDT和Random Forest效果非常好?

https://www.zhihu.com/question/51818176

# GBDT怎么用在点击率预测中?

https://www.zhihu.com/question/29345498/answer/44267881

# GBDT中的梯度怎么计算的?是谁对谁的梯度?

当前损失函数对树的梯度。

# m×n数据集,如果用GBDT,那么梯度是几维?或者是与树的深度有关?或者与树的叶子节点的个数有关?

# 随机森林和GBDT的异同点

  • 相同点:

都是由多棵树组成,最终的结果都是由多棵树一起决定。

  • 不同点:
  1. 集成学习:RF属于bagging思想,而GBDT是boosting思想。
  2. 偏差-方差权衡:RF不断的降低模型的方差,而GBDT不断的降低模型的偏差。
  3. 训练样本:RF每次迭代的样本是从全部训练集中有放回抽样形成的,而GBDT每次使用全部样本。
  4. 并行性:RF的树可以并行生成,而GBDT只能顺序生成(需要等上一棵树完全生成)。
  5. 最终结果:RF最终是多棵树进行多数表决(回归问题是取平均),而GBDT是加权融合。
  6. 数据敏感性:RF对异常值不敏感,而GBDT对异常值比较敏感。
  7. 泛化能力:RF不易过拟合,而GBDT容易过拟合。

# 机器学习算法中GBDT与Adaboost的区别与联系是什么?

https://www.zhihu.com/question/54626685