1. 程式人生 > >Xgboost小結與調參

Xgboost小結與調參

iss 權重 res 利用 子節點 http 割點 分享 src

1、Xgboost對GBDT的優化

  • 算法層面

  1.XGB增加了正則項,能夠防止過擬合。正則項為樹模型復雜度,通過葉子節點數量和葉節點的值定義樹模型復雜度。

技術分享圖片

  T為葉子節點的數量,這T個葉子節點的值,組成了T維向量ω。

  2.XGB損失函數是誤差部分是二階泰勒展開,GBDT 是一階泰勒展開。因此損失函數近似的更精準。

  3. XGB對每顆子樹增加一個參數,使得每顆子樹的權重降低,防止過擬合,這個參數叫shrinkage,對特征進行降采樣,靈感來源於隨機森林,除了能降低計算量外,還能防止過擬合。

  4.采用百分位數法,計算特征的最佳分裂點。在尋找最佳分割點時,考慮傳統的枚舉每個特征的所有可能分割點的貪心法效率太低,xgboost實現了一種近似的算法。大致的思想是根據百分位法列舉幾個可能成為分割點的候選者,然後從候選者中根據上面求分割點的公式計算找出最佳的分割點。

  5.增加處理缺失值的方案(通過枚舉所有缺失值在當前節點是進入左子樹,還是進入右子樹更優來決定一個處理缺失值默認的方向)。

  6.交叉驗證,early stop,當預測結果已經很好的時候可以提前停止建樹,加快訓練速度。

  7.Shrinkage,你可以是幾個回歸樹的葉子節點之和為預測值,也可以是加權,比如第一棵樹預測值為3.3,label為4.0,第二棵樹才學0.7,….再後面的樹還學個鬼,所以給他打個折扣,比如3折,那麽第二棵樹訓練的殘差為4.0-3.3*0.3=3.01,這就可以發揮了啦,以此類推,作用是啥,防止過擬合,如果對於“偽殘差”學習,那更像梯度下降裏面的學習率;

  8.支持並行化,這是XGB的閃光點,雖然樹與樹之間是串行關系,但是同層級節點可並行。具體的對於某個節點,節點內選擇最佳分裂點,候選分裂點計算增益用多線程並行。訓練速度快。

  • 系統層面

  1.對每個特征進行分塊(block)並排序,使得在尋找最佳分裂點的時候能夠並行化計算。這是xgboost比一般GBDT更快的一個重要原因。

  2.通過設置合理的block的大小,充分利用了CPU緩存進行讀取加速(cache-aware access)。使得數據讀取的速度更快。因為太小的block的尺寸使得多線程中每個線程負載太小降低了並行效率。太大的block尺寸會導致CPU的緩存獲取miss掉。

  3.out-of-core 通過將block壓縮(block compressoin)並存儲到硬盤上,並且通過將block分區到多個硬盤上(block Sharding)實現了更大的IO 讀寫速度,因此,因為加入了硬盤存儲block讀寫的部分不僅僅使得xgboost處理大數據量的能力有所提升,並且通過提高IO的吞吐量使得xgboost相比一般實利用這種技術實現大數據計算的框架更快。

2、Xgboost訓練時長

  (圖片來自 機器之心)

技術分享圖片

Xgboost小結與調參