1.GBDT简介
梯度提升树(Gradient Boosting Decison Tree, GBDT)是集成学习boosting家族的成员,却和传统的Adaboost有很大的不同。回顾下Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。GBDT通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度。由于上述高偏差的要求,每个分类回归树的深度不会很深。最终的总分类器是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)。
2.GBDT的负梯度拟合
提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数式平方损失和指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,往往每一步优化并不容易。针对这一问题,Freidman提出梯度提升算法。这是利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值
r
m
i
=
−
[
∂
L
(
y
i
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
{{r}_{mi}}=-{{\left[ \frac{\partial L\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)}{\partial f\left( {{x}_{i}} \right)} \right]}_{f\left( x \right)={{f}_{m-1}}\left( x \right)}}
rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
作为回归问题提升树算法中的残差的近似值,拟合一个回归树。
3.GBDT回归算法
输入:训练数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
N
,
y
N
)
}
T=\left\{ \left( {{x}_{1}},{{y}_{1}} \right),\left( {{x}_{2}},{{y}_{2}} \right),...,\left( {{x}_{N}},{{y}_{N}} \right) \right\}
T={(x1,y1),(x2,y2),...,(xN,yN)},
x
i
∈
X
⊆
R
n
,
y
i
∈
Y
⊆
R
{{x}_{i}}\in \Chi \subseteq {{R}^{n}},{{y}_{i}}\in Y\subseteq R
xi∈X⊆Rn,yi∈Y⊆R;则损失函数
L
(
y
,
f
(
x
)
)
L\left( y,f\left( x \right) \right)
L(y,f(x));
输出:回归树
f
M
(
x
)
{{f}_{M}}\left( x \right)
fM(x) 。
(1)初始化
f
0
(
x
)
=
arg
min
c
 
∑
i
=
1
N
L
(
y
i
,
c
)
{{f}_{0}}\left( x \right)=\arg \underset{c}{\mathop{\min }}\,\sum\limits_{i=1}^{N}{L\left( {{y}_{i}},c \right)}
f0(x)=argcmini=1∑NL(yi,c)
(2)对
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m=1,2,...,M
(a)对
i
=
1
,
2
,
.
.
.
,
N
i=1,2,...,N
i=1,2,...,N,计算
r
m
i
=
−
[
∂
L
(
y
i
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
{{r}_{mi}}=-{{\left[ \frac{\partial L\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)}{\partial f\left( {{x}_{i}} \right)} \right]}_{f\left( x \right)={{f}_{m-1}}\left( x \right)}}
rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
(b)对
r
m
i
{{r}_{mi}}
rmi拟合一个回归树,得到第m棵树的叶结点区域
R
m
j
{{R}_{mj}}
Rmj,
j
=
1
,
2
,
.
.
.
,
J
j=1,2,...,J
j=1,2,...,J
(c)对
j
=
1
,
2
,
.
.
.
,
J
j=1,2,...,J
j=1,2,...,J,计算
c
m
j
=
arg
min
c
 
∑
x
i
∈
R
m
j
L
(
y
i
,
f
m
−
1
(
x
i
)
+
c
)
{{c}_{mj}}=\arg \underset{c}{\mathop{\min }}\,\sum\limits_{{{x}_{i}}\in {{R}_{mj}}}{L\left( {{y}_{i}},{{f}_{m-1}}\left( {{x}_{i}} \right)+c \right)}
cmj=argcminxi∈Rmj∑L(yi,fm−1(xi)+c)
(d)更新
f
m
(
x
)
=
f
m
−
1
(
x
)
+
∑
j
=
1
J
c
m
j
I
(
x
∈
R
m
j
)
{{f}_{m}}\left( x \right)={{f}_{m-1}}\left( x \right)+\sum\limits_{j=1}^{J}{{{c}_{mj}}I\left( x\in {{R}_{mj}} \right)}
fm(x)=fm−1(x)+j=1∑JcmjI(x∈Rmj)
(3)得到回归树
f
M
(
x
)
=
∑
i
=
1
M
∑
j
=
1
J
c
m
j
I
(
x
∈
R
m
j
)
{{f}_{M}}\left( x \right)=\sum\limits_{i=1}^{M}{\sum\limits_{j=1}^{J}{{{c}_{mj}}I\left( x\in {{R}_{mj}} \right)}}
fM(x)=i=1∑Mj=1∑JcmjI(x∈Rmj)
可参考我之前文章写得前向分布回归算法进行理解。
4.GBDT分类算法
4.1二元GBDT分类算法
对于二元GBDT,如果用类似于逻辑回归的对数似然函数,则损失函数为:
L
(
y
,
f
(
x
)
)
=
log
(
1
+
exp
(
−
y
f
(
x
)
)
)
,
y
∈
{
−
1
,
+
1
}
L\left( y,f\left( x \right) \right)=\log \left( 1+\exp \left( -yf\left( x \right) \right) \right),y\in \left\{ -1,+1 \right\}
L(y,f(x))=log(1+exp(−yf(x))),y∈{−1,+1}
此时的负梯度误差为:
r
m
i
=
−
[
∂
L
(
y
i
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
=
y
i
/
(
1
+
exp
(
y
i
f
(
x
i
)
)
)
{{r}_{mi}}=-{{\left[ \frac{\partial L\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)}{\partial f\left( {{x}_{i}} \right)} \right]}_{f\left( x \right)={{f}_{m-1}}\left( x \right)}}\text{=}{{y}_{i}}/\left( 1+\exp \left( {{y}_{i}}f\left( {{x}_{i}} \right) \right) \right)
rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)=yi/(1+exp(yif(xi)))
对于生成的决策树,各个叶子节点的最佳负梯度拟合值为:
c
m
j
=
arg
min
c
 
∑
x
i
∈
R
m
j
log
(
1
+
exp
(
−
y
i
f
m
−
1
(
x
i
)
+
c
)
)
{{c}_{mj}}=\arg \underset{c}{\mathop{\min }}\,\sum\limits_{{{x}_{i}}\in {{R}_{mj}}}{\log \left( 1+\exp \left( -{{y}_{i}}{{f}_{m-1}}\left( {{x}_{i}} \right)+c \right) \right)}
cmj=argcminxi∈Rmj∑log(1+exp(−yifm−1(xi)+c))
由于上式比较难优化,我们一般使用近似值替代
c
m
j
=
∑
x
i
∈
R
m
j
r
m
i
/
∑
x
i
∈
R
m
j
∣
r
m
i
∣
(
1
−
∣
r
m
i
∣
)
{{c}_{mj}}=\sum\limits_{{{x}_{i}}\in {{R}_{mj}}}{{{r}_{mi}}}/\sum\limits_{{{x}_{i}}\in {{R}_{mj}}}{\left| {{r}_{mi}} \right|\left( 1-\left| {{r}_{mi}} \right| \right)}
cmj=xi∈Rmj∑rmi/xi∈Rmj∑∣rmi∣(1−∣rmi∣)
4.2多元GBDT分类算法
多元GBDT要比二元GBDT复杂一些,对应的是多元逻辑回归和二元逻辑回归的复杂度差别。假设类别数为K,则此时我们的对数似然损失函数为:
L
(
y
,
f
(
x
)
)
=
−
∑
k
=
1
K
y
k
log
p
k
(
x
)
L\left( y,f\left( x \right) \right)=-\sum\limits_{k=1}^{K}{{{y}_{k}}\log {{p}_{k}}\left( x \right)}
L(y,f(x))=−k=1∑Kyklogpk(x)
如果样本输出类别为k,则
y
k
=
1
{{y}_{k}}=1
yk=1。第k类的概率
p
k
(
x
)
{{p}_{k}}\left( x \right)
pk(x)的表达式为:
L
(
y
,
f
(
x
)
)
=
−
∑
k
=
1
K
y
k
log
p
k
(
x
)
L\left( y,f\left( x \right) \right)=-\sum\limits_{k=1}^{K}{{{y}_{k}}\log {{p}_{k}}\left( x \right)}
L(y,f(x))=−k=1∑Kyklogpk(x)
第m轮的第i个样本对应类别k的负梯度误差为
r
m
i
k
=
−
[
∂
L
(
y
i
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
=
y
i
k
−
p
k
,
m
−
1
(
x
i
)
{{r}_{mik}}=-{{\left[ \frac{\partial L\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)}{\partial f\left( {{x}_{i}} \right)} \right]}_{f\left( x \right)={{f}_{m-1}}\left( x \right)}}\text{=}{{y}_{ik}}-{{p}_{k,m-1}}\left( {{x}_{i}} \right)
rmik=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)=yik−pk,m−1(xi)
观察上式可以看出,其实这里的误差就是样本i对应类别k的真实概率和m−1轮预测概率的差值。
对于生成的决策树,我们各个叶子节点的最佳负梯度拟合值为
c
m
j
k
=
arg
min
c
j
k
 
∑
i
=
1
N
∑
k
=
1
K
L
(
y
i
k
,
f
m
−
1
,
k
(
x
i
)
+
∑
j
=
0
J
c
j
k
I
(
x
i
∈
R
m
j
)
)
{{c}_{mjk}}=\arg \underset{{{c}_{jk}}}{\mathop{\min }}\,\sum\limits_{i=1}^{N}{\sum\limits_{k=1}^{K}{L\left( {{y}_{ik}},{{f}_{m-1,k}}\left( {{x}_{i}} \right)+\sum\limits_{j=0}^{J}{{{c}_{jk}}I\left( {{x}_{i}}\in {{R}_{mj}} \right)} \right)}}
cmjk=argcjkmini=1∑Nk=1∑KL(yik,fm−1,k(xi)+j=0∑JcjkI(xi∈Rmj))
由于上式比较难优化,我们一般使用近似值替代
c
m
j
k
=
K
−
1
K
∑
x
i
∈
R
m
j
k
r
m
i
k
∑
x
i
∈
R
m
j
k
∣
r
m
i
k
∣
(
1
−
∣
r
m
i
k
∣
)
{{c}_{mjk}}=\frac{K-1}{K}\frac{\sum\limits_{{{x}_{i}}\in {{R}_{mjk}}}{{{r}_{mik}}}}{\sum\limits_{{{x}_{i}}\in {{R}_{mjk}}}{\left| {{r}_{mik}} \right|\left( 1-\left| {{r}_{mik}} \right| \right)}}
cmjk=KK−1xi∈Rmjk∑∣rmik∣(1−∣rmik∣)xi∈Rmjk∑rmik
这里不再给出例子,可以参照我之前写的Adaboost分类算法的例子,这里的
c
m
j
k
{{c}_{mjk}}
cmjk其实就是预测的概率。我们的第m棵树有J个叶子,每个叶子就是一个类别(可能多个叶子都代表同一个类别),数据被分到哪个叶子上就使用该叶子的权重,这里一共有M棵树,那么将数据对应的各棵树的树叶的权值
c
m
j
k
{{c}_{mjk}}
cmjk对应着类别进行相加,就可以得到该数据在对应类别的权重,选出最高的权重对应的类别,该类别就是此数据的类别。
下面给出原论文中的伪代码截图:
5.GBDT常用损失函数
5.1分类算法
(1)指数损失函数
L
(
y
,
f
(
x
)
)
=
exp
(
−
y
f
(
x
)
)
L\left( y,f\left( x \right) \right)=\exp \left( -yf\left( x \right) \right)
L(y,f(x))=exp(−yf(x))
(2)对数损失函数
二元分类:
L
(
y
,
f
(
x
)
)
=
log
(
1
+
exp
(
−
y
f
(
x
)
)
)
L\left( y,f\left( x \right) \right)=\log \left( 1+\exp \left( -yf\left( x \right) \right) \right)
L(y,f(x))=log(1+exp(−yf(x)))
多元分类:
L
(
y
,
f
(
x
)
)
=
−
∑
k
=
1
K
y
k
log
p
k
(
x
)
L\left( y,f\left( x \right) \right)=-\sum\limits_{k=1}^{K}{{{y}_{k}}\log {{p}_{k}}\left( x \right)}
L(y,f(x))=−k=1∑Kyklogpk(x)
5.2回归算法
(1)均方差(最常见)
L
(
y
,
f
(
x
)
)
=
(
y
−
f
(
x
)
)
2
L\left( y,f\left( x \right) \right)={{\left( y-f\left( x \right) \right)}^{2}}
L(y,f(x))=(y−f(x))2
(2)绝对损失(很常见)
L
(
y
,
f
(
x
)
)
=
∣
y
−
f
(
x
)
∣
L\left( y,f\left( x \right) \right)=\left| y-f\left( x \right) \right|
L(y,f(x))=∣y−f(x)∣
对应负梯度误差为:
s
i
g
n
(
y
i
−
f
(
x
i
)
)
sign\left( {{y}_{i}}-f\left( {{x}_{i}} \right) \right)
sign(yi−f(xi))
(3)Huber损失,它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。
L
(
y
,
f
(
x
)
)
=
{
1
2
(
y
−
f
(
x
)
)
2
,
∣
y
−
f
(
x
)
∣
≤
δ
δ
(
∣
y
−
f
(
x
)
∣
−
δ
2
)
,
∣
y
−
f
(
x
)
∣
>
δ
L\left( y,f\left( x \right) \right)=\left\{ \begin{matrix} \frac{1}{2}{{\left( y-f\left( x \right) \right)}^{2}},\left| y-f\left( x \right) \right|\le \delta \\ \delta \left( \left| y-f\left( x \right) \right|-\frac{\delta }{2} \right),\left| y-f\left( x \right) \right|>\delta \\ \end{matrix} \right.
L(y,f(x))={21(y−f(x))2,∣y−f(x)∣≤δδ(∣y−f(x)∣−2δ),∣y−f(x)∣>δ
对应负梯度误差为:
r
(
y
i
,
f
(
x
i
)
)
=
{
y
i
−
f
(
x
i
)
,
∣
y
−
f
(
x
)
∣
≤
δ
δ
s
i
g
n
(
y
i
−
f
(
x
i
)
)
,
∣
y
−
f
(
x
)
∣
>
δ
r\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)=\left\{ \begin{matrix} {{y}_{i}}-f\left( {{x}_{i}} \right),\left| y-f\left( x \right) \right|\le \delta \\ \delta sign\left( {{y}_{i}}-f\left( {{x}_{i}} \right) \right),\left| y-f\left( x \right) \right|>\delta \\ \end{matrix} \right.
r(yi,f(xi))={yi−f(xi),∣y−f(x)∣≤δδsign(yi−f(xi)),∣y−f(x)∣>δ
(4)分位数损失
L
(
y
,
f
(
x
)
)
=
∑
y
≥
f
(
x
)
θ
∣
y
−
f
(
x
)
∣
+
∑
y
<
f
(
x
)
(
1
−
θ
)
∣
y
−
f
(
x
)
∣
L\left( y,f\left( x \right) \right)=\sum\limits_{y\ge f\left( x \right)}{\theta \left| y-f\left( x \right) \right|}+\sum\limits_{y<f\left( x \right)}{\left( 1-\theta \right)\left| y-f\left( x \right) \right|}
L(y,f(x))=y≥f(x)∑θ∣y−f(x)∣+y<f(x)∑(1−θ)∣y−f(x)∣
其中
θ
\theta
θ为分位数,需要我们在回归之前指定。对应的负梯度误差为:
r
(
y
i
,
f
(
x
i
)
)
=
{
θ
,
y
i
≥
f
(
x
i
)
θ
−
1
,
y
i
<
f
(
x
i
)
r\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)=\left\{ \begin{matrix} \theta ,{{y}_{i}}\ge f\left( {{x}_{i}} \right) \\ \theta -1,{{y}_{i}}<f\left( {{x}_{i}} \right) \\ \end{matrix} \right.
r(yi,f(xi))={θ,yi≥f(xi)θ−1,yi<f(xi)
对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。
6.GBDT的正则化
(1)和Adaboost类似的正则化项,即步长(learning rate,lr)。例如:
f
k
(
x
)
=
f
k
−
1
(
x
)
+
l
r
⋅
α
k
h
k
(
x
)
{{f}_{k}}\left( x \right)\text{=}{{f}_{k-1}}\left( x \right)+lr\cdot {{\alpha }_{k}}{{h}_{k}}\left( x \right)
fk(x)=fk−1(x)+lr⋅αkhk(x)
(2)子采样。取值为(0,1),子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。
(3)对于弱学习器即CART回归树进行正则化剪枝。具体在李航的《统计学习方法》里有,后面的我可能根据小蓝书更新一下。
7.总结
GBDT在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一,在前几年深度学习还没有大行其道之前,GBDT在各种竞赛是大放异彩。原因大概有几个,一是效果确实挺不错;二是既可以用于分类也可以用于回归;三是可以筛选特征。
GBDT主要的优点有:
(1)可以灵活处理各种类型的数据,包括连续值和离散值。
(2)在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
(3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile(分位数)损失函数。
GBDT的主要缺点有:
(1)由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。
GBDT算法理论
最新推荐文章于 2022-04-02 16:30:38 发布