二十九.集成学习之XGBoost原理和实现

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=1mL(yi,ft1(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=1mL(yi,ft1(xi)+ht(xi))+Ω(ht(xi))=i=1mL(yi,ft1(xi)+ht(xi))+γJ+2λj=1Jwt,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} Lti=1m[L(yi,ft1(xi))+ft1(xi)L(yi,ft1(xi))ht(xi)+212ft1(xi)2L(yi,ft1(xi))ht2(xi)]+γJ+2λj=1Jwt,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=ft1(xi)L(yi,ft1(xi))ht,i=2ft1(xi)2L(yi,ft1(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} Lti=1m[L(yi,ft1(xi))+gt,iht(xi)+21ht,iht2(xi)]+γJ+2λj=1Jwt,j2
上式中, L ( y i , f t − 1 ( x i ) ) L(y_{i},f_{t-1}(x_{i})) L(yi,ft1(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} Lti=1m[gt,iht(xi)+21ht,iht2(xi)]+γJ+2λj=1Jwt,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=1J[xiRt,jgt,iwt,j+21xiRt,jht,iwt,j2]+γJ+2λj=1Jwt,j2=j=1J[xiRt,jgt,iwt,j+21xiRt,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=xiRt,jgt,iHt,i=xiRt,jht,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=1J[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,iLt=Gt,i+(Ht,i+λ)wt,i=0wt,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=1J[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+λGR221HL+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}) ft1(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+λGR221HL+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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值