與論文結合詳解XGBoost參數

本文最後修改於2018-01-23,文章有問題或者轉載請及時聯繫本人,如果對你有幫助,別忘了點下關注和喜歡,感謝!

0 前言

網絡上XGBoost的參數翻譯很多,但是都沒做什麼解釋,本文一部分內容參考自 Complete Guide to Parameter Tuning in XGBoost (with codes in Python),一部分內容是根據自己對論文的理解添加的,對某些參數的解釋也給出了論文中對應的部分。

期望讀者:

具有對基礎樹模型的理解,嘗試使用過XGBoost,如果對XGBoost的論文有了解就更好了。

1 XGBoost的優點

  1. 正則
    • 標準的GBM實現是沒有正則的。
    • XGBoost也以regularized boosting技術聞名。加入正則的目標函數如下,其中T是葉子節點的個數,w是葉子結點的權重。所以正則項是由葉子結點的數量和葉子結點權重的平方和決定
    • 10175177-6262d727d14a15b1.png
      帶正則的目標函數
  2. 並行處理
    • XGBoost實現了並行化的處理。
    • XGBoost基於boosting方法,原則上不可以並行。但是XGBoost做的是特徵粒度上的並行,而不是樹粒度上的並行。主要用來同時遍歷得到理想的分裂點。
    • XGBoost支持hadoop上實現。
  3. 高度的靈活性
    • XGBoost允許用戶自定義優化目標評估準則
    • 如下所示,我們只需要知道一階和二階導數即可計算損失,在節點分裂的時候同樣是這樣的。
    • 10175177-523d59dc69953c3a.png
      只需要知道一階和二階導
  4. 處理缺失值方面
    • XGBoost自有一套處理缺失值的方法。論文中提到XGBoost對於缺失值當成稀疏的情況來處理。
  5. 樹剪枝方面
    • GBM是在節點遇到負損失的時候停止分裂,貪心策略。(預剪枝)
    • XGBoost是在分裂抵達max_depth的時候纔開始剪枝移除那些沒有正收益的分裂。(後剪枝)
  6. 內置的交叉驗證
    • XGBoost在boosting過程中的每一次迭代都運行CV,使得在一次運行中就可以確定最優的boosting迭代次數。
    • GBM需要我們使用網格搜索來找最優次數。
  7. 可以在存在的模型上繼續訓練
    • 在某些特定的場景下非常有用。
    • GBM的sklearn實現也有這個特點。

2 XGBoost的參數

  1. General Parameters
    1. booster [default=gbtree]
      • gbtree:基於樹的模型
      • gblinear:線型模型
    2. silent [default=0]
      • 0會輸出運行信息,1不會輸出運行信息,建議保持0有助於理解模型
    3. nthread [如果不設置默認與最大的可以線程數相同]
      • 用來控制並行過程,如果想要在所有的核上都運行就讓系統自己設置就好。注意,mac系統的並行有所不同,可以參見這裏
    4. num_pbuffer:prediction buffe,系統自動設置
    5. num_feature:boosting過程中的特徵維數,系統自動設置
  2. Booster Paramters 包含兩類Booster
    1. eta [default = 0.3]
      • 類似於GBM中的學習率
      • 取值範圍:[0,1],通常設置爲0.01~0.2
    2. gamma [default=0 別名:min_split_loss]
      • 一個葉子節點繼續分裂所需要的最小下降損失。節點分裂的計算公式如下(分裂前損失-分裂後損失),式子最後的gamma就是這裏的gamma。如果gamma很大,計算出的結果是負的,證明分裂沒有收益,就不再分裂。所以值越大,模型越保守/越不容易過擬合。
      • 10175177-0af8ae17dcf9eb86.png
        gamma的影響
      • 取值範圍:[0, ∞]
    3. max_depth [default = 6]
      • 樹的最大深度。值越大模型越複雜/越可能過擬合。設爲0表示不限制。
      • 取值範圍:[0, ∞]
    4. min_child_weight [default=1]
      • 孩子節點需要的最小樣本權重和。如果分裂導致一個葉子節點的樣本權重和小於預設值,就不會繼續分裂了。當樹的結構確定後,我們可以通過下式計算葉結點權重:
      • 10175177-bac88cf5337305b6.png
        葉子節點的權重計算
      • 在線型模型中,簡化爲每個節點所需要的最小樣本數量
      • 值越大,模型越保守。
    5. 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.
      • 用的比較少,但是在邏輯迴歸中,如果類別極度不平衡,調整這個值會有幫助。
    6. subsample [default = 1]
      • 行採樣,不用多說。取值範圍:(0, 1]
    7. colsample_bytree [default = 1]
      • 列採樣,在建立每一棵樹的時候對特徵的採樣比例。取值範圍:(0, 1]
    8. colsample_bylevel [default = 1]
      • 在每一次分裂時候列採樣的比例(?),用的很少。取值範圍:(0, 1]
    9. alpha [default = 0]
      • 權重上的L1正則
    10. lambda [default = 1]
    • 權重上的L2正則
    1. 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.
    1. scale_pos_weight [defualt = 1]
      • 正負樣本比例。用來控制正負樣本的權重,在類別不平衡的時候用處很大。
      • 常用的計算方法:sum(negative cases) / sum(positive cases)
    2. 【Linear Booster】中有lambda,alpha,lambda_bias(在偏置上的L2正則,爲什麼偏置上沒有L1正則,因爲不重要)。
  3. Learning Task Parameters
    1. objective [default=reg:linear] 定義學習目標函數。
      • 常用的:"reg:linear","reg:logistic","binary:logistic"
      • 可以自定義目標函數,需要傳入一階,二階導數
    2. base_score 幾乎不用
    3. eval_metric [默認值根據objective]
      • 可以傳多個評估指標。python特別注意要傳list而不是map。

參考:

1.Complete Guide to Parameter Tuning in XGBoost (with codes in Python

2.XGBoost Parameters

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