1. 程式人生 > >機器學習 整合演算法XGBoost原理及推導

機器學習 整合演算法XGBoost原理及推導

XGBoost介紹

下面通過一個具體的例子來說明XGBoost幹了一件什麼樣的事情。 如果要判斷是否打電子遊戲,我們可以通過很多特徵來判定,左邊這顆樹,通過年齡和性別來判定,最後每個葉子節點都有一個得分值(權重值),正數代表對結果有好的影響 ,負數代表對結果有負面影響 ,得分值越高越好,右邊的樹,通過不同的特徵,最後也得到了不同的得分值(權重值)。

XGBoost說的就是,對於男孩來說,通過這兩棵樹,他是否打電子遊戲的得分值就為2 + 0.9 =2.9,對於老人來說,他的得分值為-1 + 0.9 =-0.1 ,這就是整合的思想。 在這裡插入圖片描述

XGBoost推導

將上面整合學習方法推廣到一般情況,可知其預測模型為: 在這裡插入圖片描述

其中為K樹的總個數,fk表示第顆樹,yi表示樣本xi的預測結果。

我們定義一個損失函式: 在這裡插入圖片描述 那麼現在,我們就可以得到目標函式:預測值和真實值的平方項的差異(n代表一共有n個樣本)。 A==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

我們上面通過舉一個例子,知道了XGBoost是怎樣的一個工作原理,就是不斷加入新的決策樹,使模型越好越好,下個這個圖就說明了 這個過程。(小括號的值代表一共有幾棵樹) 在這裡插入圖片描述 那是不是隨便加入一棵樹都可以呢,不是這樣的,XGBoost是一種提升演算法,意思是當你加入一顆新的樹之後,整體表達效果要提升,那麼怎樣才能表示整體表達效果提高呢,我們上面得到了目標函式,所以我們要做這樣一件事(XGBoost的核心):加入一棵樹,使我們的目標函式下降

我們先來說另外一個事情,當我們決定要用決策樹做整合演算法的時候,我們要加入懲罰項。

懲罰項

如下圖,這個懲罰項加號左邊表示當決策樹的葉子過多的時候,懲罰力度越大,因為葉子節點過多,容易造成過擬合,加號右邊是w的L2模平方,兩個組合起來就說我們的懲罰項了。

在這裡插入圖片描述 現在,我們目標函式變成了下面這個樣子,第一行的式子表示,一共加入了t顆樹,一共有t個懲罰項,下面的式子則是將括號裡面變成我們上面求的通式,constant是常數項,所以現在的目標就是,找出一個f(t)使得目標函式最小在這裡插入圖片描述

泰勒公式

我們要求解上面的目標函式,需要引入一個東西————泰勒展開公式 mV0L3dlaXhpbl80MzE3MjY2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 我們可以把目標函式l函式中的式子看成這樣: /font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

為了方便計算,我們需要定義兩個東西(gi為f(x)的一階導,hi為f(x)的二階導): /font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 然後根據泰勒展開公式,轉化為: ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 因為對於第t顆樹來說,下面式子為常數項,所以可以把他加入到後面的constant G9nLmNzZG4ubmV0L3dlaXhpbl80MzE3MjY2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 因為後面要進行求導,所以我們把常樹項去掉,所以目標函式變成了: 在這裡插入圖片描述 我們需要進一步對目標函式進行化簡,我們要明白一個東西,對於第t顆加入的樹來說,w為葉子節點的得分值,q(x)表示樣本x對應的葉子節點,T為該樹的葉子節點個數。 MzE3MjY2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 所以,對於我們的目標函式可以進一步簡化,我們之前是在樣本上遍歷,因為所有樣本都是會落到葉子節點上,所以我們可以轉化思路,換成在葉子節點上遍歷。 在這裡插入圖片描述 在葉子節點上遍歷的時候,T表示第t棵樹的葉子節點的個數,i表示在第j個節點中的第i個樣本,wj表示第j個葉子節點的得分值

接下來,為了簡潔一點,我們繼續定義兩個東西,Gj和Hj: 在這裡插入圖片描述 現在,目標函式變成了: 在這裡插入圖片描述 前面說過,我們要求的是目標函式的最小值,所以,現在我們需要在目標函式對w求導,讓其等於0, 4ubmV0L3dlaXhpbl80MzE3MjY2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 可以求得得分值w: 可能有人說這個G和H怎麼求,因為g和h是導數,我們只要定義了損失函式,就能求得G和H的值在這裡插入圖片描述 再把w代回原函式,可以得到: MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

XGBoost怎麼切割決策樹

結構分數

推過XGBoost的求導,我們可以計算出Obj,代表了當我們指定一個樹的結構的時候,我們在目標上面最多減少多少,我們可以把它叫做結構分數,我們可以認為這個類似於Gini係數一樣,可以對樹結構進行打分的函式。

下面具一個具體打分的例子如圖, 葉子節點I1有1個樣本,I2有1個樣本,I3有3個樣本。 對於I1節點來說,G1=g1,H1=h1, 對於I2節點來說,G2=g4,H2=h4, 對於l3節點來說,G3=g2+g3+g5,H3=h2+h3+h5, 我們可以求出目標函式Obj,這個分數越小,代表這個樹的結構越好。 在這裡插入圖片描述 那麼問題來了,我們怎麼切割決策呢,我們之前在決策樹,是通過看資訊增益,切哪裡資訊增益大的就往哪裡切,在XGBoost,我們可以自己構造一個係數,來決定怎麼切 。pbl80MzE3MjY2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 上面就是我們係數的表示式,講的是通過切割之後,算左右子樹的分數之和,減去不分割之前的分數,我們需要列舉所有的分割可能,舉Gain值最小的那個分割辦法,用這種方法將我們的樹構造完成。

總結

XGBoost是一種高效的演算法,可用於提升模型的準確性,將XGBoost的學習分為三步:

  • 整合思想
  • 損失函式的分析
  • 新加入樹的分割