本文最後修改於2018-01-23,文章有問題或者轉載請及時聯繫本人,如果對你有幫助,別忘了點下關注和喜歡,感謝!
0 前言
網絡上XGBoost的參數翻譯很多,但是都沒做什麼解釋,本文一部分內容參考自 Complete Guide to Parameter Tuning in XGBoost (with codes in Python),一部分內容是根據自己對論文的理解添加的,對某些參數的解釋也給出了論文中對應的部分。
期望讀者:
具有對基礎樹模型的理解,嘗試使用過XGBoost,如果對XGBoost的論文有了解就更好了。
1 XGBoost的優點
-
正則
- 標準的GBM實現是沒有正則的。
- XGBoost也以regularized boosting技術聞名。加入正則的目標函數如下,其中T是葉子節點的個數,w是葉子結點的權重。所以正則項是由葉子結點的數量和葉子結點權重的平方和決定。
-
並行處理
- XGBoost實現了並行化的處理。
- XGBoost基於boosting方法,原則上不可以並行。但是XGBoost做的是特徵粒度上的並行,而不是樹粒度上的並行。主要用來同時遍歷得到理想的分裂點。
- XGBoost支持hadoop上實現。
-
高度的靈活性
- XGBoost允許用戶自定義優化目標和評估準則。
- 如下所示,我們只需要知道一階和二階導數即可計算損失,在節點分裂的時候同樣是這樣的。
-
處理缺失值方面
- XGBoost自有一套處理缺失值的方法。論文中提到XGBoost對於缺失值當成稀疏的情況來處理。
-
樹剪枝方面
- GBM是在節點遇到負損失的時候停止分裂,貪心策略。(預剪枝)
- XGBoost是在分裂抵達max_depth的時候纔開始剪枝移除那些沒有正收益的分裂。(後剪枝)
-
內置的交叉驗證
- XGBoost在boosting過程中的每一次迭代都運行CV,使得在一次運行中就可以確定最優的boosting迭代次數。
- GBM需要我們使用網格搜索來找最優次數。
-
可以在存在的模型上繼續訓練
- 在某些特定的場景下非常有用。
- GBM的sklearn實現也有這個特點。
2 XGBoost的參數
-
General Parameters
- booster [default=gbtree]
- gbtree:基於樹的模型
- gblinear:線型模型
- silent [default=0]
- 0會輸出運行信息,1不會輸出運行信息,建議保持0有助於理解模型
- nthread [如果不設置默認與最大的可以線程數相同]
- 用來控制並行過程,如果想要在所有的核上都運行就讓系統自己設置就好。注意,mac系統的並行有所不同,可以參見這裏
- num_pbuffer:prediction buffe,系統自動設置
- num_feature:boosting過程中的特徵維數,系統自動設置
- booster [default=gbtree]
-
Booster Paramters 包含兩類Booster
- eta [default = 0.3]
- 類似於GBM中的學習率
- 取值範圍:[0,1],通常設置爲0.01~0.2
- gamma [default=0 別名:min_split_loss]
- 一個葉子節點繼續分裂所需要的最小下降損失。節點分裂的計算公式如下(分裂前損失-分裂後損失),式子最後的gamma就是這裏的gamma。如果gamma很大,計算出的結果是負的,證明分裂沒有收益,就不再分裂。所以值越大,模型越保守/越不容易過擬合。
- 取值範圍:[0, ∞]
- max_depth [default = 6]
- 樹的最大深度。值越大模型越複雜/越可能過擬合。設爲0表示不限制。
- 取值範圍:[0, ∞]
- min_child_weight [default=1]
- 孩子節點需要的最小樣本權重和。如果分裂導致一個葉子節點的樣本權重和小於預設值,就不會繼續分裂了。當樹的結構確定後,我們可以通過下式計算葉結點權重:
- 在線型模型中,簡化爲每個節點所需要的最小樣本數量
- 值越大,模型越保守。
- min_delta_step [default=0]
- Maximum delta step we allow each tree’s weight estimation to be. If the value is set to 0, it means there is no constraint.
- 用的比較少,但是在邏輯迴歸中,如果類別極度不平衡,調整這個值會有幫助。
- subsample [default = 1]
- 行採樣,不用多說。取值範圍:(0, 1]
- colsample_bytree [default = 1]
- 列採樣,在建立每一棵樹的時候對特徵的採樣比例。取值範圍:(0, 1]
- colsample_bylevel [default = 1]
- 在每一次分裂時候列採樣的比例(?),用的很少。取值範圍:(0, 1]
- alpha [default = 0]
- 權重上的L1正則
- lambda [default = 1]
- 權重上的L2正則
- tree method [default = 'auto'] 這個不是樹構建的方法,而是節點分裂的方法。這個方法從古到今做了很多的改進,之後會有一篇專門的博客介紹這個問題,這裏先附上參數的英文介紹,我們一般使用
auto
即可。。其中
- 'auto': Use heuristic to choose faster one.
- For small to medium dataset, exact greedy will be used.
- For very large-dataset, approximate algorithm will be chosen.
- Because old behavior is always use exact greedy in single machine, user will get a message when approximate algorithm is chosen to notify this choice.
- 'exact': Exact greedy algorithm.
- 'approx': Approximate greedy algorithm using sketching and histogram.
- 'hist': Fast histogram optimized approximate greedy algorithm. It uses some performance improvements such as bins caching.
- 'gpu_exact': GPU implementation of exact algorithm.
- 'gpu_hist': GPU implementation of hist algorithm.
- scale_pos_weight [defualt = 1]
- 正負樣本比例。用來控制正負樣本的權重,在類別不平衡的時候用處很大。
- 常用的計算方法:sum(negative cases) / sum(positive cases)
- 【Linear Booster】中有lambda,alpha,lambda_bias(在偏置上的L2正則,爲什麼偏置上沒有L1正則,因爲不重要)。
- eta [default = 0.3]
-
Learning Task Parameters
- objective [default=reg:linear] 定義學習目標函數。
- 常用的:"reg:linear","reg:logistic","binary:logistic"
- 可以自定義目標函數,需要傳入一階,二階導數
- base_score 幾乎不用
- eval_metric [默認值根據objective]
- 可以傳多個評估指標。python特別注意要傳list而不是map。
- objective [default=reg:linear] 定義學習目標函數。
參考:
1.Complete Guide to Parameter Tuning in XGBoost (with codes in Python