O b j ( θ ) = L ( θ ) + Ω ( θ ) Obj(\theta)=L(\theta)+\Omega(\theta) Obj(θ)=L(θ)+Ω(θ)
目标函数等于损失函数加模型正则项,两者代表bias-variance tradeoff.损失函数在不同问题下可取不同形式,MSE,logloss
XGBOOST中基础学习器可选CART,线性模型,DART(带dropout的boosted tree)
使用CART时,所有决策树都是回归树(Regression Tree),处理二分类问题时,回归树节点值为分类的odds,类似于LR中的 ω x + b \omega x+b ωx+b,最后可再转化为概率。即单颗回归树也能处理分类问题,且可以输出概率。使用线性模型做基学习器时,相当于LR。
模型可以写成: y ^ i = ∑ k = 1 K f k ( x i ) , f k ∈ F \hat{y}_i=\sum_{k=1}^{K}f_k(x_i),f_k\in \mathcal{F} y^i=k=1∑Kfk(xi),fk∈F
其中 K K K是树的总个数, f f f是函数空间 F \mathcal{F} F中的一个函数,函数空间 F \mathcal{F} F代表所有CART组成的函数空间。
要优化的目标函数为 O b j ( θ ) = ∑ i = 1 n l ( y i , y ^ i ( t ) ) + ∑ k = 1 K Ω ( f k ) Obj(\theta)=\sum_{i=1}^n l(y_i, \hat{y}_i^{(t)})+\sum_{k=1}^K \Omega(f_k) Obj(θ)=i=1∑nl(yi,y^i(t))+k=1∑KΩ(fk)
XGBOOST的最终结果可以看作是所有CART的加法组合,而随机森林的最终结果是CART加法组合的平均值,所以XGBOOST和RF在本质上是一种模型,都是要训练多个CART然后将结果相加。区别只是在每颗CART的训练方式上。(翻译自xgboost官方文档)
GBDT每轮训练一颗决策树,在训练新决策树时,不改变前面已经存在的树。 (additive strategy: fix what we have learned, and add one new tree at a time)
y ^ i ( 0 ) = 0 y ^ i ( 1 ) = f 1 ( x i ) = y ^ i ( 0 ) y ^ i ( 2 ) = f 1 ( x i ) + f 2 ( x i ) = y ^ i ( 1 ) + f 2 ( x i ) . . . . . . y ^ i ( t ) = ∑ k = 1 t f k ( x i ) = y ^ i ( t − 1 ) + f t ( x i ) \hat{y}_i^{(0)}=0 \\ \hat{y}_i^{(1)} =f_1(x_i)= \hat{y}_i^{(0)}\\\hat{y}_i^{(2)} = f_1(x_i) + f_2(x_i)= \hat{y}_i^{(1)} + f_2(x_i)\\......\\\hat{y}_i^{(t)} = \sum_{k=1}^t f_k(x_i)= \hat{y}_i^{(t-1)} + f_t(x_i) y^i(0)=0y^i(1)=f1(xi)=y^i(0)y^i(2)=f1(xi)+f2(xi)=y^i(1)+f2(xi)......y^i(t)=k=1∑tfk(xi)=y^i(t−1)+ft(xi)
每一轮的优化方向是,当加入一颗决策树后,能最大程度的优化我们的目标函数。
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 \begin{aligned} {obj}^{(t)} & = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t)}) + \sum_{i=1}^t\Omega(f_i) \\ & = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)) + \Omega(f_t) + \mathrm{constant}\end{aligned} obj(t)=i=1∑nl(yi,y^i(t))+i=1∑tΩ(fi)=i=1∑nl(yi,y^i(t−1)+ft(xi))+Ω(ft)+constant
若将损失函数 l l l 定义为MSE,目标函数可以展开变为
o b j ( t ) = ∑ i = 1 n ( y i − ( y ^ i ( t − 1 ) + f t ( x i ) ) ) 2 + ∑ i = 1 t Ω ( f i ) {obj}^{(t)} =\sum_{i=1}^n(y_i-(\hat{y}_i^{(t-1)}+f_t(x_i)))^2+\sum_{i=1}^t \Omega( f_i) obj(t)=i=1∑n(yi−(y^i(t−1)+ft(xi)))2+i=1∑tΩ(fi)
展开平方项和正则项,此时的变量只有 f t f_t ft ,其余的 f i f_i fi 都已经确定,按常数项考虑。
o b j ( t ) = ∑ i = 1 n [ y i 2 + ( y ^ i ( t − 1 ) f t ) 2 − 2 y i ( y ^ i t − 1 − 2 y i f t ) ] = ∑ i = 1 n [ f t ( x i ) 2 + 2 ( y i ^ i ( t − 1 ) − y i ) f t ( x i ) ] + Ω ( f t ) ] + c o n s t a n t \begin{aligned}obj^{(t)} & =\sum_{i=1}^n[y_i^2+(\hat{y}_i^{(t-1)}f_t)^2-2y_i(\hat{y}_i^{t-1}-2y_if_t) ]\\& =\sum_{i=1}^n[f_t(x_i)^2+2(\hat{y_i}_i^{(t-1)}-y_i)f_t(x_i)]+\Omega(f_t)]+\mathrm{constant}\end{aligned} obj(t)=i=1∑n[yi2+(y^i(t−1)ft)2−2yi(y^it−1−2yift)]=i=1∑n[ft(xi)2+2(yi^i(t−1)−yi)ft(xi)]+Ω(ft)]+constant
目标函数可以化简为关于 f t f_t ft的二次函数加正则项的形式。
若损失函数不取MSE时,可将损失函数部分用Taylor公式展开,将模型输出看作变量 x x x 则 f t f_t ft就是增量 Δ x \Delta x Δx,求函数在 x x x 点的一、二阶导数
o b j ( 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 ) + 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(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\Omega(f_t)+\mathrm{constant} obj(t)=i=1∑n[l(yi,y^i(t−1))+gift(xi)+21hift2(xi)]+Ω(ft)+constant
其中
g i = ∂ y ^ i ( t − 1 ) l ( y i , y ^ i ( t − 1 ) ) h i = ∂ y ^ i ( t − 1 ) 2 l ( y i , y ^ i ( t − 1 ) ) g_i= \partial_{\hat{y}_i^{(t-1)}} l(y_i, \hat{y}_i^{(t-1)}) \\ h_i= \partial_{\hat{y}_i^{(t-1)}}^2 l(y_i, \hat{y}_i^{(t-1)}) gi=∂y^i(t−1)l(yi,y^i(t−1))hi=∂y^i(t−1)2l(yi,y^i(t−1))
除去常数项,可优化的部分为 ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) \sum_{i=1}^n [g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] + \Omega(f_t) i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)
g i , h i g_i,h_i gi,hi的值都只与 y ^ i ( t − 1 ) \hat{y}_i^{(t-1)} y^i(t−1)有关,
在MSE时, l = ( y i − y ^ i ) 2 l=(y_i-\hat{y}_i)^2 l=(yi−y^i)2,有 g i = y i − y ^ i , h i = 2 g_i=y_i- \hat{y}_i,h_i=2 gi=yi−y^i,hi=2
交叉熵时, l = y i l o g σ ( y ^ i ) + ( 1 − y i ) l o g σ ( 1 − y ^ i ) l = y_ilog \sigma(\hat{y}_i)+(1-y_i)log\sigma(1-\hat{y}_i) l=yilogσ(y^i)+(1−yi)logσ(1−y^i),有 g i = y i − σ ( y ^ i ) , h i = − σ ( y ^ i ) ( 1 − σ ( y i ^ ) ) g_i=y_i-\sigma(\hat{y}_i),h_i=-\sigma(\hat{y}_i)(1-\sigma(\hat{y_i})) gi=yi−σ(y^i),hi=−σ(y^i)(1−σ(yi^))
使用交叉熵损失函数时,二阶导数和节点值有关,而使用MSE时,所有特征及节点的二阶导数都一样,计算增益时可不用考虑。
树模型的本质是将特征空间划分为n个区域,每个区域有一个节点值,可表示为
f t ( x ) = w q ( x ) , w ∈ R T , q : R d → { 1 , 2 , ⋯   , T } . f_t(x) = w_{q(x)}, w \in R^T, q:R^d\rightarrow \{1,2,\cdots,T\} . ft(x)=wq(x),w∈RT,q:Rd→{1,2,⋯,T}.
其中, w w w 为节点值, q ( x ) q(x) q(x)是特征到区域的映射, T T T为空间中总的区域数(叶子节点数)
XGBOOST中将正则向定义为叶子节点个数与节点值大小的组合
Ω ( f ) = γ T + λ ∑ j = 1 T w j 2 \Omega(f) = \gamma T+\lambda \sum_{j=1}^Tw_j^2 Ω(f)=γT+λj=1∑Twj2
将上面 f t f_t ft的表达式代入
obj ( t ) ≈ ∑ i = 1 n [ g i w q ( x i ) + 1 2 h i w q ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T \begin{aligned}\text{obj}^{(t)} &\approx \sum_{i=1}^n [g_i w_{q(x_i)} + \frac{1}{2} h_i w_{q(x_i)}^2] + \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2\\ &= \sum^T_{j=1} [(\sum_{i\in I_j} g_i) w_j + \frac{1}{2} (\sum_{i\in I_j} h_i + \lambda) w_j^2 ] + \gamma T\end{aligned} obj(t)≈i=1∑n[giwq(xi)+21hiwq(xi)2]+γT+21λj=1∑Twj2=j=1∑T[(i∈Ij∑gi)wj+21(i∈Ij∑hi+λ)wj2]+γT
第二部改变求和顺序,因为所有的样本点如果落在相同的叶子节点, w w w都相同
令 G j = ∑ i ∈ I j g i G_j = \sum_{i\in I_j} g_i Gj=∑i∈Ijgi, H j = ∑ i ∈ I j h i H_j = \sum_{i\in I_j} h_i Hj=∑i∈Ijhi即某个节点处所有样本的导数和
o b j ( t ) = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T {obj}^{(t)} = \sum^T_{j=1} [G_jw_j + \frac{1}{2} (H_j+\lambda) w_j^2] +\gamma T obj(t)=j=1∑T[Gjwj+21(Hj+λ)wj2]+γT
每个 w j w_j wj都是独立的,求和号中可以单独优化,对每个 w j w_j wj,都是二次函数,根据二次函数极小值公式,
w j ∗ = − b 2 a = G j H j + λ o b j j ∗ = − G j 2 2 ( H j + λ ) o b j ∗ = − 1 2 ∑ j = 1 T G j 2 2 ( H j + λ ) + γ T \begin{aligned}w_j^* & =-\frac{b}{2a}=\frac{G_j}{H_j+\lambda} \\ obj_j^* & =-\frac{G_j^2}{2(H_j+\lambda)}\\obj^* &=-\frac{1}{2}\sum_{j=1}^T\frac{G_j^2}{2(H_j+\lambda)}+\gamma T\end{aligned} wj∗objj∗obj∗=−2ab=Hj+λGj=−2(Hj+λ)Gj2=−21j=1∑T2(Hj+λ)Gj2+γT
至此,新建决策树的节点值 w j w_j wj的求解方法可以确定。
理论上可以便利所有的可能结构,找到最好的,但实际上采用按层分裂的方式,每次优化一层的节点。
对于二叉树的一个节点,假设让其分裂,比较分裂后与分裂前的目标函数值,定义其差值为 G a i n Gain Gain,显然有
G a i n = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] − γ Gain=\frac{1}{2} \left[\frac{G_L^2}{H_L+\lambda}+\frac{G_R^2}{H_R+\lambda}-\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}\right] - \gamma Gain=21[HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2]−γ
每次分裂都会使叶子节点数量加1,原节点处目标函数值与分裂后左右两颗树的值的差。如果loss增益大于模型复杂度的增长容忍条件( λ \lambda λ为可调节超参数),则分裂节点。可见, λ \lambda λ越大,模型越不容易分裂,模型越简单。XGBOOST中的决策树不需要进行剪枝处理???。
// Adjust weight
w += y * (scale * w - w);
avx::Float8 grad = Loss::FirstOrderGradient(p, y);
avx::Float8 hess = Loss::SecondOrderGradient(p, y);
avx::StoreGpair(gpair_ptr + i, grad * w, hess * w);
设置参数scale_pos_weight,这个参数只在二分类时有用。
so a gradient of a positive sample would be more influential.参数调整了梯度的权重
每一棵得到的新数都会乘一个小于一的 e t a eta eta值,用于放慢学习速度,否则前几棵树后梯度容易接近0,后面的数能学习的部分很少,所以放慢每棵树的学习率,从而建立更多的树,增加模型泛化能力。
单机版本xgboost使用精确查找寻找最佳切分点,遍历计算所有可能的切分点,寻找增益最大的。算法复杂度为 O ( I ∗ m ) O(I*m) O(I∗m)特征数乘样本数。
遍历某一特征时,要先对其进行排序,xgboost会预先对所有特征进行排序,再根据次序计算一二阶梯度信息。
对于大型数据或分布式数据,xgboost提供一种近似的切分点查找算法
参考 https://blog.csdn.net/weixin_39750084/article/details/83216127
xgboost提供两种多分类方法