XGBoost

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=1Kfk(xi),fkF
要优化的目标函数由下式给出:
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(θ)=inl(yi,yi^)+k=1KΩ(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=1nl(yi,yi(t)^)+i=1tΩ(fi)=i=1nl(yi,yi^(t1)+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=1n(yi(yi^(t1))+ft(xi))2+Ω(ft)+constant=i=1n[2(yiyi^(t1))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=1n[l(yi,yi^(t1))+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=1n[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=1Twj2
这里的 λ \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)

你可能感兴趣的:(机器学习算法)