Xgboost算法推導及分析

Author: DivinerShi
Xgboost其實就是gbdt的一個改進版本,但是因爲效果好,工程建設完善,所以經常和傳統的gbdt分開講。
Boost思想的話是每一步產生一個弱預測模型(如決策樹),並加權累加到總模型中,經典的算法有如Adaboost。提升的理論意義:如果一個問題存在弱分類器,則可以通過提升的辦法得到強分類器。這裏,如果每一步的弱預測模型生成都是依賴損失函數的梯度方向,則稱之爲梯度提升(Gradient boosting)。
梯度提升算法首先給定一個目標損失函數,它的定義域是所有可行的弱函數集合(基函數);提升算法通過迭代的選擇一個負梯度方向上的基函數來逐漸逼近局部極小值。

Boost算法

首先講一下什麼是boost
給定輸入向量X和輸出變量y組成的若干訓練樣本這裏寫圖片描述,目標是找到近似函數這裏寫圖片描述,使得損失函數這裏寫圖片描述 的損失值最小。
最常見的損失就是平方誤差損失
這裏寫圖片描述
也有一些其他的,如絕對誤差損失函數等
這裏寫圖片描述
假設最優函數爲這裏寫圖片描述,即:這裏寫圖片描述
假定這裏寫圖片描述 是一族基函數這裏寫圖片描述 的加權和這裏寫圖片描述,那麼這個函數就是我們要找的函數。

開始推導

從最常見的平方誤差入手,可以定義爲
這裏寫圖片描述
而這裏的函數f就是我們要求的函數,可以想一下一個問題,那就是對於決策樹,其實決策樹也可以理解爲一個函數,樹的輸出就是輸入數據的預測值。而求函數的過程其實就是求函數的參數的一個過程,所以我們上面的目標函數可以改成
這裏寫圖片描述,這裏的這裏寫圖片描述 就是該函數的參數。
那麼把這裏的函數改成樹也是一樣的。
需要注意一點,其實損失函數不同,所假設的誤差的所服從的分佈也是不同的,平方誤差的話,應該假設誤差服從高斯分佈,且最優值應該是均值;如果是絕對誤差的話,應該假設誤差服從拉普拉斯分佈,且最優值應該是中位值。
前面我們說了,xgboost是要沿着梯度的方向去最小化整個模型的誤差,那麼目標函數可以定義爲如下
這裏寫圖片描述
其中i指的是第i個樣本,這裏寫圖片描述 是第t-1個模型對樣本i的預測值,這裏寫圖片描述 表示的是新加入的第t個模型,這裏寫圖片描述 表示正則項, C是計算過程中析出來的一些常數項。最外面的函數L()表示的就是整個模型的誤差。那麼這個函數的意思就是加上新的模型的預測值後來降低整個模型的誤差。而我們的目標就是想辦法去找出這個能使得誤差最小的函數這裏寫圖片描述
首先我們知道二階泰勒展開如下所示:
這裏寫圖片描述
,那麼我們可以把之前的目標函數和該二階泰勒展開函數對應起來,即去對目標函數做二階泰勒展開
這裏寫圖片描述
如上圖所示,我們可以把loss函數當做要展開的函數f,然後把前t-1個模型預測的結果作爲x,把新加入的基函數當做增量,並進行泰勒展開。那麼我們對該泰勒函數一項一項的展開,首先
這裏寫圖片描述 中的f(x)就可以直接表示爲這裏寫圖片描述
因爲後面分別要計算一階和二階導數,所以我們定義樣本i的一階和二階導數爲
這裏寫圖片描述這裏寫圖片描述這裏寫圖片描述 的話其實就是新的基函數這裏寫圖片描述 那麼我們就可以得到展開後的目標函數:
這裏寫圖片描述
而且這裏的函數g()和函數h()都是關於之前所有樹的函數,都是可計算的數值
我們知道給定一顆樹,正真起到分類作用的其實是葉子節點,輸入一個樣本,葉子的輸出值就是預測的結果,即一顆決策樹,預測的結果是由決策樹的葉子節點所決定的。對於分類問題,決策樹的葉子就是指類別,對於迴歸問題,葉子的值就是數值。
這裏,我們先做一個假設,假設樣本x的輸出落在第q個葉子上,那麼樣本x的輸出值爲這裏寫圖片描述,那麼我們就可以重新定義函數f爲:這裏寫圖片描述
正則項:決策樹的正則一般考慮的是葉子節點數和葉子權值,比如常見的是使用葉子節點總數和葉子權值平方和的加權作爲正則項:
這裏寫圖片描述
現在我們重新來看我們之前的目標函數:
這裏寫圖片描述
前面我們說了這裏寫圖片描述 計算出來的是一個常數,所以我們可以直接把這項放到常數項C中,那麼我們就可以得到
這裏寫圖片描述
接着,繼續去替換函數這裏寫圖片描述,以及寫入具體的正則項,可以得到如下
這裏寫圖片描述
進一步,n個樣本落在T個不同的葉子上,那麼可以等價的按不同的葉子將樣本進行區分,即按T,將落在同一個葉子上的樣本進行求和,有可繼續得到
這裏寫圖片描述
再把正則項中相似的項合併一下就可以得到
這裏寫圖片描述
到這,基本上我們要求的目標函數和基函數f就沒什麼關係了,完全就是一個關於樣本一階導數和二階導數的函數了。
當然我們還可以再簡化下這個目標函數,我們可以把位於同一號葉子上一屆偏導的和記爲G,位於同一號葉子上的二階偏導的和記爲H,如:
這裏寫圖片描述
從而優化函數變成:
這裏寫圖片描述
到這裏爲止,目標函數本質已經變成w的函數,變成了一個求w的遊戲,求函數極值,那就求導唄,所以這裏對w求偏導,令其爲0:
這裏寫圖片描述
然後再帶回原目標函數:
這裏寫圖片描述
這就是我們最終得到的目標損失函數,所以xgboost中的gini指數不是正常的gini指數了,而是這個改進的損失函數了。在進行對決策樹劃分的時候需使用這個函數作爲劃分的依據。

改進

上面的是推導,在具體的工程實現中,xgboost還有很多優化:
1.比如xgboost不止支持CART,還支持線性分類器,可以當做帶L1或者L2的邏輯迴歸(分類用)或者線性迴歸(迴歸用)。

2.還做了Shrinkage(縮減)這裏寫圖片描述
類似於學習率,xgboost進行一次迭代後,會將葉子節點的權值乘上係數,目的是爲了減少每棵樹對整體模型的影響,讓後面又更大的學習空間,可以簡單理解爲,模型在學習的過程中並不完全相信每棵樹,只是從每棵樹中學習一個大概的方向。

3.列採樣。xgboost還做了和RF一樣的列採樣,用於減低過擬合,還能減少計算量。

4.xgboost還能自動分裂出缺失值的分裂方向。

5.xgboost在特徵粒度上實現了並行,因爲決策樹在尋找最優切分點的時候是需要對特徵進行排序的,這個步驟是相當費時的,所以xgboost對數據進行了預排序,然後保存爲block結構,並在後面的迭代中重複使用這個結構,大大減少了計算量。因爲有了block所以對特徵進行計算增益的時候就可以多線程並行了。

6.還有一個就是並行化的近似直方圖算法。我們在計算每個特徵的每個切分點對應的增益的時候是用貪心的方法去枚舉每個可能的分割點,但是如果數據無法一次載入內存或者在分佈式的情況下,貪心算法的效率很低,所以xgboost提出了一種近似直方圖算法,用於高效的生成候選的分割點。

參考
1.《機器學習》- 鄒博
2. https://www.zhihu.com/question/41354392/answer/98658997

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