XGBoost介绍
一.决策树
If-Else规则的集合,将样本递归地划分到对应的子空间,实现样本的分类。
二.信息增益和信息增益比
-
熵:
H ( X ) = − ∑ i = 1 n p i log p i H(X)=-\sum_{i=1}^np_i\log p_i H(X)=−i=1∑npilogpi -
信息增益:
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)H ( D ∣ A ) = ∑ i = 1 ∣ A ∣ ∣ D i ∣ ∣ D ∣ H ( D i ) H(D|A)=\sum_{i=1}^{|A|}\frac{|D_i|}{|D|}H(D_i) H(D∣A)=i=1∑∣A∣∣D∣∣Di∣H(Di)
-
信息增益比
g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D,A)=\frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ log 2 ∣ D i ∣ ∣ D ∣ H_A(D)=-\sum_{i=1}^n\frac{|D_i|}{|D|}\log_2\frac{|D_i|}{|D|} HA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
-
ID3算法和C4.5算法
大同小异,使用的特征选择算法不同而已
三.剪枝
剪枝是通过对损失函数或代价函数进行极小化来实现的。因此,为了实现简化树结构,必须增加对树结构的惩罚项。
C
α
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
C_\alpha(T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T|
Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣
C α ( T ) = C ( T ) + α ∣ T ∣ C_\alpha(T)=C(T)+\alpha|T| Cα(T)=C(T)+α∣T∣
从模型复杂度与预测正确性之间做出折中。
剪枝条件: C α ( T A ) ≤ C α ( T B ) C_\alpha(T_A)\leq C_\alpha(T_B) Cα(TA)≤Cα(TB) (After, Before)
四.CART算法
classification and regression tree.
回归树
回归树模型可表示为:
f
(
x
)
=
∑
m
=
1
M
c
m
I
(
x
∈
R
m
)
f(x)=\sum_{m=1}^Mc_mI(x\in R_m)
f(x)=m=1∑McmI(x∈Rm)
用平方误差作为回归树对训练数据的预测误差:
∑
x
i
∈
R
m
(
y
i
−
f
(
x
i
)
)
2
\sum_{x_i\in R_m}(y_i-f(x_i))^2
xi∈Rm∑(yi−f(xi))2
切分点确定:
遍历切分点(j, s),最优化:
min
j
,
s
[
min
c
1
∑
x
i
∈
R
1
(
j
,
s
)
(
y
i
−
c
1
)
2
+
min
c
2
∑
x
i
∈
R
2
(
j
,
s
)
(
y
i
−
c
2
)
2
]
\min_{j,s} \left[ \min_{c_1}\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2+ \min_{c_2}\sum_{x_i\in R_2(j,s)}(y_i-c_2)^2 \right]
j,smin⎣⎡c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2⎦⎤
其中j
为属性,s
为属性的切分点。
分类树
特征选择:基尼指数
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
仍然是每一特征切为二类,寻找最优切分点:
G
i
n
i
(
D
,
A
)
=
∣
D
1
∣
∣
D
∣
G
i
n
i
(
D
1
)
+
∣
D
2
∣
∣
D
∣
G
i
n
i
(
D
2
)
Gini(D,A)= \frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2)
Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
CART 剪枝
对CART树而言,其模型代价函数仍可以用:
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_\alpha(T)=C(T)+\alpha|T|
Cα(T)=C(T)+α∣T∣
来表示。那么对于书中的某一结点t,以t为单节点树的损失函数为:
C
α
(
t
)
=
C
(
t
)
+
α
C_\alpha(t)=C(t)+\alpha
Cα(t)=C(t)+α
以t为根节点的模型子树Tt的损失函数为:
C
α
(
T
t
)
=
C
(
T
t
)
+
α
∣
T
t
∣
C_\alpha(T_t)=C(T_t)+\alpha|T_t|
Cα(Tt)=C(Tt)+α∣Tt∣
当
α
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
\alpha=\frac{C(t)-C(T_t)}{|T_t|-1}
α=∣Tt∣−1C(t)−C(Tt),剪枝与不剪枝的损失函数相等,根据奥卡姆剃刀原理,此时倾向于剪枝。
其实,CART剪枝的核心思想就是根据树的内部节点t,计算:
g
(
t
)
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}
g(t)=∣Tt∣−1C(t)−C(Tt)
根据计算得来的各个g值,选择不同的
α
\alpha
α值,对树进行剪枝。最后运用交叉验证方法选择最优的子树。
五.前向分步算法
前向分步算法可用加法模型进行表示:
f
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
,
γ
m
)
f(x)=\sum_{m=1}^M\beta_mb(x,\gamma_m)
f(x)=m=1∑Mβmb(x,γm)
在第m步,优化目标为:
(
β
m
,
γ
m
)
=
arg
min
β
,
γ
∑
i
=
1
N
L
(
y
i
,
f
m
−
1
(
x
i
)
+
β
b
(
x
i
;
γ
)
)
(\beta_m, \gamma_m)=\arg\min_{\beta, \gamma}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma))
(βm,γm)=argβ,γmini=1∑NL(yi,fm−1(xi)+βb(xi;γ))
提升树模型
f M ( x ) = ∑ m = 1 M T ( x , Θ m ) f_M(x)=\sum_{m=1}^MT(x,\Theta_m) fM(x)=m=1∑MT(x,Θm)
当使用平方损失函数时,在第m步:
L
(
y
,
f
m
(
x
)
)
=
L
(
y
,
f
m
−
1
(
x
)
+
T
(
x
;
Θ
m
)
)
=
[
y
−
f
m
−
1
(
x
)
−
T
(
x
;
Θ
m
)
]
2
let
r
=
y
−
f
m
−
1
(
x
)
=
[
r
−
T
(
x
;
Θ
m
)
]
2
\begin{matrix}\\ L(y,f_m(x))&=&L(y,f_{m-1}(x)+T(x;\Theta_m))\\ &=&[y-f_{m-1}(x)-T(x;\Theta_m)]^2\\ \text{let }r=y-f_{m-1}(x)\\ &=&[r-T(x;\Theta_m)]^2 \end{matrix}
L(y,fm(x))let r=y−fm−1(x)===L(y,fm−1(x)+T(x;Θm))[y−fm−1(x)−T(x;Θm)]2[r−T(x;Θm)]2
可以看出,第m步其实仅对前m-1个弱分类器预测给出的残差做了拟合。
梯度提升树模型
但是,当损失函数不为平方损失时,
T
(
x
;
Θ
m
)
T(x;\Theta_m)
T(x;Θm)就不能简单地对残差进行拟合。为此,Freidman提出梯度提升树算法:
r
m
=
−
[
∂
L
(
y
i
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
r_m=- \left[ \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]_{f(x)=f_{m-1}(x)}
rm=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
用第m个CART树对残差进行拟合。
六.XGBoost算法
对于一个给定的数据集(n rows, m features)
D
=
{
(
x
i
,
y
i
)
}
(
∣
D
∣
=
n
,
x
i
∈
R
m
,
y
i
∈
R
)
\mathcal D=\{(x_i,y_i)\}(|\mathcal D|=n, x_i\in \mathcal R^m, y_i\in R)
D={(xi,yi)}(∣D∣=n,xi∈Rm,yi∈R), 集成树模型使用K个加法模型预测最终的输出:
y
^
i
=
ϕ
(
X
i
)
=
∑
k
=
1
K
f
k
(
X
i
)
,
f
k
∈
F
\hat y_i = \phi(X_i)=\sum_{k=1}^Kf_k(X_i), f_k\in\mathcal F
y^i=ϕ(Xi)=k=1∑Kfk(Xi),fk∈F
在这里,
F
=
{
f
(
X
)
=
ω
q
(
X
)
}
(
q
:
R
m
→
T
,
ω
∈
R
T
)
\mathcal F=\{f(X)=\omega_q(X)\}(q:\mathcal R^m\rightarrow T,\omega\in \mathcal R^T )
F={f(X)=ωq(X)}(q:Rm→T,ω∈RT)代表回归树的空间。
q
\mathcal q
q即代表着将样本划分到对应叶子节点的树结构;T为树的叶子节点数目。每一
f
k
f_k
fk代表着独立的一颗树的结构以及权重。与决策树不同的是,回归树的每一叶子节点上包含一个连续的打分,即第
i
i
i个叶子结点的打分为
ω
i
\omega_i
ωi。
因此在Xgboost中,通过将样本在对应叶子节点上的权值累加起来,最终给出分类结果。
XGBoost的算法过程其实就是前向分布算法的过程,不过XGBoost提出了新的损失函数:
L
(
ϕ
)
=
∑
i
l
(
y
^
i
,
y
i
)
+
∑
k
Ω
(
f
k
)
w
h
e
r
e
Ω
(
f
)
=
γ
T
+
1
2
λ
∣
∣
ω
∣
∣
2
L(\phi)=\sum_il(\hat y_i, y_i)+\sum_k\Omega(f_k)\\ where\ \Omega(f)=\gamma T+\frac12\lambda||\omega||^2
L(ϕ)=i∑l(y^i,yi)+k∑Ω(fk)where Ω(f)=γT+21λ∣∣ω∣∣2
将损失函数展开:
L
t
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
t
−
1
+
f
t
(
X
i
)
)
+
Ω
(
f
t
)
\mathcal L^{t}=\sum_{i=1}^nl(y_i,\hat y_i^{t-1}+f_t(X_i))+\Omega(f_t)
Lt=i=1∑nl(yi,y^it−1+ft(Xi))+Ω(ft)
根据泰勒展开:
f
(
x
+
Δ
x
)
=
f
(
x
)
+
f
′
(
x
)
1
!
Δ
x
+
f
′
′
(
x
)
2
!
Δ
x
2
+
O
(
Δ
x
3
)
f(x+\Delta x)=f(x)+\frac{f'(x)}{1!}\Delta x+\frac{f''(x)}{2!}\Delta x^2+O(\Delta x^3)
f(x+Δx)=f(x)+1!f′(x)Δx+2!f′′(x)Δx2+O(Δx3)
令
Δ
x
=
f
t
(
X
i
)
\Delta x=f_t(X_i)
Δx=ft(Xi),利用二阶展开,利用前t-1
步得到的模型给出的损失对第t步的损失进行逼近,得到:
L
t
≈
∑
i
=
1
n
[
l
(
y
i
,
y
^
i
t
−
1
)
+
g
i
f
t
(
X
i
)
+
1
2
h
i
f
t
2
(
X
i
)
]
+
Ω
(
f
t
)
\mathcal L^{t}\approx\sum_{i=1}^n[l(y_i,\hat y_i^{t-1})+g_if_t(X_i)+\frac12h_if_t^2(X_i)]+\Omega(f_t)
Lt≈i=1∑n[l(yi,y^it−1)+gift(Xi)+21hift2(Xi)]+Ω(ft)
舍弃常数项,展开正则项:
L
~
t
=
∑
i
=
1
n
[
g
i
f
t
(
X
i
)
+
1
2
h
i
f
t
2
(
X
i
)
]
+
γ
T
+
1
2
λ
∑
j
=
1
T
ω
j
2
\tilde{\mathcal L}^t=\sum_{i=1}^n [ g_if_t(X_i)+ \frac12h_if_t^2(X_i) ]+ \gamma T+\frac12\lambda\sum_{j=1}^T\omega_j^2\\
L~t=i=1∑n[gift(Xi)+21hift2(Xi)]+γT+21λj=1∑Tωj2
将损失函数展开到叶子节点上,令
I
j
=
{
i
∣
q
(
X
i
)
=
j
}
I_j=\{i|q(X_i)=j\}
Ij={i∣q(Xi)=j}:
L
~
t
=
∑
j
=
1
T
[
(
∑
i
∈
I
j
g
i
)
w
j
+
1
2
(
∑
i
∈
I
j
h
i
+
λ
)
w
j
2
]
+
γ
T
\tilde{\mathcal L}^t=\sum_{j=1}^T [ (\sum_{i\in I_j}g_i)w_j+ \frac12(\sum_{i\in I_j}h_i+\lambda)w_j^2 ]+\gamma T
L~t=j=1∑T[(i∈Ij∑gi)wj+21(i∈Ij∑hi+λ)wj2]+γT
令
G
j
=
∑
i
∈
I
j
g
i
,
H
j
=
∑
i
∈
I
j
h
i
G_j=\sum_{i\in I_j}g_i, H_j=\sum_{i\in I_j}h_i
Gj=∑i∈Ijgi,Hj=∑i∈Ijhi,对以上损失函数进行求导,在导数为零时得到损失函数极小值,求得最优权值为:
ω
j
∗
=
−
G
j
H
j
+
λ
\omega_j^*=-\frac{G_j}{H_j+\lambda}
ωj∗=−Hj+λGj
将求得的权值代入损失函数:
L
~
t
(
q
)
=
−
1
2
∑
j
=
1
T
G
j
2
H
j
+
λ
+
γ
T
\tilde{\mathcal L}^t(q)=-\frac12\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\gamma T
L~t(q)=−21j=1∑THj+λGj2+γT
所以XGBoost的切分点是通过求使得损失函数下降最大的位置得来的:
L
s
p
l
i
t
=
1
2
[
G
L
2
H
L
+
λ
+
G
R
2
H
R
+
λ
−
G
I
2
H
I
+
λ
]
−
γ
\mathcal L_{split}=\frac12 \left[ \frac{G_L^2}{H_L+\lambda}+ \frac{G_R^2}{H_R+\lambda}- \frac{G_I^2}{H_I+\lambda} \right]-\gamma
Lsplit=21[HL+λGL2+HR+λGR2−HI+λGI2]−γ