以决策树为基函数的提升方法称为提升树,提升树的模型可以表示为决策树的加法模型,基函数一般是cart回归树,GDBT是属于boosting的一员,与之对应的还有bagging,对于bagging中代表算法有随机森林,boosting中代表的有adaboost、xgboost等,目前数据挖掘用的比较多的还是boosting。本文目的是介绍学习boosting家族中的GDBT,所有对于bagging与boosting的区别就不深入介绍。GDBT的模型如下:


fM(x)=∑m=1MT(x;Qm) f M ( x ) = ∑ m = 1 M T ( x ; Q m )


在介绍这个算法之前,先深入理解一下梯度的相关问题与应用

什么是梯度

二维的梯度是导数,多维的梯度是不同维度的导数的向量。简单理解:y=x2 y = x 2 导数 y′=2x y ′ = 2 x ,函数x2+y2+z2=1 x 2 + y 2 + z 2 = 1 ,梯度为(2x,2y,2z) ( 2 x , 2 y , 2 z )

什么是方向导数

想象一下在三维空间中有一个曲面F(x,y,z) F ( x , y , z ) ,取任意一点,从点A沿着球面出发有多少方向可以走呢?答案是无数条,它可以沿着x轴走,可以沿着y轴走,可以沿着z轴走,更可以是以(△x,△y,△z) ( △ x , △ y , △ z ) 为基底的任意方向走。



渐进梯度回归树模型 梯度渐进增长理论简述_二维



假设终点为球面上一点B,向量为

AB A B 。函数 F(A) F ( A ) 到 F(B) F ( B ) ,是不是存在了变化?函数值要么变大或者变小,也就是存在变化量,假设上图的性质是连续可导的,那么一定存在导数: F′=F(B)−F(A)B−A F ′ = F ( B ) − F ( A ) B − A ,如果你忘记了导数所代表的含义,没关系(因为理解导数确实很重要),带你重复复习一下。以函数 y=x y = x 为例吧,它的导数为1,这个导数代表了x方向每增加一个单位,y就会增长1。导数正是反映了函数的变化。与高中物理中的加速度有点像,加速度反映了速度在单位时间内的变化量。如果还是懵懵懂懂,请记住一点,导数是反映了函数的变化程度大小。也就是说,在三维曲面中,对于不确定的点B,向量AB可以是任何方向,函数可以在向量AB的方向上,任意变化,所以就存在了不同方向的导数,也就是方向导数。



F′=F(x+△x,y+△y,z+△z)−F(x,y,z)|(△x,△y,△z)| F ′ = F ( x + △ x , y + △ y , z + △ z ) − F ( x , y , z ) | ( △ x , △ y , △ z ) |


大白话解释这种数学定义可能有些童鞋适应不了,不说了上定义(来自百度百科):


渐进梯度回归树模型 梯度渐进增长理论简述_决策树_02

为什么负梯度方向是函数下降最快方向

把函数假设为二维函数,更容易理解点。随手粗糙的画了一张图。



渐进梯度回归树模型 梯度渐进增长理论简述_GDBT_03



从点A引一条直线,直线长度为1,向量AB方向,B点对应的y值为1,向量AC方向,点C对应的y值明显小于1。二维场景,同样适用高维情景。上面推导出了方向导数的定义

⅁f⅁l ⅁ f ⅁ l ,方向导数正是反映函数的变化,如果求出某个方向的的方向导数模最大,不就说明变化最大吗?方向导数还有另外一种写法


渐进梯度回归树模型 梯度渐进增长理论简述_决策树_04



⅁f⅁l=(⅁f⅁x,⅁f⅁y,⅁f⅁z)∗(cosa,cosβ,cosy) ⅁ f ⅁ l = ( ⅁ f ⅁ x , ⅁ f ⅁ y , ⅁ f ⅁ z ) ∗ ( c o s a , c o s β , c o s y )


|⅁f⅁l|=|(⅁f⅁x,⅁f⅁y,⅁f⅁z)|∗|(cosa,cosβ,cosy)|∗cosθ | ⅁ f ⅁ l | = | ( ⅁ f ⅁ x , ⅁ f ⅁ y , ⅁ f ⅁ z ) | ∗ | ( c o s a , c o s β , c o s y ) | ∗ c o s θ

因为

|(cosa,cosβ,cosy)|=1 | ( c o s a , c o s β , c o s y ) | = 1 ,所以当 cosθ=1 c o s θ = 1 时候, |⅁f⅁l| | ⅁ f ⅁ l | 最大,也就是与 (⅁f⅁x,⅁f⅁y,⅁f⅁z) ( ⅁ f ⅁ x , ⅁ f ⅁ y , ⅁ f ⅁ z ) 梯度方向一致的时候最大,反之负梯度方向下降最大。

损失函数L(y,yhat=f(x,y,z)) L ( y , y h a t = f ( x , y , z ) ) 可以通过梯度下降的方式找到最小值,通过找到负梯度方向,根据一定的步长变化x,y,z。GDBT的思想就是直接把f(x,y,z) f ( x , y , z ) 看做变量,根据一定的步长变化f(x,y,z) f ( x , y , z ) 。


L(y,yhat=fm−1(x,y,z)+learnrate∗(−⅁Lfm−1)) L ( y , y h a t = f m − 1 ( x , y , z ) + l e a r n r a t e ∗ ( − ⅁ L f m − 1 ) )


梯度下降,不停的优化损失函数L的同时,函数

fm(x,y,z) f m ( x , y , z ) 也不断的更新迭代,迭代到一定的次数损失达到预期值,就得到了一个判别函数 f(x,y,z) f ( x , y , z ) 如果函数 f f 是树的话,就称为梯度提升树。

fm(x,y,z)=fm−1(x,y,z)+learnrate∗(−⅁Lfm−1)fm(x,y,z)=fm−1(x,y,z)+learnrate∗(−⅁Lfm−1)


现在理解了为什么梯度提升树是集合树加权累加求和的结果了没? GDBT基函数都是cart树,通过一连串的cart树加权求和得到预测或者分类结果,下一篇文章将会以实例详细介绍GDBT的分类与预测的运算过程,帮你彻底搞懂这个666的算法。