GBDT(Gradient Boosting Decision Tree) 梯度提升树的基本原理

GBDT(Gradient Boosting Decision Tree) 梯度提升树的基本原理

1. 什么是GBDT?

GBDT是一种基于boosting集成学习(ensemble method)的算法,但和传统的Adaboost有很大不同。在Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。GBDT的训练过程如下1
Fig 1. GBDT 的训练过程

1.1 Decision Tree

决策树分为两大类,分类树和回归树。前者用于分类标签值,如用户性别、垃圾邮件等;后者用于预测实数值,如年龄、房价等。而GBDT中使用的都是CART回归树,即时GBDT也可用于分类。

1.2 Gradient Boosting

GBDT是把所有树的结论累加起来做最终结论的,所以可以想到每棵树的结论并不是年龄本身,而是年龄的一个累加量。GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。这就是Gradient Boosting在GBDT中的意义2
根据上面那个简单的例子,我们知道假设损失函数为平方损失(square loss)时,我们使用残差来进行下一轮的训练,即GBDT算法的每一步在生成决策树时只需要拟合前面的模型的残差。Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树,这就是GBDT的负梯度拟合。损失函数的负梯度在当前模型的值为:

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

Boosting的最大好处在于,每一步的残差计算其实变相地增大了分错样本的权重,而已经分对的样本则都趋向于0。因为对于已经分对的样本,其残差为0,在下一轮中几乎不起作用。


2. GBDT算法

知道了怎么解决损失函数拟合的问题,即GBDT的负梯度拟合之后,需要使用这些负梯度进行训练。假设 rmi 表示第 m 轮的第i个样本的损失函数的负梯度:

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

利用 (xi,rmi)(i=1,2,..n) ,我们可以拟合第 m 棵CART回归树,其对应的叶节点区域Rmj,j=1,2,...,J,其中 J 为叶子节点的个数。

针对每个叶子节点里的样本,我们求出损失函数最小,也就是拟合叶子节点最好的的输出值cmj如下:

cmj=argmincxiRmjL(yi,fm1(xi)+c)

从而可以获得本轮的CART回归树的拟合函数:

hm(x)=j=1JcmjI(xRmj)

最后获得强学习器的表达式:

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

请结合上面的例子,理解每一轮更新强学习器都需要加上前面所有轮的输出!

2.1 GBDT回归算法

Freidman提出的梯度提升(Gradient Boosting)算法:利用最速下降的近似方法,即利用损失函数的负梯度在当前模型的值,作为回归问题中提升树算法的残差的近似值,拟合一个回归树。算法如下3

算法步骤解释:

1、初始化,估计使损失函数极小化的常数值,它是只有一个根节点的树,即 γ 是一个常数值。

2、对于每轮CART回归树:
(a)计算损失函数的负梯度在当前模型的值,将它作为残差的估计
(b)估计回归树叶节点区域,以拟合残差的近似值
(c)利用线性搜索估计叶节点区域的值,使损失函数极小化
(d)更新回归树

3、得到输出的最终模型 f(x)

2.2 GBDT分类算法

这里我们再看看GBDT分类算法,GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差4
为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为AdaBoost算法。另一种方法是用类似于逻辑回归的对数似然损失函数。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。本文仅讨论用对数似然损失函数的GBDT分类。而对于对数似然损失函数,我们又有二元分类和多元分类的区别。

2.2.1 二元GBDT分类算法

对于二元GBDT,如果用类似于逻辑回归的对数似然损失函数,则损失函数为:

L(y,f(x))=log(1+exp(yf(x)))

其中 y{1,+1} 。此时的负梯度误差为:

rmi=[L(y,f(xi)))f(xi)]f(x)=fm1(x)=yi/(1+exp(yif(xi)))

对于生成的CART回归树,我们各个叶子节点的最佳残差拟合值为:

cmj=argmincxiRmjlog(1+exp(yi(fm1(xi)+c)))

由于上面的式子比较难优化,一般使用近似值代替:

cmj=xiRmjrmi/xiRmj|rmi|(1|rmi|)

除了负梯度计算和叶子节点的最佳残差拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同。

2.2.2 多元GBDT分类算法

多元GBDT要比二元GBDT复杂一些,对应的是多元逻辑回归和二元逻辑回归的复杂度差别。假设类别数为K,则此时我们的对数似然损失函数为:

L(y,f(x))=k=1Kyklogpk(x)

其中如果样本输出类别为 k ,则yk=1。第 k 类的概率pk(x)的表达式为:

pk(x)=exp(fk(x))/l=1Kexp(fl(x))

集合上两式,我们可以计算出第 t 轮的第i个样本对应类别 l 的负梯度误差为:

rmil=[L(yi,f(xi)))f(xi)]fk(x)=fl,m1(x)=yilpl,m1(xi)

观察上式可以看出,其实这里的误差就是样本 i 对应类别l的真实概率和 m1 轮预测概率的差值。

对于生成的决策树,我们各个叶子节点的最佳残差拟合值为:

cmjl=argmincjli=0mk=1KL(yk,fm1,l(x)+j=0JcjlI(xiRmj))

由于上式比较难优化,我们一般使用近似值代替:

cmjl=K1KxiRmjlrmilxiRmil|rmil|(1|rmil|)

除了负梯度计算和叶子节点的最佳残差拟合的线性搜索,多元GBDT分类和二元GBDT分类以及GBDT回归算法过程相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值