1. 原理
xgboost代表“Extreme Gradient Boosting”,是对gradient boosting的优化,其原理还是基于GradientBoost,他的创新之处在于使用了二阶导数和正则项。xgboost的基学习器为CART。
2.优化函数
xgboost是加法模型,其结果是多个CAET树的结果的和,表示为:
y
i
^
=
∑
k
=
1
K
f
k
(
x
i
)
,
f
k
∈
F
\hat{y_i}=\sum_{k=1}^Kf_k(x_i),f_k\in F
yi^=k=1∑Kfk(xi),fk∈F
要优化的目标函数由下式给出:
o
b
j
(
θ
)
=
∑
i
n
l
(
y
i
,
y
i
^
)
+
∑
k
=
1
K
Ω
(
f
k
)
obj(\theta)=\sum_i^n l(y_i,\hat{y_i})+\sum_{k=1}^K\Omega(f_k)
obj(θ)=i∑nl(yi,yi^)+k=1∑KΩ(fk)
优化函数包含训练损失函数和正则化项.
定义完目标函数,之后训练过程中对目标函数进行优化。
xgboost的原理还是GradientBoost,所以当学习第t棵Cart树时,其目标是对之前学到的模型进行修复,使其更加贴近目标。第t棵树的优化目标为:
o
b
j
(
t
)
=
∑
i
=
1
n
l
(
y
i
,
y
i
(
t
)
^
)
+
∑
i
=
1
t
Ω
(
f
i
)
=
∑
i
=
1
n
l
(
y
i
,
y
i
^
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
obj^{(t)}=\sum_{i=1}^nl(y_i,\hat{y_i^{(t) }}) +\sum_{i=1}^t\Omega(f_i)=\sum_{i=1}^nl(y_i,\hat{y_i}^{(t-1)}+f_t(x_i))+\Omega(f_t)+constant
obj(t)=i=1∑nl(yi,yi(t)^)+i=1∑tΩ(fi)=i=1∑nl(yi,yi^(t−1)+ft(xi))+Ω(ft)+constant
3. 损失函数
损失函数一般使用MSE,所以目标变成了:
o
b
j
(
t
)
=
∑
i
=
1
n
(
y
i
−
(
y
i
^
(
t
−
1
)
)
+
f
t
(
x
i
)
)
2
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
=
∑
i
=
1
n
[
−
2
(
y
i
−
y
i
^
(
t
−
1
)
)
f
t
(
x
i
)
+
f
t
(
x
i
)
2
]
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
obj^{(t)}=\sum_{i=1}^n(y_i-(\hat{y_i}^{(t-1)})+f_t(x_i))^2+\Omega(f_t)+constant=\sum_{i=1}^n[-2(y_i-\hat{y_i}^{(t-1)})f_t(x_i)+f_t(x_i)^2]+\Omega(f_t)+constant
obj(t)=i=1∑n(yi−(yi^(t−1))+ft(xi))2+Ω(ft)+constant=i=1∑n[−2(yi−yi^(t−1))ft(xi)+ft(xi)2]+Ω(ft)+constant
一般情况下,我们将损失函数的泰勒展开到二阶:
o
b
j
(
t
)
=
∑
i
=
1
n
[
l
(
y
i
,
y
i
^
(
t
−
1
)
)
+
g
i
f
t
2
(
x
i
)
+
1
/
2
h
i
f
t
2
(
x
i
)
]
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
obj^{(t)}=\sum_{i=1}^n[l(y_i,\hat {y_i}^{(t-1)})+g_if_t^2(x_i)+1/2h_if_t^2(x_i)]+\Omega(f_t)+constant
obj(t)=i=1∑n[l(yi,yi^(t−1))+gift2(xi)+1/2hift2(xi)]+Ω(ft)+constant
删除常量后可得,
∑
i
=
1
n
[
g
i
f
t
2
(
x
i
)
+
1
/
2
h
i
f
t
2
(
x
i
)
]
+
Ω
(
f
t
)
\sum_{i=1}^n[g_if_t^2(x_i)+1/2h_if_t^2(x_i)]+\Omega(f_t)
i=1∑n[gift2(xi)+1/2hift2(xi)]+Ω(ft)
4. 正则化
正则化的目的是为了预防模型过拟合,一般思路是防止模型参数太多,即,模型太复杂。在本模型中,复杂度包括树的结构以及叶子节点的个数.
首先定义,一棵树有T个叶子节点,这T个叶子节点的值组成了一个T维向量w,q(x)是一个映射,用来将样本映射成1到T的某个值。q(x)其实是CART树的结构,
w
q
(
x
)
w_{q(x)}
wq(x)是这棵树对样本x的预测值。
有了这个定义,xgboost就可以使用如下的正则化项
Ω
(
f
)
=
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
\Omega(f)=\gamma T+\frac{1}{2}\lambda\sum_{j=1}^{T}w_j^2
Ω(f)=γT+21λj=1∑Twj2
这里的
λ
\lambda
λ和
γ
\gamma
γ越大,越希望获得结构简单的树,因此对于相对叶子节点较多的树的惩罚越大。
5.代码
import xgboost as xgb
dtrain = xgb.DMatrix('demo/data/agaricus.txt.train')
dtest = xgb.DMatrix('demo/data/agaricus.txt.test')
param = {'max_depth':2, 'eta':1, 'silent':1, 'objective':'binary:logistic' }
num_round = 2
bst = xgb.train(param, dtrain, num_round)
preds = bst.predict(dtest)