梯度提升决策树(Gradient Boosting Decision Tree,简称 GBDT),它属于集成学习中 Boosting 类的算法
集成学习:Boosting
集成学习是将多个模型的预测结果进行结合输出。关于集成学习,在第十四课介绍了随机森林,它属于 Bagging 类的算法。使用随机森林解决回归问题,只需要将所有回归决策树的预测值取平均即可;
Boosting 类算法在解决回归问题时,只需要将个体学习器的预测值加权求和即可,如图所示:
当图中的个体学习器为同一类模型时,个体学习器又叫做基学习器。由此引出加法模型的定义;加法模型在解决回归问题时,其输出是将多个基函数的预测值加权求和得到的:
f
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
f(x)=\sum_{m=1}^{M}\beta_{m}b(x;\gamma_{m})
f(x)=m=1∑Mβmb(x;γm)
公式中基函数
b
(
x
;
γ
m
)
b(x;\gamma_{m})
b(x;γm) 的输入是特征向量
x
x
x,
γ
m
\gamma_{m}
γm 是基函数的参数;基函数、基模型、基学习器这几个名词可以看作同一对象的不同称谓;
以上的加法模型也被称为AdaBoost
从加法模型的表达式可知,我们需要同时求解
M
M
M 个基模型的参数,每个基模型都包含一组参数。按照常规思路,我们可以通过损失最小化来求解加法模型:
m
i
n
{
β
m
,
γ
m
}
∑
i
=
1
N
L
(
y
i
,
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
)
min_{\left\{\beta_{m},\gamma_{m}\right\}}\sum_{i=1}^{N}L(y_{i},\sum_{m=1}^{M}\beta_{m}b(x;\gamma_{m}))
min{βm,γm}i=1∑NL(yi,m=1∑Mβmb(x;γm))
这是一个多元函数求最小值的问题,相对比较复杂,一般使用前向分步算法来求解模型参数:
算法的输入为训练集、损失函数和基函数集。首先初始化加法模型:将加法模型的预测值设置为0,图中
f
(
x
)
f(x)
f(x) 的下标 0 表示加法模型的初始状态;
然后,从前向后分步迭代加法模型,一共迭代 M M M 次;第 m m m 次迭代的加法模型是由上一轮迭代的模型加上本轮迭代产生的基函数得到的,而本轮迭代的基函数的模型参数是通过加法模型在训练集上的损失函数最小化得到的;
最终,第 M M M 轮迭代后的加法模型即为算法的输出。分析整个过程可知,最终的加法模型是由 M M M 次迭代产生的基函数累加得到的;
总结:前向分步算法是每步学习一个基模型,然后累加到加法模型上,以保证当前学习到的加法模型在训练集上的损失函数取值最小
提升决策树
提升决策树( Boosting Decision Tree,简称 BDT)是以决策树为基函数的加法模型,且基函数的权重参数
β
\beta
β均为 1,提升决策树的数学表达式如下:
f
(
x
)
=
∑
m
=
1
M
T
(
x
;
θ
m
)
f(x)=\sum_{m=1}^{M}T(x;\theta_{m})
f(x)=m=1∑MT(x;θm)
使用提升决策树解决回归问题时,基函数为如下形式的回归决策树:
T
(
x
;
θ
)
=
∑
j
=
1
J
c
j
I
(
x
∈
R
j
)
T(x;\theta)=\sum_{j=1}^{J}c_{j}I(x\in R_{j})
T(x;θ)=j=1∑JcjI(x∈Rj)
其中,
θ
=
{
(
R
1
,
c
1
)
,
(
R
2
,
c
2
)
,
.
.
.
,
(
R
J
,
c
J
)
}
\theta =\left\{(R_{1},c_{1}),(R_{2},c_{2}),...,(R_{J},c_{J})\right\}
θ={(R1,c1),(R2,c2),...,(RJ,cJ)},
J
J
J为叶子节点的个数;
回归树对应着特征空间的一个划分以及在划分单元上的输出值;所以,决策树的模型参数可以表示为不同叶结点区域 R R R以及在该区域上的预测输出值 c c c;
提升决策树的学习算法总结如下:
与加法模型的学习过程相同,这里只是把基函数替换成了回归决策树;将提升决策树
f
(
x
)
f(x)
f(x) 作为自变量,
f
(
x
)
f(x)
f(x) 在训练集上的损失作为因变量,则 BDT 的迭代过程如下:
上图表示
f
(
x
)
f(x)
f(x) 每次迭代后对损失函数的影响。若是以单个样本来看,样本真实值为 8,
f
(
x
)
f(x)
f(x) 每次迭代后的预测值可能大于 8 ,也可能小于 8,当
f
(
x
)
=
8
f(x)=8
f(x)=8 时损失函数最小;将样本真实值减去模型预测值的结果定义为:模型拟合真实值的残差;
若样本真实值为 8,回归树 T 1 ( x ) = 6 T_{1}(x) = 6 T1(x)=6, T 2 ( x ) = 1 T_{2}(x) = 1 T2(x)=1,则第二次迭代后的提升决策树 f ( x ) = T 1 ( x ) + T 2 ( x ) = 7 f(x) = T_{1}(x)+T_{2}(x) = 7 f(x)=T1(x)+T2(x)=7,此时的残差为: 8 − 7 = 1 8 - 7 = 1 8−7=1;若 T 3 ( x ) = 1 T_{3}(x) = 1 T3(x)=1,则第三次迭代后的提升决策树 f ( x ) = T 1 ( x ) + T 2 ( x ) + T 3 ( x ) = 8 f(x) = T_{1}(x)+T_{2}(x)+T_{3}(x) = 8 f(x)=T1(x)+T2(x)+T3(x)=8,此时残差为零;
由此可见,提升决策树(BDT)的每棵回归树都是在拟合上一轮迭代后的 BDT 的残差:
r
m
i
=
y
i
−
f
m
−
1
(
x
i
)
,
i
=
1
,
2
,
.
.
.
,
N
r_{mi}=y_{i}-f_{m-1}(x_{i}),i=1,2,...,N
rmi=yi−fm−1(xi),i=1,2,...,N
θ
m
=
a
r
g
m
i
n
{
θ
}
∑
i
=
1
N
L
(
r
m
i
,
T
(
x
i
;
θ
)
)
\theta_{m}=argmin_{\left\{\theta \right\}}\sum_{i=1}^{N}L(r_{mi},T(x_{i};\theta))
θm=argmin{θ}i=1∑NL(rmi,T(xi;θ))
先计算训练集的样本残差,然后通过拟合残差学习一棵回归树。BDT 的学习本质上还是损失最小化。当损失函数加入正则化项之后,目标就变成了结构风险(损失+正则化项)最小化。若是仅通过拟合残差学习 BDT,容易陷入过拟合的风险
梯度提升算法
提升决策树的学习本质是最小化损失函数,类比使用梯度下降算法更新模型参数的公式,可以写出加法模型
f
(
x
)
f(x)
f(x) 的更新公式:
f
(
x
)
+
=
−
∂
l
o
s
s
∂
f
(
x
)
f(x)+=-\frac{\partial loss}{\partial f(x)}
f(x)+=−∂f(x)∂loss
这里相当于将
f
(
x
)
f(x)
f(x) 的学习率设置为 1,
f
(
x
)
f(x)
f(x) 每次朝着负梯度的方向迭代:
f
m
(
x
)
=
f
m
−
1
(
x
)
−
[
∂
l
o
s
s
∂
f
m
−
1
(
x
)
]
f_{m}(x)=f_{m-1}(x)-[\frac{\partial loss}{\partial f_{m-1}(x)}]
fm(x)=fm−1(x)−[∂fm−1(x)∂loss]
因此,第
m
m
m 轮新增的回归树只需拟合上一轮 BDT 的负梯度即可。通过这种方法得到的提升决策树称为梯度提升决策树,相应的学习算法称为梯度提升算法。
使用梯度提升算法学习 GBDT 的流程如下:
输入:训练集 T T T、损失函数 L L L
输出:GBDT 模型
- 1.初始化 GBDT 模型
f 0 ( x ) = a r g m i n { c } ∑ i = 1 N L ( y i , c ) f_{0}(x)=argmin_{\left\{c\right\}}\sum_{i=1}^{N}L(y_{i},c) f0(x)=argmin{c}i=1∑NL(yi,c) - 2.使用前向分步算法迭代 GBDT
- 3.得到 GBDT 模型
f ( x ) = f M ( x ) = ∑ m = 1 M T ( x ; θ m ) f(x)=f_{M}(x)=\sum_{m=1}^{M}T(x;\theta_{m}) f(x)=fM(x)=m=1∑MT(x;θm)
总结
- GBDT的基函数是回归决策树
- GBDT每次迭代的增量都是在拟合负梯度