XGBoost 是一種集大成的機器學(xué)習(xí)算法,可用于回歸,分類和排序等各種問題,在機器學(xué)習(xí)大賽及工業(yè)領(lǐng)域被廣泛應(yīng)用。成功案例包括:網(wǎng)頁文本分類、顧客行為預(yù)測、情感挖掘、廣告點擊率預(yù)測、惡意軟件分類、物品分類、風(fēng)險評估、大規(guī)模在線課程退學(xué)率預(yù)測。 XGBoost是初學(xué)者最值得深度理解的模型之一,它將決策樹、boosting、GBDT 等知識點串聯(lián)起來,強烈建議大家都手?jǐn)]一波。本文我將從XGBoost淵源及優(yōu)點、模型原理及優(yōu)化推導(dǎo)、XGBoost模型參數(shù)解析、調(diào)參實例,XGBoost可視化等方面介紹XGBoost。提醒一下,XGBoost 是在 GBDT 基礎(chǔ)上的改進(jìn),閱讀本文需對 GBDT 有一定的了解,不熟悉的同學(xué)可以看一下前篇:100天搞定機器學(xué)習(xí)|Day58 機器學(xué)習(xí)入門:硬核拆解GBDT XGBoost淵源及優(yōu)勢在數(shù)據(jù)建模中,經(jīng)常采用Boosting方法,該方法將成百上千個分類準(zhǔn)確率較低的樹模型組合起來,成為一個準(zhǔn)確率很高的預(yù)測模型。這個模型會不斷地迭代,每次迭代就生成一顆新的樹。但在數(shù)據(jù)集較復(fù)雜的時候,可能需要幾千次迭代運算,這將造成巨大的計算瓶頸。 針對這個問題,華盛頓大學(xué)的陳天奇博士開發(fā)的XGBoost(eXtreme Gradient Boosting)基于C++通過多線程實現(xiàn)了回歸樹的并行構(gòu)建,并在原有Gradient Boosting算法基礎(chǔ)上加以改進(jìn),從而極大地提升了模型訓(xùn)練速度和預(yù)測精度。 XGBoost 主要優(yōu)勢如下: 1、GBDT在優(yōu)化時只用到一階導(dǎo)數(shù)信息,XGBoost同時用到了一階和二階導(dǎo)數(shù),還支持自定義損失函數(shù),前提是損失函數(shù)可一階和二階求導(dǎo); 2、加入了正則項,用于控制模型的復(fù)雜度,防止過擬合; 3、借鑒了隨機森林的做法,支持列抽樣(隨機選擇特征),不僅能降低過擬合,還能減少計算; 4、尋找最佳分割點時,實現(xiàn)了一種近似法,還考慮了稀疏數(shù)據(jù)集、缺失值的處理,大大提升算法的效率; 5、支持并行; 6、近似直方圖算法,用于高效地生成候選的分割點; 7、在算法實現(xiàn)時做了很多優(yōu)化,大大提升了算法的效率,內(nèi)存空間不夠時,利用了分塊、預(yù)取、壓縮、多線程協(xié)作的思想。 XGBoost模型原理及優(yōu)化推導(dǎo)XGBoost其實也是GBDT的一種,還是加性模型和前向優(yōu)化算法。 加法模型就是說強分類器由一系列弱分類器線性相加而成。一般組合形式如下: 其中,就是一個個的弱分類器,是弱分類器學(xué)習(xí)到的最優(yōu)參數(shù),就是弱學(xué)習(xí)在強分類器中所占比重,P是所有和的組合。這些弱分類器線性相加組成強分類器。 前向分步就是說在訓(xùn)練過程中,下一輪迭代產(chǎn)生的分類器是在上一輪的基礎(chǔ)上訓(xùn)練得來的。也就是可以寫成這樣的形式: XGBoost 的模型是什么樣子的呢?
與決策樹不同的是,每棵回歸樹包含了在每個葉子上的一個連續(xù)分值,我們使用來表示第i個葉子上的分值。對于一個給定樣本實例,我們會使用樹上的決策規(guī)則(由q給定)來將它分類到葉子上,并通過將相應(yīng)葉子上的分值(由w給定)做求和,計算最終的預(yù)測值。 XGBoost的學(xué)習(xí)為了在該模型中學(xué)到這些函數(shù)集合,我們會對下面的正則化目標(biāo)函數(shù)做最小化: 其中: 是損失函數(shù),常見的有 2 種: : 正則化項,用于懲罰復(fù)雜模型,避免模型過分?jǐn)M合訓(xùn)練數(shù)據(jù)。常用的正則有L1正則與L2正則: 下一步就是對目標(biāo)函數(shù)進(jìn)行學(xué)習(xí),每一次保留原來的模型不變,加入一個新的函數(shù)到我們的模型中。 其中,為第i個實例在第t次迭代時的預(yù)測,我們需要添加樹 ,然后最小化下面的目標(biāo)函數(shù): 假設(shè)損失函數(shù)使用的是平方損失 ,則上式進(jìn)一步寫為: 現(xiàn)在,我們采用泰勒展開來定義一個近似的目標(biāo)函數(shù): 其中: 分別是loss function上的一階梯度和二階梯度。 忘記基礎(chǔ)知識的同學(xué)順便重溫一下泰勒公式吧 泰勒公式(Taylor’s Formula)是一個用函數(shù)在某點的信息描述其附近取值的公式。其初衷是用多項式來近似表示函數(shù)在某點周圍的情況。 函數(shù)在處的基本形式如下 還有另外一種常見的寫法,,將在處進(jìn)行泰勒展開,得: 現(xiàn)在,我們?nèi)サ舫A?,然后重新認(rèn)識一下我們新的目標(biāo)函數(shù): 定義是葉子 j 的實例集合。將正則項帶入,展開目標(biāo)函數(shù): 看起來有點復(fù)雜,令:,,上式簡化為: 上式中是相互獨立的,是平方項。對于一個確定的結(jié)構(gòu),我們可以計算最優(yōu)的權(quán)重: 將帶入上式,計算得到的loss最優(yōu)解: 可以作為一個得分函數(shù)(scoring function)來衡量一棵樹結(jié)構(gòu)的質(zhì)量。 我們有了一個方法來衡量一棵樹有多好,現(xiàn)在來看XGBoost優(yōu)化的第二個問題:如何選擇哪個特征和特征值進(jìn)行分裂,使最終我們的損失函數(shù)最??? XGBoost特征選擇和切分點選擇指標(biāo)定義為: 具體如何分裂?XGBoost每一步選能使分裂后增益最大的分裂點進(jìn)行分裂。而分裂點的選取之前是枚舉所有分割點,這稱為完全貪婪算法(exact greedy algorithm),在所有特征上,枚舉所有可能的劃分。
當(dāng)數(shù)據(jù)量十分龐大時,Exact Greedy 算法就會很慢,因此XGBoost引入了近似的算法,和Exact Greedy很類似,這里就不再展開講了。原理推導(dǎo)(精簡版)下面是XGBoost原理推導(dǎo)的精簡版,方便同學(xué)們復(fù)習(xí)使用。 Xgboost@sklearn模型參數(shù)解析XGBoost的實現(xiàn)有原生版本,同時也有Scikit-learn版本,兩者在使用上有一些微差異,這里給出xgboost.sklearn 參數(shù)解釋。XGBoost使用key-value字典的方式存儲參數(shù): #部分重要參數(shù) 篇幅原因,調(diào)參實例及XGBoost可視化且聽下回分解。 參考https://www.cnblogs.com/pinard/p/10979808.html 推薦閱讀 (點擊標(biāo)題可跳轉(zhuǎn)閱讀) 老鐵,三連支持一下,好嗎?↓↓↓ |
|