(作者:陈玓玏)
GBDT论文的全称:greedy function approximation: a gradient boosting machine。从这个标题可以看出,它是一种贪心算法,并且是与梯度有关的。常见的GBRT算法其实就是GBDT算法,中文我们一般叫梯度提升树。GBDT与一般的算法不同之处在于它是在函数空间上进行的优化,而不是从参数空间上进行的。
1、 函数优化
预测系统的目标是要找到一个能够使以下表达式结果最小的函数,即
F
∗
F^*
F∗,这里的
E
y
,
X
E_{y,X}
Ey,X表述方法其实很少见,不过以我的愚见,应当就是我们常见的其他算法损失函数中前面的乘积项
−
1
m
-\frac1m
−m1,只不过这里用了一种更通用的方法来表示而已:
Gradient Boosting是一种算法框架,一种固定范式,它可以用于分类也可以用于回归,并且能够定义不同的损失函数。式中
L
(
y
,
F
(
x
)
)
L(y,F(x))
L(y,F(x))表示的是损失函数,常用的损失函数有平方损失函数、绝对值损失函数和
l
o
g
(
1
+
e
−
2
y
F
)
log(1+e^{-2yF})
log(1+e−2yF)损失函数(进行
y
∈
y\in
y∈{
−
1
,
1
{-1,1}
−1,1}分类时)。
对于GB框架而言,多个基分类器最终组成的预测结果如下:
其中
f
0
f_0
f0是一个初始的估计值,可以任意给出,
f
1
,
.
.
.
.
,
f
M
f_1,....,f_M
f1,....,fM是由优化算法确定的增量函数,它们的求解方法如下:
每个增量函数的值都是步长
ρ
m
\rho_m
ρm*负梯度
−
g
m
(
X
)
-g_m(X)
−gm(X),梯度
g
m
(
X
)
g_m(X)
gm(X)的求解方法如下:
步长
ρ
m
\rho_m
ρm也不是固定不变的,它的求解如下:
其实际就是使得目标函数最小的步长(小声逼逼。。这么说起来也可以通过求导等于0来计算步长?)。
2、 GB框架
当数据量有限时,以上形式可能得不出一个精确的结果,还是需要用到带参数的函数形式,通过参数的优化来达到函数的优化。
GBDT考虑这样一种函数形式:
β
m
\beta_m
βm是基分类器的权重,
h
(
X
;
a
m
)
h(X;a_m)
h(X;am)是基分类器的输出结果,
X
X
X是输入变量,而
a
m
a_m
am是权重向量。对于回归树而言,
a
m
a_m
am是分割节点。
也就是将目标函数及其最优解表达为以下形式:
采用贪婪的逐步求解算法来求得
M
M
M对参数,也就是对于每个基分类器,我们通过以下式子来求解其参数:
求得结果后再更新前
m
m
m个基分类器的输出结果和为:
综上,GBDT框架如下:
简要描述一下算法:
- 算法中 F 0 ( x ) F_0(x) F0(x)是初始估计,根据损失函数及最初的步长来给出(这么说起来初始步长应该会对算法收敛速度起到相当重要的作用)。
- 在每次迭代中, y ~ i \tilde y_i y~i实际上就是负梯度 − g m ( x i ) -g_m(x_i) −gm(xi),之所以可以表示成 y ~ i \tilde y_i y~i我个人的理解是,我们本轮建树的结果就是要逼近这个值,所以我们姑且把它作为本棵树需要逼近的label。
- 既然已经求得了本轮需要逼近的label值 y ~ i \tilde y_i y~i,我们就可以求得参数 a m a_m am,如果是树模型,那就是求得树的分割点。这个式子中用到的是平方损失函数。
- 实际上,我理解的算法中表示的 ρ m \rho_m ρm就是 β m \beta_m βm,也就是说我们之后要求的就是向梯度方向逼近的最佳步长。
- 最后一步就是像参数的梯度更新一样,更新函数,更新的方式就是加上逼近负梯度的值,也就是步长*本轮拟合的值。
到这里其实还只讲了GBDT的GB框架,DT也就是决策树还没出现。
3、GBDT
当这个框架用在不同的损失函数上时,对应的就是不同的算法。论文中介绍了四种损失函数的GB应用,分别是平方损失、绝对偏差损失函数、Huber和logistic binomial log-likehood损失函数。
3.1 GB框架用于平方损失函数时
平方损失函数
L
(
y
,
F
)
=
(
y
−
F
)
2
/
2
L(y,F)=(y-F)^2/2
L(y,F)=(y−F)2/2,对
F
F
F求偏导的结果为
y
−
F
y-F
y−F,因此其算法更新为以下形式:
实际上,除了
y
~
i
\tilde y_i
y~i的形式和初始
F
0
F_0
F0改变了,其他并未改变,不过即使
y
~
i
\tilde y_i
y~i形式变了,其本质依旧是残差,是负梯度。
3.2 GB框架用于绝对值损失函数
绝对值损失函数为
∣
y
−
F
∣
|y-F|
∣y−F∣,其
y
~
i
\tilde y_i
y~i需要替换成偏导-符号函数
s
i
g
n
(
y
i
−
F
(
x
i
)
)
sign(y_i-F(x_i))
sign(yi−F(xi)),另外步长的求解方式可以化简成以下形式:
论文中提到函数
W
W
W{}是加权中值,但是我其实不知道具体是怎么个求法,举双手求科普呀喂!
3.3 回归树
之前讨论的案例中,基学习器
h
(
x
i
;
a
m
)
h(x_i;a_m)
h(xi;am)还从未露出过真面目。那么如果基学习器我们使用回归树,对于有
J
J
J个叶子节点的树而言,每棵树表示为以下形式:
R
j
R_j
Rj代表的是每个叶子节点代表的区域,而
b
j
b_j
bj是每个叶子节点的值,代表落入此区域的样本的输出值,当样本落入第
j
j
j个叶子节点,也就是落入第
j
j
j个区域,其输出值就是
b
j
b_j
bj。
其算法流程更新如下:
回归树用的损失函数其实是平方损失函数,所以照理说
y
~
i
\tilde y_i
y~i应该是
y
i
−
F
(
x
i
)
y_i-F(x_i)
yi−F(xi)才对,不知道论文中为什么写的符号函数。算法的第二步是构建回归树,逐级将所有的样本划分到
J
J
J个叶子节点上。第三步计算
γ
j
m
\gamma_jm
γjm其实是
ρ
m
∑
b
j
1
\rho_m\sum{b_j}1
ρm∑bj1,也就是步长*回归树的输出值,这里回归树的值是确定的,所以计算
γ
j
m
\gamma_jm
γjm就相当于在计算最优步长。
3.4 二分类决策树
当基学习器是二分类决策树时,其损失函数如下:
F
(
X
)
F(X)
F(X)的表达式如下(谁能告诉我为啥子表达式长这样?):
其算法更新如下:
初始值
F
0
F_0
F0是通过上面定义的
F
F
F函数表达式确定的,分类树需要去拟合的残差
y
~
i
\tilde y_i
y~i是由损失函数对
F
F
F求负梯度(这大概能说明负梯度不总是等于残差的?除了sigmoid函数和均方损失函数)得到的,根据需要拟合的label求得一个有
J
J
J个叶子节点的分类树。
γ
j
m
\gamma _jm
γjm本来是通过损失函数最小化来求得的,但是对log求最小值是impossible的,从其函数形状能看出来,因此把其转换成了图中的形式,转换的理由是(我木有看懂这个理由):
4. 正则化
1) Shrinkage:即学习率
v
v
v就是学习率。 一般来说,学习率小,迭代次数就会增多,且不容产生过拟合,一般选取0.1左右。
2)减少基学习器的数目
这个参数和学习率是相互矛盾的,当学习率减小时,过拟合会减弱,但基学习器数目会增多,因此需要在这两个变量之间寻求一个折衷的方案,具体的可以通过测试集或交叉验证来选择最佳参数。
3) 限制叶子节点中样本数目、剪枝、限制树深,这些都是决策树必有的正则化方案。
参考文章: