什么是 XGBoost,?如何直觀理解 XGBoost,?它為什么這么優(yōu)秀,?
我對十五年前第一天工作的情況還記憶猶新,。彼時我剛畢業(yè),在一家全球投資銀行做分析師,。我打著領(lǐng)帶,,試圖記住學(xué)到的每一件事。與此同時,,在內(nèi)心深處,,我很懷疑自己是否可以勝任這份工作。感受到我的焦慮后,,老板笑著說:
「別擔(dān)心,,你只需要了解回歸模型就可以了,?!?/p>
我當(dāng)初想的是「我知道這個!」,。我知道回歸模型——線性回歸和 logistic 回歸都知道,。老板是對的。我在任職期間僅僅構(gòu)建了基于回歸的統(tǒng)計模型。我并不是一個人,。事實上,,當(dāng)時的回歸模型在預(yù)測分析中獨占鰲頭。而十五年后的今天,,回歸模型的時代已經(jīng)結(jié)束了,。遲暮的女王已經(jīng)退場,取而代之的是名字時髦,、活力滿滿的新女王——XGBoost(Exterme Gradient Boosting,,極限梯度提升)。
什么是 XGBoost,?
XGBoost 是基于決策樹的集成機(jī)器學(xué)習(xí)算法,,它以梯度提升(Gradient Boost)為框架。在非結(jié)構(gòu)數(shù)據(jù)(圖像,、文本等)的預(yù)測問題中,,人工神經(jīng)網(wǎng)絡(luò)的表現(xiàn)要優(yōu)于其他算法或框架。但在處理中小型結(jié)構(gòu)數(shù)據(jù)或表格數(shù)據(jù)時,,現(xiàn)在普遍認(rèn)為基于決策樹的算法是最好的,。下圖列出了近年來基于樹的算法的演變過程:
從決策樹到 XGBoost 算法的演變。
XGBoost 算法最初是華盛頓大學(xué)的一個研究項目,。陳天奇和 Carlos Guestrin 在 SIGKDD 2016 大會上發(fā)表的論文《XGBoost: A Scalable Tree Boosting System》在整個機(jī)器學(xué)習(xí)領(lǐng)域引起轟動,。自發(fā)表以來,該算法不僅多次贏得 Kaggle 競賽,,還應(yīng)用在多個前沿工業(yè)應(yīng)用中,,并推動其發(fā)展。許多數(shù)據(jù)科學(xué)家合作參與了 XGBoost 開源項目,,GitHub 上的這一項目(https://github.com/dmlc/xgboost/)約有 350 個貢獻(xiàn)者,,以及 3600 多條提交。和其他算法相比,,XGBoost 算法的不同之處有以下幾點:
應(yīng)用范圍廣泛:該算法可以解決回歸,、分類、排序以及用戶自定義的預(yù)測問題,;
可移植性:該算法可以在 Windows,、Linux 和 OS X 上流暢地運行;
語言:支持包括 C++,、Python,、R、Java,、Scala 和 Julia 在內(nèi)的幾乎所有主流編程語言,;
云集成:支持 AWS,、Azure 和 Yarn 集群,也可以很好地配合 Flink,、 Spark 等其他生態(tài)系統(tǒng),。
對 XGBoost 的直觀理解
決策樹是易于可視化、可解釋性相對較強的算法,,但是要建立下一代基于樹的算法的直觀理解可能就有些棘手了,。為了更好地理解基于樹的算法的演變過程,我對其做了簡單的類比:
假設(shè)你是面試官,,要面試幾名資歷非常優(yōu)秀的求職者,。基于樹的算法演變過程的每一步都可以類比為不同版本的面試場景,。
決策樹:每一名面試官都有一套自己的面試標(biāo)準(zhǔn),,比如教育水平、工作經(jīng)驗以及面試表現(xiàn)等,。決策樹類似于面試官根據(jù)他(她)自己的標(biāo)準(zhǔn)面試求職者,。
袋裝法(Bagging):現(xiàn)在面試官不只有一個人,而是一整個面試小組,,小組中的每位面試官都有投票權(quán),。Bagging(Boostrap Aggregating)就是通過民主投票過程,綜合所有面試官的投票,,然后做出最終決定,。
隨機(jī)森林(Random Forest):這是基于 Bagging 的算法,但與 Bagging 有明顯區(qū)別——它隨機(jī)選擇特征子集,。也就是,,每位面試官只會隨機(jī)選擇一些側(cè)面來對求職者進(jìn)行面試(比如測試編程技能的技術(shù)面或者是評估非技術(shù)技能的行為面試)。
Boosting:這是一種替代方法,,每位面試官根據(jù)前一位面試官的反饋來調(diào)整評估標(biāo)準(zhǔn),。通過部署更動態(tài)的評估流程來「提升」面試效率。
梯度提升(Gradient Boosting):這是 Boosting 的特例,,這種算法通過梯度下降算法來最小化誤差,。用面試類比的話,就是戰(zhàn)略咨詢公司用案例面試來剔除那些不符合要求的求職者,;
XGBoost:將 XGBoost 視為「打了雞血」的梯度提升(將這種算法稱為「極限梯度提升」是有原因的?。_@是軟硬件優(yōu)化技術(shù)的完美結(jié)合,,它可以在最短時間內(nèi)用更少的計算資源得到更好的結(jié)果,。
為什么 XGBoost 如此優(yōu)秀?
XGBoost 和梯度提升機(jī)(Gradient Boosting Machine,,GBM)都是用梯度下降架構(gòu)增強弱學(xué)習(xí)器(一般是 CART)的集成樹方法,。但 XGBoost 通過系統(tǒng)優(yōu)化和算法增強改進(jìn)了基礎(chǔ) GBM 框架,。
XGBoost 是如何優(yōu)化標(biāo)準(zhǔn) GBM 算法的
系統(tǒng)優(yōu)化
并行:XGBoost 用并行的方式實現(xiàn)了序列樹的構(gòu)建過程,??紤]到用于構(gòu)建基礎(chǔ)學(xué)習(xí)器的循環(huán)、枚舉樹的葉節(jié)點的外部循環(huán)以及計算特征的第二個內(nèi)部循環(huán)的可互換性,,這是完全有可能實現(xiàn)的,。由于沒有完整的內(nèi)部循環(huán)就無法啟動外部循環(huán)(兩個循環(huán)要求的計算資源更多),因此這種嵌套的循環(huán)限制了并行,。為了改善運行時,,就要交換循環(huán)的順序,這通過對所有實例進(jìn)行全局掃描來執(zhí)行初始化以及用并行線程排序來實現(xiàn),。這樣的變換抵消了計算中并行所需的開銷,,從而提升了算法性能。
剪枝:從本質(zhì)上講 GBM 框架內(nèi)樹分裂的停止標(biāo)準(zhǔn)是貪婪的,,這取決于分裂點的負(fù)損失,。XGBoost 優(yōu)先使用指定的「max_depth」參數(shù),然后開始后向修剪樹,。這種「深度優(yōu)先」的方法顯著提升了計算性能,。
硬件優(yōu)化:XGBoost 算法可以有效利用硬件資源。這是通過緩存感知(cache awareness)實現(xiàn)的,,而緩存感知則是通過在每個線程中分配內(nèi)部緩沖區(qū)來存儲梯度統(tǒng)計信息實現(xiàn)的,。「核外」計算等進(jìn)一步增強措施則在處理與內(nèi)存不兼容的大數(shù)據(jù)幀時優(yōu)化了可用磁盤空間,。
算法增強:
正則化:用 LASSO(L1)正則化和 Ridge(L2)正則化懲罰更復(fù)雜的模型,,以防止過擬合。
稀疏性感知(Sparsity Awareness):XGBoost 根據(jù)訓(xùn)練損失自動「學(xué)習(xí)」最佳缺失值,,從而承認(rèn)輸入的稀疏特征,,還可以更高效地處理數(shù)據(jù)中不同類型的稀疏模式。
加權(quán)分位數(shù)略圖(Weighted Quantile Sketch):XGBoost 用分布式加權(quán)分位數(shù)略圖算法(https://arxiv.org/pdf/1603.02754.pdf)高效地從加權(quán)數(shù)據(jù)集中找到最佳分裂點,。
交叉驗證:該算法在每次迭代時都使用內(nèi)置的交叉驗證方法,,這樣就無需特地為搜索編程,也不需要每次運行時都指定所需迭代增強的確切數(shù)目,。
證據(jù)在哪里,?
我們用 Scikit-learn 中的「Make_Classification」(https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html)數(shù)據(jù)包創(chuàng)建包含 100 萬個數(shù)據(jù)點的隨機(jī)樣本,其中包含 20 個特征(2 個是信息性的,,2 個是冗余的),。我們測試了幾種算法,比如 Logistic 回歸,、隨機(jī)森林,、標(biāo)準(zhǔn)梯度提升,,以及 XGBoost。
使用 SKLearn 中 Make_Classification 數(shù)據(jù)集的 XGBoost 算法和其他 ML 算法,。
如上圖所示,,和其他算法相比,結(jié)合預(yù)測性能和處理時間兩項來看,,XGBoost 是最好的,。其他嚴(yán)格的基準(zhǔn)研究(https://github.com/szilard/benchm-ml)也得到了類似的結(jié)果。這也難怪 XGBoost 廣泛應(yīng)用于近期的數(shù)據(jù)科學(xué)競賽了,。
「如有疑問,,用 XGBoost 就好」——Owe Zhang,Kaggle Avito 上下文廣告點擊大賽冠軍,。
那么我們應(yīng)該一直用 XGBoost 嗎,?
無論是機(jī)器學(xué)習(xí)還是生活,沒有免費的午餐都是一條鐵律,。作為數(shù)據(jù)科學(xué)家,,我們必須要測試所有能處理手頭數(shù)據(jù)的算法,才能判斷哪種算法是最好的,。此外,,只是選擇正確的算法還不夠。我們必須針對要處理的數(shù)據(jù)集調(diào)整超參數(shù),,從而選擇合適的配置,。此外,要選擇合適的算法還要考慮其他因素,,比如計算復(fù)雜度,、可解釋性以及易于實現(xiàn)性。這是機(jī)器學(xué)習(xí)從科學(xué)走向藝術(shù)的開始,,但說實話,,這也正是見證奇跡的時刻!