[譯] XGBoost 算法萬歲!

XGBoost 算法萬歲!

機器學習算法的新女王將接管整個世界……html

(本文與 Venkat Anurag Setty 共同完成)前端

我還記得 15 年前個人第一份工做。那時,我剛完成研究生課程,做爲一名分析師加入了一家國際投行。在入職的第一天,我當心翼翼地工做,不斷回想學過的知識,內心想着本身是否能勝任這個企業的工做。老闆感覺到了個人焦慮,笑着對我說:python

「別擔憂!你只要瞭解迴歸模型就好了!」android

我仔細想了想,「明白了!」 —— 不管是線性迴歸仍是邏輯迴歸我都瞭解。老闆是對的,在個人任期內,專門構建基於迴歸的統計學模型。我並非孤身一人,由於在那時,迴歸模型是無可爭議的預測分析女王。15 年後,迴歸模型的時代結束了,這位老女王已經退位。新上任的女王有着時髦的名字:XGBoost 或 Extreme Gradient Boosting。ios


什麼是 XGBoost?

XGBoost 是一種基於決策樹的集成(ensemble)機器學習算法,使用了梯度提高(gradient boosting)框架。在非結構化數據(如圖像、文本等)的預測問題中,人工神經網絡效果好於其它全部算法和框架;然而,在解決中小型的結構化、扁平化數據時,基於決策樹的算法纔是最好的。下面的圖表展現了近年來基於樹的算法的演變過程:git

Evolution of XGBoost Algorithm from Decision Trees

XGBoost 算法是華盛頓大學在科研工程中開發的。陳天奇與 Carlos Guestrin 在 SIGKDD 2016 上發表了他們的論文,迅速吸引了機器學習界的注意。自從 XGBoost 推出以來,它不只在許多 Kaggle 競賽中得到了勝利,還爲一些頂尖的業界應用提供了動力。所以,造成了一個強大的數據科學家社區爲 XGBoost 作貢獻,目前 GitHub 上的 XGBoost 項目有 350 餘名貢獻者,3600 餘條 commit 記錄。XGBoost 算法還在下面幾個方面極爲出衆:github

  1. 應用普遍:能夠用於解決迴歸、分類、排序和其它用戶自定義的預測問題;
  2. 可移植性:在 Windows、Linux 和 OS X 系統中都能順暢運行;
  3. 語言:支持包括 C++、Python、R、Java、Scala 和 Julia 等所有主流編程語言;
  4. 雲端集成:支持 AWS、Azure、Yarn 集羣,並與 Flink、Spark 等生態系統配合無間。

如何直觀地理解 XGBoost?

決策樹在最簡單的形式下,是最易於可視化以及最具可解釋性的算法,但想要直觀的理解新一代的基於樹的算法可能會有些困難。能夠用下面的類比來更好地瞭解基於樹的算法的演變。面試

[rawpixel](https://unsplash.com/photos/cnseVhmbA7k?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 供圖[Unsplash](https://unsplash.com/search/photos/interview?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)

設想你是一名 HR,要對幾名優秀的候選人進行面試。而基於樹的算法的演變過程的每一步,均可以視爲是面試過程的一個版本。算法

  1. 決策樹(Decision Tree):每一個 HR 都有一系列標準,好比學歷、工做年份、面試表現等。一個決策樹就相似於一個 HR 基於他的這些標準來篩選候選人。編程

  2. Bagging:假設如今不僅有一個面試官,而是有一個面試小組,組中每一個面試官都有投票權。Bagging 和 Bootstrap 就是經過一個民主投票的過程,將全部面試官的輸入聚合起來,獲得一個最終的決定。

  3. 隨機森林(Random Forest):它是一種基於 Bagging 的算法,關鍵點在於隨機森林會隨機使用特徵的子集。換句話說,就是每一個面試官都只會用一些隨機選擇的標準來考驗候選人的任職資格(好比,技術面值考察編程技能,行爲面只考察非技術相關的技能)。

  4. Boosting:這是一種替代方法,每一個面試官都會根據上一個面試官的面試結果來改變本身的評價標準。經過利用更加動態的評估過程,能夠提高(boost)面試過程的效率。

  5. 梯度提高(Gradient Boosting):Boosting 的特例,用梯度降低算法來將偏差最小化。好比,諮詢公司用案例面試來剔除不太合格的候選人。

  6. XGBoost:能夠認爲 XGBoost 就是「打了興奮劑」的梯度提高(所以它全稱是「Extreme Gradient Boosting」 —— 極端梯度提高)。它是軟件和硬件優化技術的完美結合,能夠在最短的時間內用較少的計算資源獲得出色的結果。


爲何 XGBoost 效果這麼好?

XGBoost 和梯度提高機(Gradient Boosting Machines,GBM)都是集成(ensemble)樹方法,原理都是用梯度降低架構來對多個弱分類器(一般是 CARTs)進行提高(boosting)。不過,XGBoost 經過系統優化與算法強化在 GBM 框架上進行了改進。

XGBoost 是如何優化標準 GBM 算法的

系統優化:

  1. 並行化:XGBoost 經過並行化方法來實現順序的建樹過程。因爲基礎學習器循環內部(包括用於枚舉樹的葉子節點的外部循環,以及用於計算特徵的內部循環)的可互換性,所以才能這麼作;循環的嵌套會限制並行化,由於若是沒有完成兩個開銷更大的內部循環,就不能開始新的外部循環。XGBoost 算法經過使用並行線程對全部實例進行全局掃描和排序來進行初始化,使得循環的順序變得可交換,從而減小了運行的時間。這樣作,能夠抵消並行化開銷而提高算法性能。

  2. 樹剪枝:在 GBM 框架中,樹中止分裂的標準本質上是貪婪的,取決於分裂點的 loss 值。而 XGBoost 用 max_depth 這一參數而非某個指標來中止分裂,而後開始反過來對樹進行剪枝。這種「深度優先」的方法顯著提升了計算性能。

  3. 硬件優化:XGBoost 算法就是爲了高效利用硬件資源而設計的。它爲每一個線程都分配了內部緩存區,用於存儲梯度統計信息。另外,利用「核外計算」方法,在處理不適合放在內存中的大數據切片時,進一步優化磁盤可用空間。

算法強化:

  1. 正則化(Regularization):XGBoost 同時經過 LASSO(L1)與 Ridge(L2)正則化懲罰過於複雜的模型,從而避免過擬合。

  2. 稀疏意識(Sparsity Awareness):XGBoost 會根據訓練 loss 自動「學習」輸入中的缺失值,從而天然地接收稀疏特徵,並更高效地處理各類稀疏模式(sparsity patterns)的數據。

  3. Weighted Quantile Sketch:XGBoost 使用分佈式 weighted Quantile Sketch 算法,能夠有效地找到大多數帶權數據集的最佳分割點。

  4. 交叉驗證(Cross-validation):算法內置了在每次迭代時進行交叉驗證的方法,再也不須要顯式地去搜索與指定一輪訓練中所需的 boosting 迭代次數。


Where is the proof?

咱們使用 Scikit-learn 的 Make_Classification 數據包,建立了一個包含 100 萬個數據點、20 個特徵(其中包括 2 個信息性特徵與 2 個冗餘特徵)的隨機樣本集,並用它測試幾種算法:邏輯迴歸、隨機森林、標準梯度提高和 XGBoost。

XGBoost vs. Other ML Algorithms using SKLearn’s Make_Classification Dataset

如上圖所示,與其它算法相比,XGBoost 模型獲得了最好的預測性能與最短的處理時間。研究發現,在其它嚴格的基準測試中,也能獲得相似的結果。所以,XGBoost 在最近的數據科學比賽中被普遍採用,也是意料之中的事。

「當你猶豫不定的時候,用 XGBoost 就對了」 —— Avito Kaggle 上下文廣告點擊預測大賽冠軍 Owen Zhang 如是說。


咱們是否能夠在任何狀況都用 XGBoost?

在機器學習中(或者說在生命中),沒有免費的午飯。做爲數據科學家,必須爲手頭數據測試全部算法,以找到效果最好的算法。可是,選出正確算法還不夠,還必需要爲數據集正確地配置算法的超參數。此外,在選擇最優算法時,除了效果還要考慮其它的因素,好比計算複雜度、可解釋性、易用性等等。這正是機器學習從科學轉向藝術的部分,同時,也是魔法發生的地方!


將來會如何?

機器學習是一個很是活躍的研究領域,目前已經出現了各類各樣的 XGBoost 的變體。微軟研究院最近提出了 LightGBM 梯度提高框架,體現出了巨大的潛力。Yandex 科技開發了 CatBoost,獲得了使人印象深入的基準測試結果。出現一個在預測性能、靈活性、可解釋性和實用型都優於 XGBoost 的框架只是時間上的問題。然而,在這個更強的挑戰者到來以前,XGBoost 將繼續統治機器學習的世界!


請在下面留下你的評論。感謝 Venkat Anurag Setty 一同完成本文。

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索