以决策树为基函数的提升方法称为提升树,提升树的模型可以表示为决策树的加法模型,基函数一般是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 ) |
大白话解释这种数学定义可能有些童鞋适应不了,不说了上定义(来自百度百科):
为什么负梯度方向是函数下降最快方向
把函数假设为二维函数,更容易理解点。随手粗糙的画了一张图。
从点A引一条直线,直线长度为1,向量AB方向,B点对应的y值为1,向量AC方向,点C对应的y值明显小于1。二维场景,同样适用高维情景。上面推导出了方向导数的定义
⅁f⅁l
⅁
f
⅁
l
,方向导数正是反映函数的变化,如果求出某个方向的的方向导数模最大,不就说明变化最大吗?方向导数还有另外一种写法
⅁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的算法。