XGBoost目標函數公式推導

主要看了這幾篇文章:

首先大背景是這樣的:

對於加法策略可以表示如下:

初始化(模型中沒有樹時,其預測結果爲0):

往模型中加入第一棵樹:

往模型中加入第二棵樹:

往模型中加入第t棵樹:

其中表示第棵樹,表示組合棵樹模型對樣本的預測結果。

我們知道,每次往模型中加入一棵樹,其損失函數便會發生變化。另外在加入第t棵樹時,則前面第t-1棵樹已經訓練完成,此時前面t-1棵樹的正則項和訓練誤差都成已知常數項。

(1)不懂的公式推導之一

基於以上背景,以下公式推導中,第1行藍色方框圈住的,由於前面第t-1棵樹已經訓練完成可以當做已知常數項,因此相當於第2行綠色方框,第3行紅色方框圈住的,同樣的原因,以及(y_{i}-{\widehat{y_{}} }^{_{(t-1)}}_i)^{2}}這一項與f_t(x)無關,所以被納入了constant項,因此兩個紅色方框相加相當於第4行的棕色方框。

(2)不懂的公式推導之二

很多XGBoost的講解都有以上這張圖片,但是,圖中畫藍線的圈1式子是如何變爲圈2式子的,始終沒有說得很明白。

(1)

以上的最後的y_i是真實值,即已知,可以當作一個常數,{\widehat{y}}_{i}^{(t-1)}當作xf_t(x_i)當作\Delta x。例如以下a是一個常數:

(2)

以上就可以把a當作一個常數,然後對x求偏導,利用公式:

得到:

(3)

可以發現,(3)式與(2)式的結果相同。

基於這個例子,於是(1)式:

其中,標紅色的{\widehat{y}}_{i}^{(t-1)}x等價,標藍色的f_t(x_i)\Delta x等價。並且,第3行的兩個偏導數,即以下圈住的部分

(4)

,於是就得到了(4)式中第4行的部分。

由於第t-1顆樹的值已知,y_i也是已知的,因此,l(y_i,{\widehat{y}}_i^{(t-1)}})對目標函數的優化不影響,可以直接去掉,且常數項也可以移除,從而得到如下一個比較統一的目標函數。

(3)不懂的公式解釋之三

以上圖片中,由i變成j其實相當於將在樣本上遍歷轉換成在葉子節點上遍歷。

 

近似算法

       模型對特徵中的值的範圍不敏感,只對順序敏感。舉個例子,假設一個樣本集中某特徵出現的值有1,4,6,7,那麼把它對應的換成1, 2,3,4。生成的模型裏樹的結構是一樣的,只不過對應的判斷條件變了,比如把小於6換成了小於3而已。這也給我們一個啓示,我們完全可以用百分比作爲基礎來構造模型。

一些進一步優化

  在機器學習中,one-hot後,經常會得到的是稀疏矩陣,於是XGBoost也對這個作出了優化。還可以處理缺失值,畢竟這也是樹模型一貫的優點。但這裏就不細表了,畢竟太過於細節了。下一節我們就來看XGBoost這種強大的模型應該怎麼使用吧。

例程

  官方例程如下:

import xgboost as xgb
# read in data
dtrain = xgb.DMatrix('demo/data/agaricus.txt.train')
dtest = xgb.DMatrix('demo/data/agaricus.txt.test')
# specify parameters via map
param = {'max_depth':2, 'eta':1, 'silent':1, 'objective':'binary:logistic' }
num_round = 2
bst = xgb.train(param, dtrain, num_round)
# make prediction
preds = bst.predict(dtest)

參數

  很明顯,上面重要的就是param,這個參數應該怎麼設。在官網上有整整一個網頁的說明。在這裏我們只挑選一些重要常用的說一下。

與過擬合有關的參數

  在機器學習中,欠擬合很少見,但是過擬合卻是一個很常見的東西。XGBoost與其有關的參數也不少。

增加隨機性

  - eta 這個就是學習步進,也就是上面中的ϵ。
  - subsample 這個就是隨機森林的方式,每次不是取出全部樣本,而是有放回地取出部分樣本。有人把這個稱爲行抽取,subsample就表示抽取比例
  - colsample_bytreecolsample_bylevel 這個是模仿隨機森林的方式,這是列抽取。colsample_bytree是每次準備構造一棵新樹時,選取部分特徵來構造,colsample_bytree就是抽取比例。colsample_bylevel表示的是每次分割節點時,抽取特徵的比例。
  - max_delta_step 這個是構造樹時,允許得到f_t(x)的最大值。如果爲0,表示無限制。也是爲了後續構造樹留出空間,和eta相似

控制模型複雜度

  - max_depth 樹的最大深度
  - min_child_weight 如果一個節點的權重和小於這玩意,那就不分了
  - gamma每次分開一個節點後,造成的最小下降的分數。類似於上面的Gain
  - alphalambda就是目標函數裏的表示模型複雜度中的L1範數和L2範數前面的係數

其他參數

  - booster 表示用哪種模型,一共有gbtree, gbline, dart三種選擇。一般用gbtree。
  - nthread 並行線成數。如果不設置就是能採用的最大線程。
  - sketch_eps 這個就是近似算法裏的ϵ。
  - scale_pos_weight 這個是針對二分類問題時,正負樣例的數量差距過大。

其他資料

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