机器学习-boost系列(gbdt、xgboost、lightgbt)

一直以来对boost系列算法理解比较浅显、往往是在一些面试经验上总结了一些,算是背了下来,但是感觉理解的不是多深刻。
通过这一篇文章来梳理一下, 算是对各个算法有些流程性的理解。

GBT

GBT,即梯度提升树。之前看到过文档,说GBT用于分类时候就和Adaboost一样。Adaboost也是一种boost方法,其通过给错误样本较大的权重来提升性能。但是之后看到的大量文档也没讲GBT用于分类的情况,而确实是用于回归的。现在的看法是,分类问题也是可以转换成回归问题来做的,甚至大部分分类都是用回归来做的,所以这里GBT是能够处理分类和回归问题的。

决策树是解释性很强、容易理解的模型。由于关键是如何构建出一个树,使得树的各个叶子节点目标属性y相同(分类时用熵来判断、回归时用最小均方误差判断),所以这类算法的关键都在如何构建一个树,也就是如何对根结点进行分裂。ID3、C4.5、CART都定义了自己的指标来决定如何分裂节点(选择哪个特征、如何对特征分裂)。

直接使用CART可以实现回归,但是直观上回归感觉是不准确的,因为本质上其就是对维度空间进行划分、然后某一区域内的点回归到一个固定值。(这里没有找到合适的图)
上图展示了使用决策树用于分类的情况,回归情况是一样的,只是各个叶子节点不是一个类别,而是一个树值。
对于数值形变量,当树的深度过于浅时, 其相当于把数字按照粗的几个区间划分为几个类别(0-100的数字按照 0-25、25-50、50-75、75-100这样划分为4类, 如果只考虑一个属性、然后树的深度为2,那么就是划分为4类),而如果树的深度过深、可以把每个数字划分为一类,那样肯定就过拟合了。所以决策树的拟合能力是和树的深度相关的,树越深其拟合能力越强,在数值特征下其拟合能力特别强。

决策树把一定范围内的点都划分到同一回归值了,效果肯定是不好的。所以可以使用集成的思路来提高效果。
boost的想法就是,我先训练一个树得到一个回归值,再训练一个模型来拟合上一轮回归没能拟合的部分、这样两部分加起来效果肯定比第一个强。。。而boost就是这样把先后训练的所有模型相加得到更强大的模型过程。

平方误差下的梯度提升树做回归,概括起来就是:
L ( y , f m − 1 ( x ) + T ( x ; θ m ) ) = ( y − ( f m − 1 ( x ) + T ( x ; θ m ) ) ) 2 L(y,f_{m-1}(x)+T(x;\theta_m))= (y- (f_{m-1}(x)+T(x;\theta_m)))^2 L(y,fm1(x)+T(x;θm))=(y(fm1(x)+T(x;θm)))2

这里类似梯度下降算法,只是将 f ( x ) f(x) f(x)当作一个变量, T ( x ; θ m ) T(x;\theta_m) T(x;θm)拟合的就是 y − f m − 1 ( x ) y-f_{m-1}(x) yfm1(x),也就是损失函数的负梯度。在平方和这个损失函数下、负梯度于残差相同。但是对于其他损失函数情况下,一般使用负梯度作为拟合目标。这里有一个问题: 为什么不直接拟合残差,而使用负梯度。

拟合负梯度是为了可以扩展到更复杂的损失函数。简单来说、加入正则化项的损失函数其最优目标就不是y’=y,这个时候一直拟合残差,那就忽略了正则项了。

现在我们明白GBT其拟合目标是损失函数的负梯度(关于 f m − 1 ( x ) f_{m-1}(x) fm1(x)的), 其节点是如何分裂的呢?

还是通过节点所有值的平方误差来选择分裂哪个属性以及在哪里分裂的问题的。

在预测的时候,把所有树预测值相加就得到集成模型预测值。

XGBoost

之前看到过XGBOOST于GBDT的不同:

  • 添加正则(叶子节点个数,叶子节点分数)
  • 使用一阶导和二阶导
  • 缩减,类似于学习率,为了削弱每棵树的影响,让后面有更大的学习空间。
  • 列抽样
  • 支持并行(特征维度上面)

但是都是浅显的理解、没有流程性的思考,对XGBoost的认识就是工业化的改进。

首先XGBoost加入正则来控制模型的复杂度

GBT也可以加入正则啊?。。。

其次这里XGBoost使用二阶导:
机器学习-boost系列(gbdt、xgboost、lightgbt)_第1张图片
最终求解得到:
机器学习-boost系列(gbdt、xgboost、lightgbt)_第2张图片
这里w为预测值,OBJ为损失函数,也作为每个节点的分裂依据:
在这里插入图片描述
流程性来说:GBT为了使得总模型损失函数最小,使当前模型预测值为负梯度、但是其分裂条件是按照传统决策树使用最小均方误差来计算的。XGboost为了使得总模型损失函数最小,使得当前模型预测值为上文w
,其分裂条件是按照上文Gain来进行计算的。

lightGBM

lightGBM相比xgboost来说,主要

  1. 减少计算增益的次数。
    具体来说对于一个节点分裂,我们需要选择一个属性,然后选择按照哪个属性值分裂(大于该值为一类,小于该值为一类), 我们可能要对每个值都要计算一次,但是我们这里按照直方图,把数值都装进各个桶里,只计算按照边界值分裂的增益,就减小了计算量。另外还可以通过直方图的相减来进行进一步的加速(因为都是求和运算)
  2. Leaf-wise (Best-first) 的决策树生长策略
    它将选取具有最大 delta loss 的叶节点来生长。而xgboost是逐层进行分裂的???(有点类似于深度优先遍历和宽度优先遍历)

前面提到过,树的深度越深,其拟合能力越强。如果这里我们按照节点个数来正则,控制节点个数,此时正则损失是一致的,但是深度优先的拟合能力相比宽度优先更强,所以其损失更小。当然,数据集不够的时候,这样也容易造成过拟合。

  1. 类别特征值的最优分割
  2. 并行学习的优化

具体理解不深刻,主要是记录方便自己回忆。
具体可以看博客,讲解的很详细。

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