本文记录《统计学习方法》和刘建平大佬的有关GBDT梯度提升树的内容。
提升树算法
提升树模型也是采用的前向分步做法,即在每一步找到一个使得当前损失函数函数值最小的弱分类器,通过迭代得到最终的强分类器。该算法以决策树作为基函数的选择,分类问题采用CART分类树,对于回归问题采用最小二乘回归树,初始化的基函数可以采用一个根结点两个叶子结点的决策树桩。
提升树的算法流程如下:
f
0
(
x
)
=
0
f
m
(
x
)
=
f
m
−
1
(
x
)
+
T
m
(
x
;
θ
m
)
f
M
(
x
)
=
∑
i
M
T
i
(
x
;
θ
)
f_0(x)=0\\ f_m(x)=f_{m-1}(x)+T_m(x;\theta_m)\\ f_M(x)=\sum^M_iT_i(x;\theta)
f0(x)=0fm(x)=fm−1(x)+Tm(x;θm)fM(x)=i∑MTi(x;θ)
在前向分步的第m步中,对于当前的参数估计采用使得损失函数值最小的参数:
θ
m
=
arg
min
∑
i
L
(
y
i
,
f
m
−
1
(
x
)
+
T
(
x
i
;
θ
m
)
)
\theta_m = \arg\min \sum_i L(y_i,f_{m-1}(x)+T(x_i;\theta_m))
θm=argmini∑L(yi,fm−1(x)+T(xi;θm))
当采用均方差损失函数时:
L
(
y
,
f
(
x
)
)
=
(
y
−
f
(
x
)
)
2
L
(
y
,
f
m
−
1
+
T
m
(
x
;
θ
m
)
)
L
=
[
y
−
f
m
−
1
(
x
)
−
T
m
(
x
;
θ
m
)
]
2
L
=
[
r
m
−
1
−
T
(
x
;
θ
m
)
]
2
L(y,f(x))=(y-f(x))^2\\ L(y,f_{m-1}+T_m(x;\theta_m))\\ L=[y-f_{m-1}(x)-T_m(x;\theta_m)]^2\\ L=[r_{m-1}-T(x;\theta_m)]^2
L(y,f(x))=(y−f(x))2L(y,fm−1+Tm(x;θm))L=[y−fm−1(x)−Tm(x;θm)]2L=[rm−1−T(x;θm)]2
其中
r
m
−
1
=
y
−
f
m
−
1
(
x
)
r_{m-1}=y-f_{m-1}(x)
rm−1=y−fm−1(x)是当前强学习算法下的残差,则对于提升树而言,采用的拟合当前的模型的残差得到一个弱学习算法,最终得到当前的强学习算法。
梯度提升树
对于一般的损失函数时,在计算残差时不容易,所以采用了负梯度的方法来近似残差:
r
m
−
1
=
−
[
∂
L
(
y
,
f
m
(
x
)
∂
f
(
x
)
]
f
(
x
)
=
f
m
−
1
(
x
)
r_{m-1}=-[{\partial L(y,f_m(x)\over \partial f(x) }]_{f(x)=f_{m-1}(x)}
rm−1=−[∂f(x)∂L(y,fm(x)]f(x)=fm−1(x)
GBDT 回归树
输入:
T
=
{
(
x
1
,
y
1
)
,
.
.
.
,
(
x
N
,
y
N
)
}
T=\{(x_1,y_1),...,(x_N,y_N)\}
T={(x1,y1),...,(xN,yN)},损失函数L
输出:回归树
- 初始化:
f 0 ( x ) = arg min ∑ i N L ( y i , C ) f_0(x) = \arg\min \sum_i^NL(y_i,C) f0(x)=argmini∑NL(yi,C) - 在
m
=
1
,
2...
M
m=1,2...M
m=1,2...M次迭代
r m − 1 = − [ ∂ L ( y , f m ( x ) ∂ f ( x ) ] f ( x ) = f m − 1 ( x ) r_{m-1}=-[{\partial L(y,f_m(x)\over \partial f(x) }]_{f(x)=f_{m-1}(x)} rm−1=−[∂f(x)∂L(y,fm(x)]f(x)=fm−1(x)
对此时的残差拟合一个回归树,得到弱回归树的叶子结点:
c j m = arg min c ∑ L ( y i , f m − 1 ( x ) + c ) c^m_j = \arg\min\limits_{c} \sum L(y_i,f_{m-1(x)}+c) cjm=argcmin∑L(yi,fm−1(x)+c)
3.更新强回归树
f m ( x ) = f m − 1 ( x ) + ∑ j c j I ( x ∈ R j ) f_m(x)= f_{m-1}(x)+\sum_j c_jI(x\in R_j) fm(x)=fm−1(x)+j∑cjI(x∈Rj)
在初始化时,回归树是一个只有根结点的树桩,计算在当前损失函数的负梯度在当前模型的值作为残差的近似,用残差来拟合出一个回归树,使得损失函数值最小,并且更新强回归树。
GBDT分类树
在分类树中,因为输出是离散的类别无法用连续的损失函数,所以需要采用其他的损失函数。这里我们再看看GBDT分类算法,GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。解决办法一个是用指数损失函数,另一个是类别的预测概率值和真实概率值的差来拟合损失。
对数损失函数
L
(
y
,
f
(
x
)
)
=
l
o
g
(
1
+
e
x
p
(
−
y
f
(
x
)
)
)
L(y, f(x)) = log(1+ exp(-yf(x)))
L(y,f(x))=log(1+exp(−yf(x)))
此时的负梯度为:
r
t
i
=
−
[
∂
L
(
y
,
f
(
x
i
)
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
t
−
1
    
(
x
)
=
y
i
/
(
1
+
e
x
p
(
y
i
f
(
x
i
)
)
)
r_{ti} = -\bigg[\frac{\partial L(y, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)} = y_i/(1+exp(y_if(x_i)))
rti=−[∂f(xi)∂L(y,f(xi)))]f(x)=ft−1(x)=yi/(1+exp(yif(xi)))
则将梯度值代替残差值来进行拟合分类树,其他的过程和回归树的流程相同。
GBDT 正则化
为了防止过拟合,GBDT的正则化主要有三种方式。
-
定义为步长ν,对于前面的弱学习器的迭代
f k ( x ) = f k − 1 ( x ) + h k ( x ) f_k(x)=f_{k-1}(x)+h_k(x) fk(x)=fk−1(x)+hk(x)
如果我们加上了正则化项,则有
f k ( x ) = f k − 1 ( x ) + ν h k ( x ) f_k(x)=f_{k-1}(x)+νh_k(x) fk(x)=fk−1(x)+νhk(x)
ν的取值范围为0<ν≤1。对于同样的训练集学习效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。 -
正则化的方式是通过子采样比例(subsample)。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。
-
是对于弱学习器即CART回归树进行正则化剪枝。