大家好,又到了偶数AI小课堂的时间了。上节课我们讲到了集成学习中的Boosting技术和AdaBoost算法,这节课我们对其来对Boosting进行延伸,引入梯度提升及GBDT。


本期主题丨AdaBoost推广:梯度提升(Gradient Boosting)

01梯度提升的工作原理

梯度提升涉及三个要素:

  • 要优化的损失函数;

  • 进行预测的弱学习器;

  • 添加弱学习器以最小化损失函数的加法模型。


1.损失函数


使用的损失函数取决于要解决的问题的类型。


损失函数必需是可微的,但支持许多标准损失函数,可以自定义自己的损失函数。例如,回归问题可能使用平方误差,分类问题可能使用对数损失。


梯度提升框架的一个好处是不必为每个可能想要使用的损失函数派生新的提升算法,它是一个足够通用的框架,可以使用任何可微的损失函数。


2.弱学习器


决策树用作梯度提升中的弱学习器。


具体来说,回归树用于输出分割的真实值,其输出可以加在一起,允许添加后续模型输出并“校正”预测中的残差。


树以贪婪的方式构建,根据基尼系数等纯度分数选择最佳分割点或最小化损失。

最初,例如在AdaBoost的情况下,使用非常短的决策树,只有一个分裂,成为决策树桩。较大的树通常可以使用4到8层。


通常以特定方式约束弱学习器,例如最大数量的层、节点、分裂或叶节点。这是为了确保学习器任然很弱,但仍然可以以贪婪的方式构造。


3.加法模型


一次添加一棵树,模型中现有的树不会改变。


梯度下降用于在添加树时最小化损失。梯度下降传统上用于最小化一组参数,例如回归方程中的系数或神经网络中的权重。在计算错误或损失后,更新权重以最小化该错误。


我们有弱学习器或更具体的说是决策树,而不是参数。计算损失后,要执行梯度下降程序,我们必须向模型添加一棵树以减少损失(即跟随梯度)。我们通过参数化树来做到这一点,然后修改树的参数并通过(减少残差损失)向正确的方向移动。(函数梯度下降)


然后将新树的输出添加到现有的树序列的输出中,以努力纠正或改进模型的最终输出。


一旦损失达到可接受的水平或不再改进外部验证数据集,就会添加固定数量的树或停止训练。

02对梯度提升的改进

梯度提升是一种贪婪算法,可以快速过拟合训练数据集。它可以受益于惩罚算法各个部分的正则化方法,并通过减少过度拟合来提高算法的性能。


1.树约束


一种很好的通用的约束树的启发式方法是:创建的约束越多,模型中需要的树越多,反之,单个树的约束越少,所需的树就越少。


以下是一些可以强加给决策树构建的约束:

  • 树的数量,通常模型中添加更多的树可能会导致过拟合的速度非常慢。建议是继续添加树,直到观察不到进一步的改进。
  • 树深度,更深的树是更复杂的树,更短的树是首选。一般来说,4~8层的效果会更好。
  • 节点数或叶数,如深度,这个可以约束树的大小,但如果使用其他约束,则不受对称结构的约束。
  • 可以考虑在拆分之前,每个拆分的观察数对训练节点的训练数量施加了最小约束。
  • 对损失的最小改进是对添加到树的任何拆分的改进和约束。


2.加权更新


每棵树的预测结果按顺序加在一起。每棵树对这个总和的贡献可以加权以减慢算法的学习速度。这种权重称为收缩率或学习率。


结果是学习速度变慢,反过来需要更多的树添加到模型中,需要更长的时间来训练,提供了树的数量和学习率之间的配置权衡。


学习率的取值范围通常是0.1~0.3以及小于0.1的值。


3.随机梯度提升


对Bagging 和随机森林的一个重要见解是允许从训练数据集的子样本中贪婪地创建树。同样的好处可用于减少梯度提升模型中序列中树之间的相关性。这个提升的变化称为随机梯度提升。


可以使用的随机提升的一些变体:

  • 在创建每棵树之前对行进行子采样。
  • 创建每棵树之前的子样本列。
  • 在考虑每个拆分之前对列进行子采样。


通常,积极的子采样(例如仅选择50%的数据)已被证明是有益的。


根据用户反馈,使用列子采样比传统的行子采样更能防止过拟合。


4.惩罚梯度提升


除了结构之外,还可以对参数化树施加额外的约束。像CART这样的经典决策树不用作弱学习器,而是使用一种称为回归树的修改形式,它在叶节点(也称为终端节点)中具有数值。在某些文献中,树的叶子中的值可以称为权重。


因此,可以使用流行的正则化函数对树的叶子权重进行正则化,例如:

  • 权重的L1正则化
  • 权重的L2正则化


额外的正则化项有助于平滑最终学习的权重以避免过度拟合。直观的,正则化目标将倾向于选择采用简单和预测函数的模型。

03GBDT


梯度提升决策树(GBDT Gradient Boosting Decision Tree)也是Boosting算法的一种,但是和Adaboost算法不同;区别如下:


AdaBoost算法是利用前一轮的弱学习器的误差来更新样本权重值,然后一轮一轮的迭代;GBDT也是迭代,但是GBDT要求弱学习器必须是CART模型,而且GBDT在模型训练的时候,是要求模型预测的样本损失尽可能的小。

                      


GBDT是梯度提升树,它使用损失函数的负梯度在当前模型的值作为回归问题提升树算法的残差近似值。


为什么已经有了基于残差的回归树,还提出基于负梯度来替代残差的提升树?


《统计学习方法》中给出的解释是:当损失函数是平方损失和对数损失时,每一步的优化是很简单的,但是对于一般的提升损失函数而言,往往每一步的优化不是那么容易,使用负梯度代替残差。


梯度与残差的关系


当损失函数是平方函数(y是实际值):

                        

此时对损失函数求梯度:

             

           

此时残差y-F(xi)等于负梯度,即当损失函数是平方损失函数时,负梯度就是残差。但是当损失函数非平方损失函数时,负梯度只是残差的近似值,并不等于残差。


GBDT算法原理


GBDT的模型迭代借助了梯度下降算法的优化过程,

                     

  


ft(x)是第t次迭代的增量,Ft(x)是前t次迭代的累加。     

                  


GBDT算法流程

                  

    

GBDT回归算法和分类算法的区别


两者唯一的区别就是选择不同的损失函数


回归算法选择的损失函数一般是均方差(最小二乘)或者绝对值误差;而分类算法中一般的损失函数为对数损失函数。


GBDT总结


优点:

  • 可以灵活处理各种类型的数据,包括连续值和离散值;
  • 在相对少的调参情况下,模型的预测效果也会不错;
  • 模型鲁棒性比较强。


缺点:

  • 由于弱学习器之间存在依赖关系,难以并行训练数据;
  • 数据维度较高时会加大算法计算复杂度