上节对AdaBoost算法有了全面梳理。本节讨论提升树模型。

1. 提升树模型(Boosting Tree)

提升方法 = 加法模型 + 前向分步算法

加法模型:基函数的线性组合

提升树模型:以决策树(Decision Tree)为基函数的提升方法

分类问题中,决策树为二叉分类树;回归问题中,决策树为二叉回归树。

例8.1中,我们使用的基本分类器(x<v),可以看做由一个根节点直接连接两个叶节点的简单决策树,即所谓的决策树桩(decision stump)。

《统计学习方法》笔记08:boosting(2)

提升树可表示为决策树的加法模型:

fM(x)=i=1MT(x;γm)

其中,T为决策树,M为树的个数。

2. 提升树算法

仍然采用前向分步算法。迭代时,每步中求解本轮的最优决策树,最终线性组合。(注:此处基函数并未限制为树桩)

树的线性组合能够很好的拟合训练数据,所以提升树是高功能的学习算法。

针对不同问题的提升树,主要区别是使用的损失函数不同:
–回归问题:平方损失函数
–分类问题:指数损失函数
–一般决策问题:一般损失函数

对于二类分类问题,提升树如例8.1所示那样,将AdaBoost算法的基本分类器限制为二类分类树即可。此时提升树即是AdaBoost的特例。不需讨论。

现在着重讨论回归问题。

回归树相当于将输入空间划分为J个互不相交的区域R1-RJ,并且每个区域上都有一个确定的输出值常量Cj,则提升回归树可表示为:

T(x,γ)=i=1JcjI(xRj)

参数γ={(R1,c1),...,(RJ,cJ)}表示树的划分和各区域上的常量。J是该回归树的复杂度,即叶节点的个数。

《统计学习方法》笔记08:boosting(2)

回归问题提升树学习时采用平方误差损失函数。

L(y,f(x))=(yf(x))2

在第m步,给定当前模型fm1(x),需求解第m棵树的参数。损失为:

L(y,fm1(x)+T(x;γ))=[yfm1(x)T(x;γ)]2=[rT(x;γ)]2

r=yfm1(x)

r是当前模型拟合数据的残差(residual)。该轮中我们需要拟合当前模型的残差。

算法:回归问题提升树的算法

输入:训练集T,yiR 即回归问题

输出:提升树fM(x)

过程:

(1)初始化f0(x)=0

(2)对m=1,2,...,M

(2-a)计算当前模型残差:rm,i=yifm1(xi)i=1..N

(2-b)拟合残差来学习一个回归树,得到T(x;γm)

(2-c)更新fm(x)=fm1(x)+T(x;γm)

(3)得到回归问题提升树为

fM(x)=i=1MT(x;γm)

例8.2非常清晰的展现了算法流程。

算法(2-b)步骤中拟合残差学习一个回归树的算法,就是CART算法中的步骤,即遍历各切分点,分别求损失值,选择最小值对应的切分变量即可。每个切分区域的输出常量值为该区域样本值的平均值。

第1棵树拟合的是初始数据(-0残差还是本身),第2棵树拟合的是第一棵树过后的残差,第3棵树拟合的是第1+2棵树过后的残差…以此类推。

我们说boosting方法每一轮会改变训练集,就体现在这里。相比AdaBoost算法,它每次的训练集是改变权重。

当到某棵树时平方损失误差如果小于阈值,则可停止,线性组合为所求提升树。

3. 梯度提升(Gradient Boosting)

提升树模型中,当损失函数是平方损失函数或者指数损失函数时,每一步优化非常简单,比如回归树中损失函数为:

L(y,fm1(x)+T(x;γ))=[yfm1(x)T(x;γ)]2=[rT(x;γ)]2

我们每步只需要生成最拟合残差的回归树,即可保证该步最优,最拟合残差的树有CART算法解决。AdaBoost算法中,我们每步只需要求解分类误差率最小的基函数就行。

但是对一般损失函数而言,每一步优化不一定就很容易。对此,Freidman于2000年提出梯度提升(Gradient Boosting)算法。

顾名思义,该算法本质是利用最速下降法在每轮中做最优化,而负梯度方向上损失函数将下降最快。

算法关键在于:利用损失函数的负梯度在当前模型的值:

[L(y,f(xi))f(xi)]f(x)=fm1(x)

来作为回归问题提升树算法中的残差的近似值,拟合一个回归树。

注意,提升树中使用rmi=yifm1(xi)得到残差;而此处将使用负梯度在当前模型中的值作为残差值。

算法:梯度提升算法

输入:训练集T,yiR 即回归问题,损失函数L

输出:回归树

过程:

(1)初始化

f0(x)=argminci=1NL(yi,c)

(2)对m=1,2,...,M

(2-a)对i=1,2,...,N,计算当前模型梯度残差:

rmi=[L(yi,f(xi))f(xi)]f(x)=fm1(x)

损失函数为L(y,fm1(x)+T(x;γ)),由梯度下降法得知,T取值为L函数的负梯度在当前模型的值时,L将最快下降。

这就是我们为什么要用T去拟合(L函数的负梯度在当前模型的值),L将最快下降的效果的原因。这就是本轮的最优化,也符合前面的前向分步算法的思想:每一步学习一个基函数及其系数,逐步逼近目标函数式。

(2-b)拟合梯度残差来学习一个回归树,得到第m棵树的叶节点区Rmj,j=1,2...,J。即每棵树下有J个叶节点。每个结点或包括多个输入实例。

(2-c)对j=1,2,...J,即对该树上的每个叶节点,利用线性搜索,估计计算

cmj=argmincxiRmjL(yi,fm1(xi)+c)

即每个叶节点对应类的输出值,使损失函数最小化。

(2-d)更新回归树

fm(x)=fm1(x)+j=1JcmjI(xRmj)

(3)得到回归问题提升树为

f(x)=fM(x)=m=1Mj=1JcmjI(xRmj)

分析:

该算法第一步初始化,估计使损失函数极小化的常数值,它是只有一个根节点的树。

第2-a步计算损失函数的负梯度在当前模型的值,作为残差的估计。若损失函数为平方损失函数,则负梯度残差值求导计算,就是yif(xi)。对于一般损失函数,它就是残差近似值。

第2-b步估计回归树的叶节点区域,以拟合残差的近似值。2-c步利用线性搜索估计叶节点区域值,使得L极小化。

假设最终生成了n棵树,每个树上有m个分区。则共可产生m+(n1)(m1)个分区,约为mn个。TSA比赛中曾用的参数,num-leaves=63个,num_trees为100个,则约可生成6300个分区。

相关文章: