xgboost目標函數推導過程

一 說明

xgboost是boosting算法的其中一種,該算法思想就是不斷地添加樹,不斷地進行特徵分裂來生長一棵樹,每次添加一個樹,其實是學習一個新函數,去擬合上次預測的殘差。具體的目標函數如下:

(1)Obj(t)=i=1nl(yi,yi^(t1)+ft(xi))+Ω(ft)+constantObj{(t)} = \sum_{i=1}^nl(y_i, \hat{y_i}^{(t-1)} + f_t(x_i)) + Ω(f_t) + constant\tag {1}

​ 主要就是找到ftf_t來優化這一目標函數,通過一個簡單的例子來形象的理解該目標函數。例如是小明真實有100個糖果,現在建立一個決策系統來預測小明有多少個糖。首先建立一棵樹,記爲樹1,它的預測結果是90個,這時得到一個殘差,這個殘差值就是100-90=10,此時和真實值差別是10。爲了提高精度,可以在該決策系統中再添加一棵樹,記爲樹2。樹2就是爲了彌補上一棵樹存在的殘差,假設它的預測結果是5,此時總體的殘差值是10-5=5,即和真實值相差爲5。符號化表示:之前的結果10表示爲輸出結果爲y1^\hat{y_1},即上一時刻的殘差值,樹2的值爲f2f_2,此時得到的值。接着可以再建立第三課樹,記爲樹3。假設它的預測值爲3,此時總體的殘差值是5-3=2,即和真實值相差爲2。符號化表示:上一時刻輸出結果5爲y2^\hat{y_2},即上一時刻的殘差值,樹3爲f3f_3,此時得到的值。xgboost的目標就是通過找到ftf_t來優化這一目標函數,使得最終結果足夠小。下面對該函數進行推導化簡。

二 目標函數化簡

1、預備知識,泰勒展開式。主要使用泰勒展開式來近似原來的目標函數

(2)f(x+x)=f(x)+f(x)x+12f(x)xf(x + \nabla{x}) = f(x) + f^{’}(x)\nabla{x} + \frac{1}{2}f^{''}(x)\nabla{x}\tag {2}

2、推導過程:

(3)Obj(t)=i=1n[l(yi,yi^(t1))+y^(t1)l(yi,y^(t1))ft(xi)+y^(t1)2l(yi,y^(t1))ft(xi)2+Ω(ft)+constantObj{(t)} = \sum_{i=1}^n[l(y_i, \hat{y_i}^{(t-1)})+\partial_{\hat{y}^{(t-1)}}l(y_i, \hat{y}^{(t-1)})*f_t(x_i) +\partial_{\hat{y}^{(t-1)}}^{2}l(y_i, \hat{y}^{(t-1)})*\frac{f_t(x_i)}{2} + Ω(f_t) + constant\tag {3} (4)i=1n[gift(xi)+hift(xi)2]+Ω(ft)+constant\approx{ \sum_{i=1}^n[g_i*f_t(x_i) + h_i*\frac{f_t(x_i)}{2}] + Ω(f_t) + constant}\tag {4}

(5)=i=1n[giwq(xi)+12hiwq(xi)2]+γT+λj=1Tωj2=\sum_{i=1}^n[g_i*w_{q(x_i)} + \frac{1}{2}h_i*w_{q(x_i)}^2] + \gamma{T} + \lambda{\sum_{j=1}^T\omega_j^{2}} \tag {5}

(6)=j=1T[(iIjgi)wj+12((iIjhi+λ)wj2)]+γT=\sum_{j=1}^T[(\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}\tag {6} (7)=j=1T[Gjwj+12(Hj+λ)wj2]+γT=\sum_{j=1}^T[G_jw_j + \frac{1}{2}{(H_j + \lambda)w_j^2}] + \gamma{T} \tag {7}

  • 式(3):它是在(2)的基礎上推導出來,是將l(yi,yi^(t1))l(y_i, \hat{y_i}^{(t-1)})看着(2)中的x,ft(xi)f_t(x_i)記爲x\nabla{x}(注:這裏的變換是近似變換。後面式中的t,表示時刻;i表示第i個樣本。將$g_i = \partial_{\hat{y}^{(t-1)}}l(y_i, \hat{y}^{(t-1)}), h_i = \partial_{\hat{y}{(t-1)}}{2}l(y_i, \hat{y}^{(t-1)}) ;又因爲l(y_i, \hat{y_i}^{(t-1)})$是一個固定值,可以合併到後面的常數項中。式(3)變形爲式(4)
  • 式(5):它是將ft(xi)f_t(x_i)z和後面的正則項目展開了。
    • 這裏對於f的定義做一下細化,把樹拆分成結構部分q葉子權重部分w。下圖是一個具體的例子。結構函數q把輸入映射到葉子的索引號上面去,即第幾個葉子;而w給定了每個索引號對應的葉子分數是什麼。通俗的理解就是樣本x落到那個葉子結點上,取該結點的值。在這裏插入圖片描述
    • 正則化項目選擇了數據樹的葉子個數,以及葉子權值大小平方。爲了防止樹在訓練過程中過度複雜。當然這不是唯一的一種定義方式,不過這一定義方式學習出的樹效果一般都比較不錯。下圖還給出了正則化項目計算的一個例子。在這裏插入圖片描述
  • 式(6)主要的變換是將對樣本的遍歷,轉換爲對樹的葉子結點的遍歷。(理解部分:假設一共5個樣本,其中共有兩個樣本落在上圖樹中的leaf1,一個樣本落在leaf2中,還有兩個樣本落在leaf3中。式(5)是直接統計各個樣本的值,式(6)則是直接遍歷葉子,遍歷leaf1時可以取得統計2個樣本的值,leaf2時可以取得統計1個樣本的值, leaf3時可以取得統計2個樣本的值,同樣可以訪問所有的樣本。在葉子上遍歷更加方便計算)。式(6)中就是統計落在每個葉子結點中所有的樣本的一階導數gig_i和該葉子結點權值w的乘積,同時二階導數hih_i和該葉子結點權值w的乘積(每個樣本的gihig_i和h_i都不一樣)。
  • 使式中GjG_j表示當前葉子結點所有樣本一階導數的和,同理HjH_j表示當前樣本所有二階導數的和

3 目標函數轉換

(8)Obj(t)=j=1T[Gjwj+12(Hj+λ)wj2]+γTObj^{(t)}=\sum_{j=1}^T[G_jw_j + \frac{1}{2}{(H_j + \lambda)w_j^2}] + \gamma{T} \tag {8}

使得式(8)最小,令(9)j(ft)wj=Gj+(Hj+λ)wj=0\frac{\partial{j(f_t)}}{\partial{w_j}} = G_j + (H_j + \lambda)w_j = 0\tag {9}

得到(10)wj=GjHj+λw_j = -\frac{G_j}{H_j +\lambda}\tag {10}

將(10)代入(9)得到:(11)Obj=12j=1TGj2Hj+λ+γTObj = -\frac{1}{2}\sum_{j=1}^T\frac{G_j^2}{H_j + \lambda} + \gamma{T}\tag {11}

舉例說明:下圖公有5個樣本,三個葉子結點,計算的目標函數如下,最終的目標是得到最小值:在這裏插入圖片描述

三 分支

在這裏插入圖片描述
如何找到最佳的分支切割點,如上圖所示。如何選取合適的a點分割,使目標函數值變小。這裏是基於式(11),得到分支增益的公式:

(12)Gain=12[GL2HL+λ+GR2HR+λ+GL2+GR2HL+HR+λ]γGain = \frac{1}{2}[\frac{G_L^2}{H_L +\lambda} + \frac{G_R^2}{H_R +\lambda} + \frac{G_L^2 + G_R^2}{H_L +H_R +\lambda}] -\gamma\tag {12}

選取是Gain最小的切割點進行分支。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章