目录
1.XGBoost与GBDT的不同点
(1)GBDT只支持CART决策树,XGBoost支持其他学习器。
(2)XGBoost的损失函数相当于GBDT加正则化项。
(3)GBDT只对误差部分的负梯度(一阶泰勒展开)拟合,二XGBoost对误差部分进行二阶泰勒展开,拟合更准确。
(4)缺失值的处理不同。
2.XGBoost损失函数推导与优化
GBDT的损失函数为:
L
t
=
∑
i
=
1
m
L
(
y
i
,
f
t
−
1
(
x
i
)
+
h
t
(
x
i
)
)
L_{t}=\sum_{i=1}^{m}L(y_{i},f_{t-1}(x_{i})+h_{t}(x_{i}))
Lt=i=1∑mL(yi,ft−1(xi)+ht(xi))
XGBoost的损失函数相当于GBDT的损失加上了正则化项:
L
t
=
∑
i
=
1
m
L
(
y
i
,
f
t
−
1
(
x
i
)
+
h
t
(
x
i
)
)
+
Ω
(
h
t
(
x
i
)
)
=
∑
i
=
1
m
L
(
y
i
,
f
t
−
1
(
x
i
)
+
h
t
(
x
i
)
)
+
γ
J
+
λ
2
∑
j
=
1
J
w
t
,
j
2
\begin{aligned} L_{t}=&\sum_{i=1}^{m}L(y_{i},f_{t-1}(x_{i})+h_{t}(x_{i}))+\Omega(h_{t}(x_{i})) \\ &= \sum_{i=1}^{m}L(y_{i},f_{t-1}(x_{i})+h_{t}(x_{i}))+\gamma J+\frac{\lambda }{2}\sum_{j=1}^{J}w_{t,j}^{2} \end{aligned}
Lt=i=1∑mL(yi,ft−1(xi)+ht(xi))+Ω(ht(xi))=i=1∑mL(yi,ft−1(xi)+ht(xi))+γJ+2λj=1∑Jwt,j2
其中,
γ
,
λ
\gamma ,\lambda
γ,λ为正则化系数,
J
J
J为叶节点个数,
w
t
,
j
w_{t,j}
wt,j就是GBDT中的
c
t
,
j
c_{t,j}
ct,j,为叶节点区域
R
t
,
j
R_{t,j}
Rt,j的最佳拟合值。
根据二阶泰勒展开式:
f
(
x
+
Δ
x
)
≈
f
(
x
)
+
f
′
(
x
)
Δ
x
+
1
2
f
′
′
(
x
)
Δ
x
2
f(x+\Delta x)\approx f(x)+f^{'}(x)\Delta x+\frac{1}{2}f^{''}(x)\Delta x^{2}
f(x+Δx)≈f(x)+f′(x)Δx+21f′′(x)Δx2
XGBoost的损失函数可以展开为:
L
t
≈
∑
i
=
1
m
[
L
(
y
i
,
f
t
−
1
(
x
i
)
)
+
∂
L
(
y
i
,
f
t
−
1
(
x
i
)
)
∂
f
t
−
1
(
x
i
)
h
t
(
x
i
)
+
1
2
∂
2
L
(
y
i
,
f
t
−
1
(
x
i
)
)
∂
2
f
t
−
1
(
x
i
)
h
t
2
(
x
i
)
]
+
γ
J
+
λ
2
∑
j
=
1
J
w
t
,
j
2
L_{t}\approx \sum _{i=1}^{m}[L(y_{i},f_{t-1}(x_{i}))+\frac{\partial L(y_{i},f_{t-1}(x_{i}))}{\partial f_{t-1}(x_{i})}h_{t}(x_{i})+\frac{1}{2}\frac{\partial^2 L(y_{i},f_{t-1}(x_{i}))}{\partial^2 f_{t-1}(x_{i})}h_{t}^{2}(x_{i})]+\gamma J+\frac{\lambda }{2}\sum_{j=1}^{J}w_{t,j}^{2}
Lt≈i=1∑m[L(yi,ft−1(xi))+∂ft−1(xi)∂L(yi,ft−1(xi))ht(xi)+21∂2ft−1(xi)∂2L(yi,ft−1(xi))ht2(xi)]+γJ+2λj=1∑Jwt,j2
为了方便计算,将第
i
i
i个样本在第
t
t
t轮学习中的一阶导和二阶导分别记作:
g
t
,
i
=
∂
L
(
y
i
,
f
t
−
1
(
x
i
)
)
∂
f
t
−
1
(
x
i
)
h
t
,
i
=
∂
2
L
(
y
i
,
f
t
−
1
(
x
i
)
)
∂
2
f
t
−
1
(
x
i
)
g_{t,i}=\frac{\partial L(y_{i},f_{t-1}(x_{i}))}{\partial f_{t-1}(x_{i})}\\ h_{t,i}=\frac{\partial^2 L(y_{i},f_{t-1}(x_{i}))}{\partial^2 f_{t-1}(x_{i})}
gt,i=∂ft−1(xi)∂L(yi,ft−1(xi))ht,i=∂2ft−1(xi)∂2L(yi,ft−1(xi))
损失函数更新为:
L
t
≈
∑
i
=
1
m
[
L
(
y
i
,
f
t
−
1
(
x
i
)
)
+
g
t
,
i
h
t
(
x
i
)
+
1
2
h
t
,
i
h
t
2
(
x
i
)
]
+
γ
J
+
λ
2
∑
j
=
1
J
w
t
,
j
2
L_{t}\approx \sum _{i=1}^{m}[L(y_{i},f_{t-1}(x_{i}))+g_{t,i}h_{t}(x_{i})+\frac{1}{2}h_{t,i}h_{t}^{2}(x_{i})]+\gamma J+\frac{\lambda }{2}\sum_{j=1}^{J}w_{t,j}^{2}
Lt≈i=1∑m[L(yi,ft−1(xi))+gt,iht(xi)+21ht,iht2(xi)]+γJ+2λj=1∑Jwt,j2
上式中,
L
(
y
i
,
f
t
−
1
(
x
i
)
)
L(y_{i},f_{t-1}(x_{i}))
L(yi,ft−1(xi))为上一轮的损失,是已知的常数,忽略其对最小化结果不产生影响,因此,上式可继续更新为:
L
t
≈
∑
i
=
1
m
[
g
t
,
i
h
t
(
x
i
)
+
1
2
h
t
,
i
h
t
2
(
x
i
)
]
+
γ
J
+
λ
2
∑
j
=
1
J
w
t
,
j
2
L_{t}\approx \sum _{i=1}^{m}[g_{t,i}h_{t}(x_{i})+\frac{1}{2}h_{t,i}h_{t}^{2}(x_{i})]+\gamma J+\frac{\lambda }{2}\sum_{j=1}^{J}w_{t,j}^{2}
Lt≈i=1∑m[gt,iht(xi)+21ht,iht2(xi)]+γJ+2λj=1∑Jwt,j2
在第
t
t
t轮中,样本
x
i
x_{i}
xi通过弱学习器
h
t
(
x
i
)
h_{t}(x_{i})
ht(xi)被分配到了叶节点
R
t
,
j
R_{t,j}
Rt,j,输出为
w
t
,
j
w_{t,j}
wt,j,因此,可以用
w
t
,
j
w_{t,j}
wt,j代替
h
t
(
x
i
)
h_{t}(x_{i})
ht(xi):
L
t
=
∑
j
=
1
J
[
∑
x
i
∈
R
t
,
j
g
t
,
i
w
t
,
j
+
1
2
∑
x
i
∈
R
t
,
j
h
t
,
i
w
t
,
j
2
]
+
γ
J
+
λ
2
∑
j
=
1
J
w
t
,
j
2
=
∑
j
=
1
J
[
∑
x
i
∈
R
t
,
j
g
t
,
i
w
t
,
j
+
1
2
∑
x
i
∈
R
t
,
j
(
h
t
,
i
+
λ
)
w
t
,
j
2
]
+
γ
J
\begin{aligned} L_{t}&= \sum _{j=1}^{J}[\sum_{x_{i}\in R_{t,j}}g_{t,i}w_{t,j}+\frac{1}{2}\sum_{x_{i}\in R_{t,j}}h_{t,i}w_{t,j}^{2}]+\gamma J+\frac{\lambda }{2}\sum_{j=1}^{J}w_{t,j}^{2}\\ &= \sum _{j=1}^{J}[\sum_{x_{i}\in R_{t,j}}g_{t,i}w_{t,j}+\frac{1}{2}\sum_{x_{i}\in R_{t,j}}(h_{t,i}+\lambda )w_{t,j}^{2}]+\gamma J \end{aligned}
Lt=j=1∑J[xi∈Rt,j∑gt,iwt,j+21xi∈Rt,j∑ht,iwt,j2]+γJ+2λj=1∑Jwt,j2=j=1∑J[xi∈Rt,j∑gt,iwt,j+21xi∈Rt,j∑(ht,i+λ)wt,j2]+γJ
为了方便计算,将第
i
i
i个样本在第
t
t
t轮叶子节点中的一阶导和二阶导分别记作:
G
t
,
i
=
∑
x
i
∈
R
t
,
j
g
t
,
i
H
t
,
i
=
∑
x
i
∈
R
t
,
j
h
t
,
i
G_{t,i}=\sum_{x_{i}\in R_{t,j}}g_{t,i}\\ H_{t,i}=\sum_{x_{i}\in R_{t,j}}h_{t,i}
Gt,i=xi∈Rt,j∑gt,iHt,i=xi∈Rt,j∑ht,i
原式更新为:
L
t
=
∑
j
=
1
J
[
G
t
,
i
w
t
,
j
+
1
2
(
H
t
,
i
+
λ
)
w
t
,
j
2
]
+
γ
J
L_{t}= \sum _{j=1}^{J}[G_{t,i}w_{t,j}+\frac{1}{2}(H_{t,i}+\lambda )w_{t,j}^{2}]+\gamma J
Lt=j=1∑J[Gt,iwt,j+21(Ht,i+λ)wt,j2]+γJ
3.损失函数求解
(1)求业绩点的最佳拟合值 w t , j w_{t,j} wt,j
在GBDT中,叶节点的最佳拟合值
c
t
,
j
c_{t,j}
ct,j需要分两步求出:
先求出
J
J
J个叶子节点,再求出每个叶子节点的最佳拟合值。
由于XGBoost的损失函数中只有
w
t
,
j
w_{t,j}
wt,j一个未知量,因此可以直接求出其拟合值:
∂
L
t
∂
w
t
,
i
=
G
t
,
i
+
(
H
t
,
i
+
λ
)
w
t
,
i
=
0
⇒
w
t
,
i
=
−
G
t
,
i
H
t
,
i
+
λ
\frac{\partial L_{t}}{\partial w_{t,i}}=G_{t,i}+(H_{t,i}+\lambda )w_{t,i}=0\\ \Rightarrow w_{t,i}=-\frac{G_{t,i}}{H_{t,i}+\lambda }
∂wt,i∂Lt=Gt,i+(Ht,i+λ)wt,i=0⇒wt,i=−Ht,i+λGt,i
(2)弱学习器的分裂方式
GBDT中,CART决策树的分裂依据是遍历所有特征的所有分割点,选择方差最小或基尼系数最小的点进行分裂。
XGBoost的分裂依据是选择使损失函数最小的点进行分裂。具体做法是:
首先将
w
t
,
j
w_{t,j}
wt,j的值带入损失函数中可得:
L
t
=
∑
j
=
1
J
[
−
G
t
,
i
2
H
t
,
i
+
λ
+
1
2
G
t
,
i
2
H
t
,
i
+
λ
]
+
γ
J
=
−
1
2
G
t
,
i
2
H
t
,
i
+
λ
+
γ
J
\begin{aligned} L_{t}=&\sum_{j=1}^{J}[-\frac{G_{t,i}^{2}}{H_{t,i}+\lambda }+\frac{1}{2}\frac{G_{t,i}^{2}}{H_{t,i}+\lambda }]+\gamma J \\ &= -\frac{1}{2}\frac{G_{t,i}^{2}}{H_{t,i}+\lambda }+\gamma J \end{aligned}
Lt=j=1∑J[−Ht,i+λGt,i2+21Ht,i+λGt,i2]+γJ=−21Ht,i+λGt,i2+γJ
假如现在依据某个分割点将决策树分割为左右子树,则分裂后的损失为:
−
(
1
2
G
L
2
H
L
+
λ
+
1
2
G
R
2
H
R
+
λ
)
+
γ
(
J
+
1
)
-(\frac{1}{2}\frac{G_{L}^{2}}{H_{L}+\lambda }+\frac{1}{2}\frac{G_{R}^{2}}{H_{R}+\lambda })+\gamma (J+1)
−(21HL+λGL2+21HR+λGR2)+γ(J+1)
未分裂时的损失为:
−
1
2
(
G
L
+
G
R
)
2
H
L
+
H
R
+
λ
+
γ
J
-\frac{1}{2}\frac{(G_{L}+G_{R})^{2}}{H_{L}+H_{R}+\lambda}+\gamma J
−21HL+HR+λ(GL+GR)2+γJ
未分裂的损失减去分裂后的损失,可得分裂后损失减少值:
−
1
2
(
G
L
+
G
R
)
2
H
L
+
H
R
+
λ
+
γ
J
+
1
2
G
L
2
H
L
+
λ
+
1
2
G
R
2
H
R
+
λ
−
γ
(
J
+
1
)
-\frac{1}{2}\frac{(G_{L}+G_{R})^{2}}{H_{L}+H_{R}+\lambda}+\gamma J+\frac{1}{2}\frac{G_{L}^{2}}{H_{L}+\lambda }+\frac{1}{2}\frac{G_{R}^{2}}{H_{R}+\lambda }-\gamma (J+1)
−21HL+HR+λ(GL+GR)2+γJ+21HL+λGL2+21HR+λGR2−γ(J+1)
要使分裂后的损失函数最小,即要使损失函数的减少值最大,也就是说要最大化上式。
合并同类项后,最终分裂依据为最大化下式:
1
2
G
L
2
H
L
+
λ
+
1
2
G
R
2
H
R
+
λ
−
1
2
(
G
L
+
G
R
)
2
H
L
+
H
R
+
λ
−
γ
\frac{1}{2}\frac{G_{L}^{2}}{H_{L}+\lambda }+\frac{1}{2}\frac{G_{R}^{2}}{H_{R}+\lambda }-\frac{1}{2}\frac{(G_{L}+G_{R})^{2}}{H_{L}+H_{R}+\lambda}-\gamma
21HL+λGL2+21HR+λGR2−21HL+HR+λ(GL+GR)2−γ
4.XGBoost算法流程
输入:数据集,最大迭代次数
T
T
T,损失函数
L
L
L,正则化系数
γ
,
λ
\gamma ,\lambda
γ,λ,弱学习器。
输出:强学习器。
(1)在第
t
t
t轮中,计算第
i
i
i个样本在损失函数
L
t
L_{t}
Lt中关于上一轮强学习器
f
t
−
1
(
x
i
)
f_{t-1}(x_{i})
ft−1(xi)的一阶导和二阶导
g
t
,
i
,
h
t
,
i
g_{t,i},h_{t,i}
gt,i,ht,i;同时,计算样本对应的叶子节点的一阶导和二阶导
G
t
,
i
,
H
t
,
i
G_{t,i},H_{t,i}
Gt,i,Ht,i。
(2)将样本按特征从小到大排列,依次计算当前样本放入左子树后,分裂后的损失和未分裂时的损失,选择最大化损失函数减少值的点进行分裂:
max
1
2
G
L
2
H
L
+
λ
+
1
2
G
R
2
H
R
+
λ
−
1
2
(
G
L
+
G
R
)
2
H
L
+
H
R
+
λ
−
γ
\max\frac{1}{2}\frac{G_{L}^{2}}{H_{L}+\lambda }+\frac{1}{2}\frac{G_{R}^{2}}{H_{R}+\lambda }-\frac{1}{2}\frac{(G_{L}+G_{R})^{2}}{H_{L}+H_{R}+\lambda}-\gamma
max21HL+λGL2+21HR+λGR2−21HL+HR+λ(GL+GR)2−γ
(3)如果分裂后值为
0
0
0,计算所有叶子节点区域的拟合值
w
t
,
j
w_{t,j}
wt,j,得到弱学习器
h
t
(
x
)
h_{t}(x)
ht(x),强学习器
f
t
(
x
)
f_{t}(x)
ft(x);否则,重复以上步骤。
5.XGBoost实现
#基本用法,默认参数
from sklearn import datasets,model_selection,metrics
from xgboost import XGBClassifier
digits=datasets.load_digits()
x,y=digits.data,digits.target
x_train,x_test,y_train,y_test=model_selection.train_test_split(x,y)
model=XGBClassifier()
model.fit(x_train,y_train)
y_pred=model.predict(x_test)
print(metrics.accuracy_score(y_pred,y_test))
输出:
0.9711111111111111
#网格搜索确定深度和弱学习器个数
cvModel = model_selection.GridSearchCV(XGBClassifier(),{'max_depth': [4,5,6],'n_estimators': [5,10,20]},
cv=5)
cvModel.fit(x_train,y_train)
print(cvModel.best_score_,cvModel.best_params_)
输出:
0.9532231860112901 {'max_depth': 5, 'n_estimators': 20}