提升算法 是在弱学习器基础上, 根据弱学习器的错误情况,改变接下来的训练样本的重要性权重(分错的权重上升,分对的权重下降),然后使用修改权重后的训练样本生成新的 “个体学习器”,然后再次改变权重,生成新的“个体学习器”。 最后将生成的个体学习器结合在一起,生成最终的集成模型。
对于提升算法,有两个问题是核心:1. 如何改变 训练样本的权重 2. 如何将生成的弱学习器合在一起,形成强学习器。(按照怎样的权重)
AdaBoost
AdaBoost很好的实现了以上两个问题。
分类问题算法
具体算法:
对于二分类的训练数据集
T
=
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
…
,
(
x
N
,
y
N
)
T={ (x_1,y_1), (x_2,y_2),\dots, (x_N,y_N) }
T=(x1,y1),(x2,y2),…,(xN,yN), 其中
x
1
∈
R
n
,
y
i
∈
{
−
1
,
1
}
x_1 \in R^n,y_i \in \{-1,1 \}
x1∈Rn,yi∈{−1,1}, 最终输出 集成分类器
G
(
x
)
G(x)
G(x),每个分类器是
G
m
(
x
)
G_m(x)
Gm(x)。
- 初始化训练数据的权值分布:
D 1 = ( w 1 , 1 , w 1 , 2 , … , w 1 , N ) , w 1 , i = 1 N , i = 1 , 2 , … , N D_1=(w_{1,1},w_{1,2},\dots,w_{1,N}), w_{1,i}=\frac{1}{N}, i= 1,2,\dots,N D1=(w1,1,w1,2,…,w1,N),w1,i=N1,i=1,2,…,N - 对于 m = 1 , 2 , … , M m=1,2,\dots,M m=1,2,…,M
- 使用具有权重分布
D
m
D_m
Dm的训练数据集进行学习,得到第m个基本分类器:
G m ( x ) : X → { − 1 , + 1 } G_m(x):X \rightarrow \{-1,+1\} Gm(x):X→{−1,+1}
注意: 根据权重计算时 主要体现在 信息增益,增益率,基尼系数计算。 - 计算
G
m
(
x
)
G_m(x)
Gm(x)在训练数据集上的 分类错误率:
e m = P ( G m ( x i ) ≠ y i ) = ∑ i = 1 N w m , i I ( G m ( x i ) ≠ y i ) e_m=P( G_m(x_i) \neq y_i )=\sum_{i=1}^N w_{m,i} I( G_m(x_i) \neq y_i ) em=P(Gm(xi)=yi)=i=1∑Nwm,iI(Gm(xi)=yi) - 计算
G
m
(
x
)
G_m(x)
Gm(x)的系数:
α m = 1 2 l o g 1 − e m e m \alpha_m=\frac{1}{2}log \frac{1-e_m}{e_m} αm=21logem1−em
当错误率大于50%,系数为负数;错误率低于50%,系数为正数。 此处对数为自然对数。 - 根据系数
α
\alpha
α更新 训练集的权重:
α m = 1 2 l o g 1 − e m e m \alpha_m = \frac{1}{2} log \frac{1-e_m}{e_m} αm=21logem1−em
系数越大,表示训练准确度越高,数据的权重就会分的越开。 - 然后,我们根据 w m + 1 , i = w m , i Z m e − α m y i G m ( x i ) w_{m+1,i}=\frac{w_{m,i}}{Z_m}e^{-\alpha_m y_i G_m(x_i)} wm+1,i=Zmwm,ie−αmyiGm(xi) 更新权重。
- 最终我们就可以构建出基本分类器的线性组合 f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^M \alpha_m G_m(x) f(x)=∑m=1MαmGm(x)
- 最终的分类器 s i g n ( f ( x ) ) sign(f(x)) sign(f(x))
AdaBoost 原理分析
我们可以认为 AdaBoost 是 加法模型, 损失函数为 指数函数, 学习算法是 前向分步算法的分类算法。
f
(
x
)
=
∑
i
=
1
M
α
m
b
(
x
;
γ
m
)
f(x)=\sum_{i=1}^M \alpha_m b(x;\gamma_m)
f(x)=i=1∑Mαmb(x;γm)
b
(
x
;
γ
m
)
b(x;\gamma_m)
b(x;γm)表示基函数,
γ
m
\gamma_m
γm表示基函数的参数;
α
m
\alpha_m
αm表示基函数的系数。
因此,我们成为了学习:
m
i
n
α
m
;
γ
m
∑
i
=
1
N
L
(
y
i
,
∑
m
=
1
M
α
m
b
(
x
;
γ
m
)
)
min_{\alpha_m;\gamma_m} \sum_{i=1}^N L(y_i, \sum_{m=1}^M \alpha_m b(x; \gamma_m) )
minαm;γmi=1∑NL(yi,m=1∑Mαmb(x;γm))
对于前向学习算法,因为我们学习的是加法模型,所以我们从前到后
m
=
1
,
…
,
M
m=1,\dots,M
m=1,…,M , 每一步都只学习一个基函数和系数,逐渐逼近 目标函数, 从而减少问题的复杂度。 我们每步只需要优化以下损失函数:
m
i
n
α
,
γ
∑
i
=
1
N
L
(
y
i
,
α
b
(
x
i
;
γ
)
)
min_{\alpha,\gamma} \sum_{i=1}^N L(y_i, \alpha b(x_i;\gamma))
minα,γi=1∑NL(yi,αb(xi;γ))
具体来说,就是每次都 极小化损失:
(
α
m
,
γ
m
)
=
a
r
g
m
i
n
α
,
γ
∑
i
=
1
N
L
(
y
i
,
f
m
−
1
(
x
i
)
+
α
b
(
x
i
;
γ
)
)
(\alpha_m,\gamma_m)=arg \ min_{\alpha,\gamma} \sum_{i=1}^N L(y_i, f_{m-1}(x_i)+\alpha b(x_i;\gamma))
(αm,γm)=arg minα,γi=1∑NL(yi,fm−1(xi)+αb(xi;γ))
( α m , γ m ) = a r g m i n α , γ ∑ i = 1 N e − y i f m − 1 ( x i ) e − y i α b ( x i ) = a r g m i n α , γ ∑ i = 1 N w ^ m , i e − y i α b ( x i ) (\alpha_m,\gamma_m)=arg \ min_{\alpha,\gamma} \sum_{i=1}^N e^{- y_i f_{m-1}(x_i)} e^{-y_i \alpha b(x_i)}=arg \ min_{\alpha,\gamma} \sum_{i=1}^N \hat{w}_{m,i} e^{-y_i \alpha b(x_i)} (αm,γm)=arg minα,γi=1∑Ne−yifm−1(xi)e−yiαb(xi)=arg minα,γi=1∑Nw^m,ie−yiαb(xi)
因此在每次,我们只需要求解
α
,
γ
\alpha,\gamma
α,γ就可以了。对于
γ
\gamma
γ的求解,我们可以直接看作求解
b
m
(
x
)
b_m(x)
bm(x)。
b
m
∗
(
x
)
=
a
r
g
m
i
n
b
∗
∑
i
=
1
N
w
^
m
,
i
I
(
y
i
≠
b
(
x
i
)
)
=
e
b^*_m(x)= arg \ min_{b^*} \sum_{i=1}^N \hat{w}_{m,i}I(y_i\neq b(x_i)) =e
bm∗(x)=arg minb∗i=1∑Nw^m,iI(yi=b(xi))=e
其中,
w
^
m
,
i
=
e
−
y
i
f
m
−
1
(
x
i
)
\hat{w}_{m,i}=e^{-y_i f_{m-1}(x_i)}
w^m,i=e−yifm−1(xi)
这就是使错误率
e
m
e_m
em最小对应的模型。
∑
i
=
1
N
w
^
m
,
i
e
−
y
i
α
b
(
x
i
)
=
∑
y
i
=
b
m
(
x
i
)
w
^
m
,
i
e
−
α
+
∑
y
i
≠
b
m
(
x
i
)
w
^
m
,
i
e
α
=
(
1
−
e
m
)
e
−
α
+
e
m
e
α
\sum_{i=1}^N \hat{w}_{m,i} e^{-y_i \alpha b(x_i)}= \sum_{y_i=b_m(x_i)} \hat{w}_{m,i}e^{-\alpha}+\sum_{y_i \neq b_m(x_i)} \hat{w}_{m,i}e^\alpha=(1-e_m)e^{-\alpha}+e_m e^\alpha
∑i=1Nw^m,ie−yiαb(xi)=∑yi=bm(xi)w^m,ie−α+∑yi=bm(xi)w^m,ieα=(1−em)e−α+emeα
将上式对
α
\alpha
α求导,使导数为0,就可以得到
α
=
1
2
l
n
(
1
−
e
m
e
m
)
\alpha=\frac{1}{2}ln(\frac{1-e_m}{e_m})
α=21ln(em1−em)
由
f
m
(
x
)
=
f
m
−
1
(
x
)
+
α
m
b
m
(
x
)
f_m(x)=f_{m-1}(x)+\alpha_m b_m(x)
fm(x)=fm−1(x)+αmbm(x)
以及
w
^
m
+
1
,
i
=
w
^
m
,
i
e
−
y
i
α
m
b
m
(
x
)
\hat{w}_{m+1,i}=\hat{w}_{m,i}e^{-y_i \alpha_m b_m(x)}
w^m+1,i=w^m,ie−yiαmbm(x)
最终,我们证明了
前向分步算法作为学习算法, 指数函数
e
−
y
f
(
x
)
e^{-yf(x)}
e−yf(x)作为损失函数, 加法模型的 算法 就是Ada Boost:
b
m
(
x
)
=
a
r
g
m
i
n
b
m
(
x
)
∑
i
=
1
N
w
^
m
,
i
I
(
y
i
≠
b
m
(
x
)
)
b_m(x)=arg \ min_{b_m(x)} \sum_{i=1}^N \hat{w}_{m,i} I(y_i\neq b_m(x))
bm(x)=arg minbm(x)∑i=1Nw^m,iI(yi=bm(x))
对应的错误率为
e
m
=
∑
i
=
1
N
w
m
,
i
I
(
b
m
(
x
)
≠
y
i
)
e_m = \sum_{i=1}^N w_{m,i}I(b_m(x)\neq y_i)
em=∑i=1Nwm,iI(bm(x)=yi)
从而计算得到 模型系数
α
=
1
2
l
o
g
(
1
−
e
m
e
m
)
\alpha =\frac{1}{2}log(\frac{1-e_m}{e_m})
α=21log(em1−em)
更新 训练样本 权重
w
m
+
1
,
i
=
w
m
,
i
e
−
α
m
y
i
b
m
(
x
i
)
/
Z
m
w_{m+1,i}=w_{m,i}e^{-\alpha_m y_i b_m(x_i)} / Z_m
wm+1,i=wm,ie−αmyibm(xi)/Zm
提升树
Adaboost 只解决了分类问题的提升算法,没有解决回归问题的提升算法。
提升树是指 采用前向分步算法作为学习算法,以加法算法,设定的损失函数(根据自己定义)的提升算法。
如果损失函数是 指数函数,那么 提升树就是 Adaboost。
如果损失函数是 MSE函数,那么 提升树就是 残差树。
残差树算法
f
m
(
x
)
=
f
m
−
1
(
x
)
+
T
(
x
;
θ
)
f_m(x)=f_{m-1}(x)+T(x;\theta)
fm(x)=fm−1(x)+T(x;θ)
在第m步时,我们需要求解
a
r
g
min
θ
∑
i
=
1
N
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
;
θ
)
)
arg \min_{\theta} \sum_{i=1}^N L(y_i, f_{m-1}(x_i)+T(x_i; \theta))
argminθ∑i=1NL(yi,fm−1(xi)+T(xi;θ))
使用MSE损失函数时,
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
;
θ
)
]
2
=
[
r
−
T
(
x
;
θ
)
]
2
L=[y-f_{m-1}(x)-T(x;\theta)]^2=[r-T(x;\theta)]^2
L=[y−fm−1(x)−T(x;θ)]2=[r−T(x;θ)]2
我们在第m步,就将训练样本的
y
i
y_i
yi改成
y
i
−
f
m
−
1
(
x
i
)
y_i-f_{m-1}(x_i)
yi−fm−1(xi). 所有样本的权重都是相同的。
这就是残差树。
GBDT
当损失函数是指数函数,MSE函数时,优化相对简单,分别是Adaboost / 残差树。 但是如果是一般的损失函数,则每一步的优化不是很容易。
有人提出了 梯度提升 gradient boosting 算法, 利用损失函数的负梯度在当前模型的值:
−
[
∂
L
(
y
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
-[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)}
−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)
xgboost
在Xgboost中,我们一方面考虑模型预测与实际值的误差,另一方面考虑正则项,树的复杂度惩罚项
L
=
∑
i
=
1
N
l
(
y
i
,
y
^
i
)
+
∑
k
O
(
f
k
)
L=\sum_{i=1}^N l(y_i,\hat{y}_i)+\sum_{k} \Omicron(f_k)
L=i=1∑Nl(yi,y^i)+k∑O(fk)
前一部分表示每个样本的损失;后一部分表示每个树的复杂度惩罚(正则化项)
我们使用决策树,那么正则化项是叶子节点的个数和叶子节点的分数
O
(
f
)
=
γ
T
+
1
2
λ
∣
ω
∣
2
\Omicron(f)=\gamma T+\frac{1}{2} \lambda |\omega|^2
O(f)=γT+21λ∣ω∣2
我们使用前向分步算法可以得到:
L
=
∑
i
=
1
N
l
(
y
i
,
f
m
−
1
+
f
m
(
x
i
)
)
+
γ
T
+
1
2
∣
ω
∣
2
L=\sum_{i=1}^N l(y_i, f_{m-1}+f_m(x_i))+\gamma T +\frac{1}{2}|\omega|^2
L=i=1∑Nl(yi,fm−1+fm(xi))+γT+21∣ω∣2
L
=
∑
i
=
1
N
[
l
(
y
i
,
f
m
−
1
)
+
g
i
(
y
i
,
f
m
−
1
(
x
i
)
)
f
m
(
x
i
)
+
1
2
h
i
(
y
i
,
f
m
−
1
(
x
i
)
)
f
m
2
(
x
i
)
]
+
γ
T
+
1
2
∣
ω
∣
2
L=\sum_{i=1}^N [l(y_i,f_{m-1})+g_i(y_i,f_{m-1}(x_i))f_m(x_i)+\frac{1}{2}h_i(y_i,f_{m-1}(x_i))f^2_m(x_i)]+\gamma T+\frac{1}{2} |\omega|^2
L=i=1∑N[l(yi,fm−1)+gi(yi,fm−1(xi))fm(xi)+21hi(yi,fm−1(xi))fm2(xi)]+γT+21∣ω∣2
L
=
∑
i
=
1
N
[
g
i
f
m
(
x
i
)
+
1
2
h
i
f
m
2
(
x
i
)
]
+
γ
T
+
1
2
∣
ω
∣
2
L=\sum_{i=1}^N [g_i f_m(x_i)+\frac{1}{2}h_i f^2_m(x_i)]+\gamma T+\frac{1}{2} |\omega|^2
L=i=1∑N[gifm(xi)+21hifm2(xi)]+γT+21∣ω∣2
我们可以将不同子结点的值合在一起,而不是每个样本进行遍历
L
=
∑
j
=
1
T
[
(
∑
i
∈
I
j
g
i
)
w
j
+
1
2
(
∑
i
∈
I
j
h
i
+
λ
)
w
j
2
]
+
γ
T
L=\sum_{j=1}^T[ (\sum_{i \in I_j}g_i)w_j +\frac{1}{2}(\sum_{i\in I_j}h_i +\lambda)w_j^2]+\gamma T
L=j=1∑T[(i∈Ij∑gi)wj+21(i∈Ij∑hi+λ)wj2]+γT
L
=
∑
j
=
1
T
[
G
j
w
j
+
1
2
(
H
j
+
γ
)
w
j
2
]
+
γ
T
L=\sum_{j=1}^T [G_j w_j + \frac{1}{2}(H_j +\gamma)w_j^2]+\gamma T
L=j=1∑T[Gjwj+21(Hj+γ)wj2]+γT
对于
w
w
w进行求导,得到每个叶结点的最优预测分数:
w
j
=
−
G
j
H
j
+
λ
w_j=-\frac{G_j}{H_j+\lambda}
wj=−Hj+λGj
最终得到的目标函数是:
L
=
−
1
2
∑
j
=
1
T
G
j
2
H
j
+
λ
+
λ
T
L=-\frac{1}{2}\sum_{j=1}^T \frac{G_j^2}{H_j+\lambda}+\lambda T
L=−21j=1∑THj+λGj2+λT
此时,我们得到了XGboost的打分函数:
G
a
i
n
=
G
L
2
H
L
+
λ
+
G
R
2
H
R
+
λ
−
(
G
L
+
G
R
)
2
H
L
+
H
R
+
λ
−
λ
Gain=\frac{G_L^2}{H_L+\lambda}+\frac{G_R^2}{H_R+\lambda}-\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}-\lambda
Gain=HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2−λ
我们根据这个函数来对此棵树进行划分。 (XGboost是基于CART树,每次都是二分树)