AdaBoost
引言:
先从简单的说起吧,我们来看一下指数函数的曲线。
指数函数是
y
=
a
x
y = a^x
y=ax的形式,它的曲线为:
当a = e时,很自然就如左图所示。
此时,
y
=
e
x
y=e^x
y=ex
当x<0时,y<1。当x≥0时,y≥1。
从前向分布算法说起
前向分布算法说,不管你的基函数是什么,损失函数是什么,只要你的模型是加法模型,就可以按照我这个框架去进行求解。
加法模型拥有m个基函数和对应的m个系数,它可以从前往后,一个一个地去求解。即
f
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
f(x) =\sum_{m=1}^{M}{β_mb(x;γ_m)}
f(x)=m=1∑Mβmb(x;γm)
其中,
b
(
x
;
γ
m
)
b(x;γ_m)
b(x;γm)为基函数,
γ
m
γ_m
γm是基函数的参数,
β
m
β_m
βm是基函数的系数。
那么它的经验损失就是:
min
β
m
,
γ
m
∑
i
=
1
N
L
(
y
i
,
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
)
\min\limits_{β_m,γ_m}\sum_{i=1}^{N}{L(y_i,\sum_{m=1}^{M}{β_mb(x;γ_m)})}
βm,γmmini=1∑NL(yi,m=1∑Mβmb(x;γm))
那么,我们每步只需要学习其中一个基函数及它的系数,就是说我们每步只需要优化其中一个基函数对应的损失函数:
min
β
,
γ
∑
i
=
1
N
L
(
y
i
,
β
b
(
x
;
γ
)
)
\min\limits_{β,γ}\sum_{i=1}^{N}{L(y_i,βb(x;γ))}
β,γmini=1∑NL(yi,βb(x;γ))
每一步极小化损失函数来得到参数
β
m
,
γ
m
β_m, γ_m
βm,γm,这样子,我们就可以求得整一个模型的总损失。
算法描述的话,是这样子的:
1.初始化
f
0
(
x
)
=
0
f_0(x)=0
f0(x)=0
2.对
m
=
1
,
2
,
.
.
.
,
M
m=1,2,...,M
m=1,2,...,M
极小化损失函数:
(
β
m
,
γ
m
)
=
arg
min
β
,
γ
∑
i
=
1
N
L
(
y
i
,
f
m
−
1
(
x
i
)
+
β
b
(
x
;
γ
)
)
(β_m, γ_m)=\arg\min\limits_{β,γ}\sum_{i=1}^{N}{L(y_i, f_{m-1}(x_i)+βb(x;γ))}
(βm,γm)=argβ,γmini=1∑NL(yi,fm−1(xi)+βb(x;γ))
得到参数
β
m
,
γ
m
β_m, γ_m
βm,γm
更新:
f
m
(
x
)
=
f
m
−
1
(
x
)
+
β
m
b
(
x
;
γ
m
)
f_m(x)=f_{m-1}(x)+β_mb(x;γ_m)
fm(x)=fm−1(x)+βmb(x;γm)
3.得到加法模型
f
(
x
)
=
f
M
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
f(x)=f_M(x)=\sum_{m=1}^{M}β_mb(x;γ_m)
f(x)=fM(x)=m=1∑Mβmb(x;γm)
以AdaBoost为例:
f
(
x
)
=
∑
m
=
1
M
α
m
G
m
(
x
)
f(x)=\sum_{m=1}^{M}{α_mG_m(x)}
f(x)=m=1∑MαmGm(x)
分类器为基本分类器
G
m
(
x
)
G_m(x)
Gm(x),系数是
α
m
α_m
αm。当损失函数是指数损失函数时:
L
(
y
,
f
(
x
)
)
=
e
x
p
[
−
y
f
(
x
)
]
L(y, f(x))=exp[-yf(x)]
L(y,f(x))=exp[−yf(x)]
当经过m-1轮迭代得到
f
(
m
−
1
)
(
x
)
f_(m-1)(x)
f(m−1)(x),第m轮迭代得到
f
m
(
x
)
=
f
m
−
1
(
x
)
+
α
m
G
m
(
x
)
f_m(x)=f_{m-1}(x)+α_mG_m(x)
fm(x)=fm−1(x)+αmGm(x)
目标是选择
(
α
m
,
G
m
)
(α_m, G_m)
(αm,Gm)使损失函数最小
(
α
m
,
G
m
)
=
arg
min
α
,
G
∑
i
=
1
N
e
x
p
[
−
y
i
(
f
m
−
1
(
x
i
)
+
α
G
(
x
i
)
]
(α_m, G_m)=\arg\min\limits_{α,G}\sum_{i=1}^{N}{exp[-y_i(f_{m-1}(x_i)+αG(x_i)]}
(αm,Gm)=argα,Gmini=1∑Nexp[−yi(fm−1(xi)+αG(xi)]
它可以表示为:
(
α
m
,
G
m
)
=
arg
min
α
,
G
∑
i
=
1
N
w
‾
m
i
e
x
p
[
−
y
i
α
G
(
x
i
)
]
(α_m, G_m)=\arg\min\limits_{α,G}\sum_{i=1}^{N}{\overline{w}_{mi}exp[-y_iαG(x_i)]}
(αm,Gm)=argα,Gmini=1∑Nwmiexp[−yiαG(xi)]
其中
w
‾
m
i
=
e
x
p
[
−
y
i
f
m
−
1
(
x
i
)
]
\overline{w}_{mi}=exp[-y_if_{m-1}(x_i)]
wmi=exp[−yifm−1(xi)],不依赖于α和G,所以与最小化无关,
我们要求
(
α
m
,
G
m
)
(α_m, G_m)
(αm,Gm),只要使
e
x
p
[
−
y
i
α
G
(
x
i
)
]
exp[-y_iαG(x_i)]
exp[−yiαG(xi)]最小化即可。
而
G
m
(
x
)
=
arg
min
G
∑
i
=
1
N
w
‾
m
i
I
(
y
i
≠
G
(
x
i
)
)
G_m(x)=\arg\min\limits_{G}\sum_{i=1}^{N}\overline{w}_{mi}I(y_i≠G(x_i))
Gm(x)=argGmini=1∑NwmiI(yi̸=G(xi))
之后,我们求
α
m
α_m
αm
∑
i
=
1
N
w
‾
m
i
e
x
p
[
−
y
i
α
G
(
x
i
)
]
\sum_{i=1}^{N}{\overline{w}_{mi}exp[-y_iαG(x_i)]}
i=1∑Nwmiexp[−yiαG(xi)]
=
∑
y
i
=
G
m
(
x
i
)
w
‾
m
i
e
−
α
+
∑
y
i
≠
G
m
(
x
i
)
w
‾
m
i
e
α
=\sum_{y_i=G_m(x_i)}{\overline{w}_{mi}e^{-α}}+\sum_{y_i≠G_m(x_i)}{\overline{w}_{mi}e^{α}}
=yi=Gm(xi)∑wmie−α+yi̸=Gm(xi)∑wmieα
=
(
e
α
−
e
−
α
)
∑
i
=
1
N
w
‾
m
i
I
(
y
i
≠
G
(
x
i
)
)
+
e
−
α
∑
i
=
1
N
w
‾
m
i
=(e^α-e^{-α})\sum_{i=1}^{N}\overline{w}_{mi}I(y_i≠G(x_i))+e^{-α}\sum_{i=1}^{N}\overline{w}_{mi}
=(eα−e−α)i=1∑NwmiI(yi̸=G(xi))+e−αi=1∑Nwmi
=
(
e
α
−
e
−
α
)
G
m
(
x
)
+
e
−
α
∑
i
=
1
N
w
‾
m
i
=(e^α-e^{-α})G_m(x)+e^{-α}\sum_{i=1}^{N}\overline{w}_{mi}
=(eα−e−α)Gm(x)+e−αi=1∑Nwmi
此时对
α
m
α_m
αm求导使导数等于0得到:
α
m
=
1
2
l
o
g
1
−
e
m
e
m
α_m=\frac{1}{2}log\frac{1-e_m}{e_m}
αm=21logem1−em
e
m
=
∑
i
=
1
N
w
‾
m
i
I
(
y
i
≠
G
(
x
i
)
)
e_m=\sum_{i=1}^{N}\overline{w}_{mi}I(y_i≠G(x_i))
em=i=1∑NwmiI(yi̸=G(xi))
只要求得
G
m
G_m
Gm
α
m
α_m
αm就可以得到每一轮的基函数了,然后得到每一轮权值的更新。
提升树
当基函数是树模型的时候,我们可以简单的归纳如下:
树模型表示为:
T
(
x
,
Θ
)
=
∑
j
=
1
J
c
j
I
(
x
∈
R
j
)
T(x,Θ)=\sum_{j=1}^{J}{c_jI(x∈R_j)}
T(x,Θ)=j=1∑JcjI(x∈Rj)
其中,
c
j
c_j
cj是某个叶子节点的输出值(常量),
R
j
R_j
Rj表示的是第j个叶子节点。
回归问题提升树使用前向分步算法:
f
0
(
x
)
=
0
f
m
(
x
)
=
f
m
−
1
(
x
)
+
T
(
x
;
Θ
m
)
,
m
=
1
,
2
,
.
.
.
,
M
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
Θ
m
)
\begin{aligned} f_0(x)&=0\\ f_m(x)&=f_{m-1}(x)+T(x;Θ_m), m=1,2,...,M\\ f_M(x)&=\sum_{m=1}^{M}T(x;Θ_m) \end{aligned}
f0(x)fm(x)fM(x)=0=fm−1(x)+T(x;Θm),m=1,2,...,M=m=1∑MT(x;Θm)
第m步的最小损失为:
Θ
^
m
=
arg
min
Θ
m
∑
i
=
1
N
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
;
Θ
m
)
)
\hat{Θ}_m=\arg\min\limits_{Θ_m}\sum_{i=1}^{N}L(y_i,f_{m-1}(x_i)+T(x_i;Θ_m))
Θ^m=argΘmmini=1∑NL(yi,fm−1(xi)+T(xi;Θm))
得到
Θ
^
m
\hat{Θ}_m
Θ^m,即第m棵树的参数。
采取平方损失时,
L
(
y
,
f
(
x
)
)
=
(
y
−
f
(
x
)
)
2
L(y, f(x))=(y-f(x))^2
L(y,f(x))=(y−f(x))2
其损失变为
L
(
y
,
f
m
−
1
(
x
)
+
T
(
x
;
Θ
m
)
)
=
[
y
−
f
m
−
1
(
x
)
−
T
(
x
;
Θ
m
)
]
2
=
[
r
−
T
(
x
;
Θ
m
)
]
2
\begin{aligned} &L(y,f_{m-1}(x)+T(x;Θ_m))\\ &=[y-f_{m-1}(x)-T(x;Θ_m)]^2 &=[r-T(x;Θ_m)]^2 \end{aligned}
L(y,fm−1(x)+T(x;Θm))=[y−fm−1(x)−T(x;Θm)]2=[r−T(x;Θm)]2
这里
r
=
y
−
f
m
−
1
(
x
)
r=y-f_{m-1}(x)
r=y−fm−1(x)
是当前模型拟合数据的残差(residual),所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。
学习到第m棵树的残差为
r
m
r_m
rm之后,更新:
f
m
(
x
)
=
f
m
−
1
(
x
)
+
T
(
x
;
Θ
m
)
f_m(x)=f_{m-1}(x)+T(x;Θ_m)
fm(x)=fm−1(x)+T(x;Θm)
即得到回归问题提升树
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
;
Θ
m
)
f_M(x)=\sum_{m=1}^{M}T(x;Θ_m)
fM(x)=m=1∑MT(x;Θm)
梯度提升登场
那么,如果损失函数不是指数损失和平方损失呢,如果损失函数是一般函数的时候,问题就没这么简单了。怎么办!这时候,梯度提升登场。
它的关键是利用损失函数的负梯度在当前模型的值
−
[
∂
L
(
y
i
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
-[\frac{∂L(y_i,f(x_i))}{∂f(x_i)}]_{f(x)=f_{m-1}(x)}
−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
算法:
输入:训练数据集T,损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))
输出:回归树
f
^
(
x
)
\hat{f}(x)
f^(x)
(1)初始化
f
0
(
x
)
=
arg
min
c
∑
i
=
1
N
L
(
y
i
,
c
)
f_0(x)=\arg\min\limits_{c}\sum_{i=1}^{N}L(y_i,c)
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}=-[\frac{∂L(y_i,f(x_i))}{∂f(x_i)}]_{f(x)=f_{m-1}(x)}
rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
(b)对
r
m
i
r_mi
rmi拟合一个回归树,得到第m棵树的叶节点区域R_mj, 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\min\limits_{c}\sum_{x_i∈R_{mj}}{L(y_i, f_{m-1}(x_i)+c)}
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(x)=f_{m-1}(x)+\sum_{j=1}^{J}{c_{mj}I(x∈R_{mj})}
fm(x)=fm−1(x)+∑j=1JcmjI(x∈Rmj)
(3)得到回归树
f
^
(
x
)
=
f
M
(
x
)
=
∑
m
=
1
M
∑
j
=
1
J
c
m
j
I
(
x
∈
R
m
j
)
\hat{f}(x)=f_M(x)=\sum_{m=1}^{M}\sum_{j=1}^{J}c_{mj}I(x∈R_{mj})
f^(x)=fM(x)=m=1∑Mj=1∑JcmjI(x∈Rmj)
至于梯度提升的妙处,就留到讲xgboost的时候再做对比吧。