您的位置:首页 > 其它

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

2018-03-20 14:23 549 查看

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

GBDTGradient Boosting Decision Tree 梯度提升树的基本原理
什么是GBDT
1 Decision Tree

2 Gradient Boosting

GBDT算法
1 GBDT回归算法

2 GBDT分类算法
21 二元GBDT分类算法

22 多元GBDT分类算法

1. 什么是GBDT?

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



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)=fm−1(x)

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

2. GBDT算法

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

rmi=−[∂L(yi,f(xi)))∂f(xi)]f(x)=fm−1(x)

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

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

cmj=argminc∑xi∈RmjL(yi,fm−1(xi)+c)

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

hm(x)=∑j=1JcmjI(x∈Rmj)

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

fm(x)=fm−1(x)+∑j=1JcmjI(x∈Rmj)

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

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)=fm−1(x)=yi/(1+exp(yif(xi)))

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

cmj=argminc∑xi∈Rmjlog(1+exp(−yi(fm−1(xi)+c)))

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

cmj=∑xi∈Rmjrmi/∑xi∈Rmj|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,m−1(x)=yil−pl,m−1(xi)

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

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

cmjl=argmincjl∑i=0m∑k=1KL(yk,fm−1,l(x)+∑j=0JcjlI(xi∈Rmj))

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

cmjl=K−1K∑xi∈Rmjlrmil∑xi∈Rmil|rmil|(1−|rmil|)

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

https://www.cnblogs.com/ModifyRong/p/7744987.html
http://blog.csdn.net/molu_chase/article/details/78111148
《The Elements of Statistical Learning》
https://www.cnblogs.com/pinard/p/6140514.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息