一 說明
xgboost是boosting算法的其中一種,該算法思想就是不斷地添加樹,不斷地進行特徵分裂來生長一棵樹,每次添加一個樹,其實是學習一個新函數,去擬合上次預測的殘差。具體的目標函數如下:
Obj(t)=i=1∑nl(yi,yi^(t−1)+ft(xi))+Ω(ft)+constant(1)
主要就是找到ft來優化這一目標函數,通過一個簡單的例子來形象的理解該目標函數。例如是小明真實有100個糖果,現在建立一個決策系統來預測小明有多少個糖。首先建立一棵樹,記爲樹1,它的預測結果是90個,這時得到一個殘差,這個殘差值就是100-90=10,此時和真實值差別是10。爲了提高精度,可以在該決策系統中再添加一棵樹,記爲樹2。樹2就是爲了彌補上一棵樹存在的殘差,假設它的預測結果是5,此時總體的殘差值是10-5=5,即和真實值相差爲5。符號化表示:之前的結果10表示爲輸出結果爲y1^,即上一時刻的殘差值,樹2的值爲f2,此時得到的值。接着可以再建立第三課樹,記爲樹3。假設它的預測值爲3,此時總體的殘差值是5-3=2,即和真實值相差爲2。符號化表示:上一時刻輸出結果5爲y2^,即上一時刻的殘差值,樹3爲f3,此時得到的值。xgboost的目標就是通過找到ft來優化這一目標函數,使得最終結果足夠小。下面對該函數進行推導化簡。
二 目標函數化簡
1、預備知識,泰勒展開式。主要使用泰勒展開式來近似原來的目標函數
f(x+∇x)=f(x)+f’(x)∇x+21f′′(x)∇x(2)
2、推導過程:
Obj(t)=i=1∑n[l(yi,yi^(t−1))+∂y^(t−1)l(yi,y^(t−1))∗ft(xi)+∂y^(t−1)2l(yi,y^(t−1))∗2ft(xi)+Ω(ft)+constant(3) ≈i=1∑n[gi∗ft(xi)+hi∗2ft(xi)]+Ω(ft)+constant(4)
=i=1∑n[gi∗wq(xi)+21hi∗wq(xi)2]+γT+λj=1∑Tωj2(5)
=j=1∑T[(i∈Ij∑gi)wj+21((i∈Ij∑hi+λ)wj2)]+γT(6) =j=1∑T[Gjwj+21(Hj+λ)wj2]+γT(7)
- 式(3):它是在(2)的基礎上推導出來,是將l(yi,yi^(t−1))看着(2)中的x,ft(xi)記爲∇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)z和後面的正則項目展開了。
- 這裏對於f的定義做一下細化,把樹拆分成結構部分q和葉子權重部分w。下圖是一個具體的例子。結構函數q把輸入映射到葉子的索引號上面去,即第幾個葉子;而w給定了每個索引號對應的葉子分數是什麼。通俗的理解就是樣本x落到那個葉子結點上,取該結點的值。
- 正則化項目選擇了數據樹的葉子個數,以及葉子權值大小平方。爲了防止樹在訓練過程中過度複雜。當然這不是唯一的一種定義方式,不過這一定義方式學習出的樹效果一般都比較不錯。下圖還給出了正則化項目計算的一個例子。
- 式(6)主要的變換是將對樣本的遍歷,轉換爲對樹的葉子結點的遍歷。(理解部分:假設一共5個樣本,其中共有兩個樣本落在上圖樹中的leaf1,一個樣本落在leaf2中,還有兩個樣本落在leaf3中。式(5)是直接統計各個樣本的值,式(6)則是直接遍歷葉子,遍歷leaf1時可以取得統計2個樣本的值,leaf2時可以取得統計1個樣本的值, leaf3時可以取得統計2個樣本的值,同樣可以訪問所有的樣本。在葉子上遍歷更加方便計算)。式(6)中就是統計落在每個葉子結點中所有的樣本的一階導數gi和該葉子結點權值w的乘積,同時二階導數hi和該葉子結點權值w的乘積(每個樣本的gi和hi都不一樣)。
- 使式中Gj表示當前葉子結點所有樣本一階導數的和,同理Hj表示當前樣本所有二階導數的和
3 目標函數轉換
Obj(t)=j=1∑T[Gjwj+21(Hj+λ)wj2]+γT(8)
使得式(8)最小,令∂wj∂j(ft)=Gj+(Hj+λ)wj=0(9)
得到wj=−Hj+λGj(10)
將(10)代入(9)得到:Obj=−21j=1∑THj+λGj2+γT(11)
舉例說明:下圖公有5個樣本,三個葉子結點,計算的目標函數如下,最終的目標是得到最小值:
三 分支
如何找到最佳的分支切割點,如上圖所示。如何選取合適的a點分割,使目標函數值變小。這裏是基於式(11),得到分支增益的公式:
Gain=21[HL+λGL2+HR+λGR2+HL+HR+λGL2+GR2]−γ(12)
選取是Gain最小的切割點進行分支。