上节对AdaBoost算法有了全面梳理。本节讨论提升树模型。
1. 提升树模型(Boosting Tree)
提升方法 = 加法模型 + 前向分步算法
加法模型:基函数的线性组合
提升树模型:以决策树(Decision Tree)为基函数的提升方法
分类问题中,决策树为二叉分类树;回归问题中,决策树为二叉回归树。
例8.1中,我们使用的基本分类器(
提升树可表示为决策树的加法模型:
其中,T为决策树,M为树的个数。
2. 提升树算法
仍然采用前向分步算法。迭代时,每步中求解本轮的最优决策树,最终线性组合。(注:此处基函数并未限制为树桩)
树的线性组合能够很好的拟合训练数据,所以提升树是高功能的学习算法。
针对不同问题的提升树,主要区别是使用的损失函数不同:
–回归问题:平方损失函数
–分类问题:指数损失函数
–一般决策问题:一般损失函数
对于二类分类问题,提升树如例8.1所示那样,将AdaBoost算法的基本分类器限制为二类分类树即可。此时提升树即是AdaBoost的特例。不需讨论。
现在着重讨论回归问题。
回归树相当于将输入空间划分为J个互不相交的区域R1-RJ,并且每个区域上都有一个确定的输出值常量Cj,则提升回归树可表示为:
参数
回归问题提升树学习时采用平方误差损失函数。
在第m步,给定当前模型
r是当前模型拟合数据的残差(residual)。该轮中我们需要拟合当前模型的残差。
算法:回归问题提升树的算法
输入:训练集T,
输出:提升树
过程:
(1)初始化
(2)对
(2-a)计算当前模型残差:
(2-b)拟合残差来学习一个回归树,得到
(2-c)更新
(3)得到回归问题提升树为
例8.2非常清晰的展现了算法流程。
算法(2-b)步骤中拟合残差学习一个回归树的算法,就是CART算法中的步骤,即遍历各切分点,分别求损失值,选择最小值对应的切分变量即可。每个切分区域的输出常量值为该区域样本值的平均值。
第1棵树拟合的是初始数据(-0残差还是本身),第2棵树拟合的是第一棵树过后的残差,第3棵树拟合的是第1+2棵树过后的残差…以此类推。
我们说boosting方法每一轮会改变训练集,就体现在这里。相比AdaBoost算法,它每次的训练集是改变权重。
当到某棵树时平方损失误差如果小于阈值,则可停止,线性组合为所求提升树。
3. 梯度提升(Gradient Boosting)
提升树模型中,当损失函数是平方损失函数或者指数损失函数时,每一步优化非常简单,比如回归树中损失函数为:
我们每步只需要生成最拟合残差的回归树,即可保证该步最优,最拟合残差的树有CART算法解决。AdaBoost算法中,我们每步只需要求解分类误差率最小的基函数就行。
但是对一般损失函数而言,每一步优化不一定就很容易。对此,Freidman于2000年提出梯度提升(Gradient Boosting)算法。
顾名思义,该算法本质是利用最速下降法在每轮中做最优化,而负梯度方向上损失函数将下降最快。
算法关键在于:利用损失函数的负梯度在当前模型的值:
来作为回归问题提升树算法中的残差的近似值,拟合一个回归树。
注意,提升树中使用
算法:梯度提升算法
输入:训练集T,
输出:回归树
过程:
(1)初始化
(2)对
(2-a)对
损失函数为
这就是我们为什么要用T去拟合(L函数的负梯度在当前模型的值),L将最快下降的效果的原因。这就是本轮的最优化,也符合前面的前向分步算法的思想:每一步学习一个基函数及其系数,逐步逼近目标函数式。
(2-b)拟合梯度残差来学习一个回归树,得到第m棵树的叶节点区
(2-c)对
即每个叶节点对应类的输出值,使损失函数最小化。
(2-d)更新回归树
(3)得到回归问题提升树为
分析:
该算法第一步初始化,估计使损失函数极小化的常数值,它是只有一个根节点的树。
第2-a步计算损失函数的负梯度在当前模型的值,作为残差的估计。若损失函数为平方损失函数,则负梯度残差值求导计算,就是
第2-b步估计回归树的叶节点区域,以拟合残差的近似值。2-c步利用线性搜索估计叶节点区域值,使得L极小化。
假设最终生成了n棵树,每个树上有m个分区。则共可产生