主要看了這幾篇文章:
首先大背景是這樣的:
對於加法策略可以表示如下:
初始化(模型中沒有樹時,其預測結果爲0):
往模型中加入第一棵樹:
往模型中加入第二棵樹:
…
往模型中加入第t棵樹:
其中表示第棵樹,表示組合棵樹模型對樣本的預測結果。
我們知道,每次往模型中加入一棵樹,其損失函數便會發生變化。另外在加入第t棵樹時,則前面第t-1棵樹已經訓練完成,此時前面t-1棵樹的正則項和訓練誤差都成已知常數項。
(1)不懂的公式推導之一
基於以上背景,以下公式推導中,第1行藍色方框圈住的,由於前面第t-1棵樹已經訓練完成可以當做已知常數項,因此相當於第2行綠色方框,第3行紅色方框圈住的,同樣的原因,以及這一項與無關,所以被納入了constant項,因此兩個紅色方框相加相當於第4行的棕色方框。
(2)不懂的公式推導之二
很多XGBoost的講解都有以上這張圖片,但是,圖中畫藍線的圈1式子是如何變爲圈2式子的,始終沒有說得很明白。
(1)
以上的最後的是真實值,即已知,可以當作一個常數,當作,當作。例如以下a是一個常數:
(2)
以上就可以把a當作一個常數,然後對x求偏導,利用公式:
得到:
(3)
可以發現,(3)式與(2)式的結果相同。
基於這個例子,於是(1)式:
其中,標紅色的和等價,標藍色的和等價。並且,第3行的兩個偏導數,即以下圈住的部分
(4)
令,,於是就得到了(4)式中第4行的部分。
由於第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_bytree和colsample_bylevel 這個是模仿隨機森林的方式,這是列抽取。colsample_bytree是每次準備構造一棵新樹時,選取部分特徵來構造,colsample_bytree就是抽取比例。colsample_bylevel表示的是每次分割節點時,抽取特徵的比例。
- max_delta_step 這個是構造樹時,允許得到的最大值。如果爲0,表示無限制。也是爲了後續構造樹留出空間,和相似
控制模型複雜度
- max_depth 樹的最大深度
- min_child_weight 如果一個節點的權重和小於這玩意,那就不分了
- gamma每次分開一個節點後,造成的最小下降的分數。類似於上面的Gain
- alpha和lambda就是目標函數裏的表示模型複雜度中的L1範數和L2範數前面的係數
其他參數
- booster 表示用哪種模型,一共有gbtree, gbline, dart三種選擇。一般用gbtree。
- nthread 並行線成數。如果不設置就是能採用的最大線程。
- sketch_eps 這個就是近似算法裏的ϵ。
- scale_pos_weight 這個是針對二分類問題時,正負樣例的數量差距過大。