简介

梯度提升决策树(GBDT)由于准确率高、训练快速等优点,被广泛应用到分类、回归合排序问题中。该算法是一种additive树模型,每棵树学习之前additive树模型的残差。许多研究者相继提出XGBoost、LightGBM等,又进一步提升了GBDT的性能。

基本思想

提升树-Boosting Tree

以决策树为基函数的提升方法称为提升树,其决策树可以是分类树或者回归树。决策树模型可以表示为决策树的加法模型。
梯度下降决策树 梯度提升决策树简介_提升树
其中,梯度下降决策树 梯度提升决策树简介_GBDT_02 表示决策树,梯度下降决策树 梯度提升决策树简介_机器学习_03表示树的参数,梯度下降决策树 梯度提升决策树简介_梯度下降决策树_04为树的个数。

针对不同问题的提升树算法主要区别在于损失函数的不同。对于回归问题,使用的是平方损失函数;对于分类问题,使用的是指数损失函数;对二分类问题,提升树算法只需将AdaBoost的基分类器设置为二分类树即可,此时的提升树算法是AdaBoost算法的一个特例。以下主要关注回归问题的提升树算法。

对于回归问题的提升树算法,每一步拟合的是前一步的残差,具体为什么拟合的是残差看下面推导:
梯度下降决策树 梯度提升决策树简介_提升树_05
其中 梯度下降决策树 梯度提升决策树简介_梯度提升_06

回归问题中的提升树算法如下:

输入:训练数据集 梯度下降决策树 梯度提升决策树简介_提升树_07 其中$x_{i} \in X \subseteq R^{n} 梯度下降决策树 梯度提升决策树简介_梯度下降决策树_08

输出:提升树 梯度下降决策树 梯度提升决策树简介_GBDT_09

  1. 初始化梯度下降决策树 梯度提升决策树简介_梯度提升_10
  2. 梯度下降决策树 梯度提升决策树简介_梯度下降决策树_11
  1. 计算每个数据的残差:

梯度下降决策树 梯度提升决策树简介_提升树_12

  1. 拟合残差学习一颗回归树,得到 梯度下降决策树 梯度提升决策树简介_梯度下降决策树_13
  2. 更新 梯度下降决策树 梯度提升决策树简介_梯度下降决策树_13
  1. 得到回归问题提升树
    梯度下降决策树 梯度提升决策树简介_提升树_15

得到一颗提升树后,可以对输入数据进行预测。假设得到两棵树,下图给出预测过程:

梯度下降决策树 梯度提升决策树简介_提升树_16

梯度提升-Gradient Boosting

梯度提升的思想借鉴与梯度下降法,回顾梯度下降法,对于优化问题:
梯度下降决策树 梯度提升决策树简介_梯度提升_17
使用梯度下降法求解的基本步骤:

  1. 随机选择一个初始点 梯度下降决策树 梯度提升决策树简介_GBDT_18
  2. 重复以下过程:
  1. 求负梯度:梯度下降决策树 梯度提升决策树简介_梯度提升_19
  2. 选择步长 梯度下降决策树 梯度提升决策树简介_梯度下降决策树_20
  3. 更新参数:梯度下降决策树 梯度提升决策树简介_梯度下降决策树_21
  1. 直到满足终止条件

由以上过程可以看出,对于最终的最优解梯度下降决策树 梯度提升决策树简介_机器学习_22,是由初始值 梯度下降决策树 梯度提升决策树简介_GBDT_23 经过M次迭代后得到的。设 梯度下降决策树 梯度提升决策树简介_机器学习_24,则 梯度下降决策树 梯度提升决策树简介_机器学习_22 为:
梯度下降决策树 梯度提升决策树简介_GBDT_26
函数空间中,我们也可以借鉴梯度下降的思想,进行最优函数的搜索。关键是利用损失函数的负梯度在当前模型的值
梯度下降决策树 梯度提升决策树简介_GBDT_27
作为回归问题提升树算法中的残差的近似值,拟合一个回归树。

对于模型的损失函数梯度下降决策树 梯度提升决策树简介_梯度下降决策树_28,为了能够求解出最优的函数梯度下降决策树 梯度提升决策树简介_梯度提升_29,首先设置初始值为:
梯度下降决策树 梯度提升决策树简介_GBDT_30
以函数 梯度下降决策树 梯度提升决策树简介_GBDT_31 为一个整体,与梯度下降法的更新过程一致,假设经过M代,得到最优的函数梯度下降决策树 梯度提升决策树简介_梯度提升_29为:
梯度下降决策树 梯度提升决策树简介_机器学习_33
其中梯度下降决策树 梯度提升决策树简介_梯度下降决策树_34 为:
梯度下降决策树 梯度提升决策树简介_梯度下降决策树_35
可以看到这里梯度变量是一个函数,是在函数空间上求解;而以往的梯度下降是在N维的参数空间负梯度方向,变量是参数。在梯度提升中,这里变量是函数,通过当前函数的负梯度方向更新函数以修正模型,最后累加的模型近似最优函数。

GBDT的负梯度为什么近似于提升树的残差

对于损失函数 梯度下降决策树 梯度提升决策树简介_提升树_36 ,我们将 梯度下降决策树 梯度提升决策树简介_机器学习_37 而不是 梯度下降决策树 梯度提升决策树简介_提升树_38 作为自变量。根据梯度下降定义,可以得到损失函数参数的更新公式:
梯度下降决策树 梯度提升决策树简介_机器学习_39
同时提升树的定义为:梯度下降决策树 梯度提升决策树简介_提升树_40,决策树拟合的值等于负梯度,为残差。

梯度提升决策树-GBDT

了解了GBDT的两个部分(提升树和梯度提升)后,我们以回归树为例,基模型为CART回归树,得到GBDT的实现思路如下

输入:训练数据集梯度下降决策树 梯度提升决策树简介_提升树_07,其中其中$x_{i} \in X \subseteq R^{n} 梯度下降决策树 梯度提升决策树简介_梯度下降决策树_08

输出:提升树 梯度下降决策树 梯度提升决策树简介_GBDT_09

  1. 初始化 梯度下降决策树 梯度提升决策树简介_GBDT_44
  2. 梯度下降决策树 梯度提升决策树简介_提升树_45
  1. 计算每个数据:梯度下降决策树 梯度提升决策树简介_梯度下降决策树_46
  2. 拟合梯度下降决策树 梯度提升决策树简介_梯度下降决策树_47学习一棵回归树,得到梯度下降决策树 梯度提升决策树简介_机器学习_48。更详细一点,得到第梯度下降决策树 梯度提升决策树简介_机器学习_49棵树的叶节点区域 梯度下降决策树 梯度提升决策树简介_提升树_50,即一颗由 梯度下降决策树 梯度提升决策树简介_GBDT_51
  3. 计算每个区域的最优输出:
    梯度下降决策树 梯度提升决策树简介_机器学习_52
  4. 更新
    梯度下降决策树 梯度提升决策树简介_GBDT_53
  5. 得到回归问题梯度提升树
    梯度下降决策树 梯度提升决策树简介_机器学习_54

算法步骤1得到使损失函数最小的常数估计值,是一个只有根节点的树。在步骤2a计算损失函数的负梯度在当前模型的值,作为残差估计。在步骤2b估计回归树的叶节点区域,来拟合残差的近似值。第2c步利用线性搜索估计叶节点区域的值,使损失函数极小化。第2d步更新回归树。第3步得到输出的最终模型。

优点

  1. 预测阶段的计算速度快,树与树之间可并行化计算
  2. 在分布稠密的数据集上,泛化能力和表达能力都很好
  3. 采用决策树作为弱分类器使GBDT具有较好的解释性和鲁棒性,能够自动发现特征间的高阶关系,并且也不需要对数据进行特殊的处理如归一化等

缺点

  1. GBDT在高维稀疏的数据集上,表现不如SVM或者神经网络
  2. GBDT在处理文本分类特征问题上,不如处理数值特征
  3. 训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提高训练速度

实现

GBDT的python源码实现

常见问题

  • 2-10-1 梯度提升和梯度下降有什么区别和联系?

两者都是在每一轮迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新,只不过在梯度下降中,模型是以参数化的形式表示,从而模型的更新等价于参数的更新。

而在梯度提升中,模型并不需要参数化表示,而是直接定义在函数空间中,从而大大扩展了可以使用的模型种类。

  • 2-10-2 你是如何理解Boosting和Bagging?他们有什么异同?

Bagging通过模型集成降低方差,提高弱分类器的性能。

Boosting通过模型集成降低偏差,提高弱分类器的性能。

Bagging

Boosting

降低

方差

偏差

训练

各个弱分类器可独立训练

弱分类器需要依次生成

  • 2-10-3 讲解GBDT的训练过程?

用每个样本的残差训练下一棵树,直到残差收敛到某个阈值以下,或者树的总数达到某个上限为止。

  • 2-10-4 你觉得GBDT训练过程中哪些环节可以并行提升训练效率?

A. 计算每个样本的负梯度
B. 分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时
C. 更新每个样本的负梯度时
D. 最后预测过程中,每个样本将之前的所有树的结果累加的时候

  • 2-10-5 GBDT的优点和局限性有哪些?

优点

(1)预测阶段计算速度块,树与树之间可并行化计算

(2)在分布稠密的数据集上,泛化能力和表达能力都很好

(3)采用决策树作为弱分类器使得GBDT模型具有较好的可解释性和鲁棒性,能够自动发现特征间的高阶关系,并且不需要对数据进行特殊的预处理如归一化等

缺点

(1)GBDT在高维稀疏的数据集上,表现不如支持向量机或者神经网络

(2)GBDT在处理文本分类特征问题上,优势不如在处理数值特征时明显

(3)训练过程需要串行训练,只能在决策树内容采用一些局部并行手段提高训练速度

  • 2-10-6 GBDT是否对异常值敏感,为什么?

基于残差的GDBT对异常值敏感。对于回归类的问题,如果采用平方损失函数。当出现异常值时,后续模型会对异常值关注过多。我们来看一个例子:

梯度下降决策树 梯度提升决策树简介_GBDT_55

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

梯度下降决策树 梯度提升决策树简介_GBDT_56

  • 2-10-7 如何防止GBDT过拟合?
  • 2-10-8 在训练过程中哪些参数对模型效果影响比较大?这些参数造成影响是什么?

参考资料

  1. 李航《统计学习方法》
  2. GBDT算法原理深入解析
  3. 机器学习-一文理解GBDT的原理-20171001
  4. http://www.ccs.neu.edu/home/vip/teach/MLcourse/4_boosting/slides/gradient_boosting.pdf
  5. GBDT的python源码实现