机器学习-集成学习-提升树-Xgboost
?內(nèi)容整理自:ML-NLP/Machine Learning/3.3 XGBoost at master · NLP-LOVE/ML-NLP · GitHub
XGBoost——機(jī)器學(xué)習(xí)(理論+圖解+安裝方法+python代碼)_機(jī)器學(xué)習(xí)初學(xué)者必看,關(guān)注我,一起了解機(jī)器學(xué)習(xí)-CSDN博客_python xgboost 訓(xùn)練
目錄
1. 什么是XGBoost
1.1 XGBoost樹的定義
1.2 正則項(xiàng):樹的復(fù)雜度
1.3 樹該怎么長
1.4 如何停止樹的循環(huán)生成
2. XGBoost與GBDT有什么不同
3. 為什么XGBoost要用泰勒展開,優(yōu)勢在哪里?
4. XGBoost的優(yōu)勢
5. 代碼實(shí)現(xiàn)
6. 參考文獻(xiàn)
1. 什么是XGBoost
XGBoost 的全稱是eXtreme Gradient Boosting,由華盛頓大學(xué)的陳天奇博士提出,在Kaggle的希格斯子信號(hào)識(shí)別競賽中使用,因其出眾的效率與較高的預(yù)測準(zhǔn)確度而引起了廣泛的關(guān)注。
XGBoost 高效地實(shí)現(xiàn)了GBDT算法并進(jìn)行了算法和工程上的許多改進(jìn),被廣泛應(yīng)用在Kaggle競賽及其他許多機(jī)器學(xué)習(xí)競賽中并取得了不錯(cuò)的成績。
說到XGBoost,不得不提GBDT(Gradient Boosting Decision Tree)。因?yàn)閄GBoost本質(zhì)上還是一個(gè)GBDT,但是力爭把速度和效率發(fā)揮到極致,所以叫X (Extreme) GBoosted。GBDT算法只利用了一階的導(dǎo)數(shù)信息,xgboost對損失函數(shù)做了二階的泰勒展開,并在目標(biāo)函數(shù)之外加入了正則項(xiàng)對整體求最優(yōu)解,用以權(quán)衡目標(biāo)函數(shù)的下降和模型的復(fù)雜程度,避免過擬合。所以不考慮細(xì)節(jié)方面,兩者最大的不同就是目標(biāo)函數(shù)的定義。
關(guān)于GBDT,這里不再提,可以查看我前一篇的介紹,點(diǎn)此跳轉(zhuǎn)。
1.1 XGBoost樹的定義
先來舉個(gè)例子,我們要預(yù)測一家人對電子游戲的喜好程度,考慮到年輕和年老相比,年輕更可能喜歡電子游戲,以及男性和女性相比,男性更喜歡電子游戲,故先根據(jù)年齡大小區(qū)分小孩和大人,然后再通過性別區(qū)分開是男是女,逐一給各人在電子游戲喜好程度上打分,如下圖所示。
就這樣,訓(xùn)練出了2棵樹tree1和tree2,類似之前gbdt的原理,兩棵樹的結(jié)論累加起來便是最終的結(jié)論,所以小孩的預(yù)測分?jǐn)?shù)就是兩棵樹中小孩所落到的結(jié)點(diǎn)的分?jǐn)?shù)相加:2 + 0.9 = 2.9。爺爺?shù)念A(yù)測分?jǐn)?shù)同理:-1 + (-0.9)= -1.9。具體如下圖所示:
恩,你可能要拍案而起了,驚呼,這不是跟上文介紹的GBDT乃異曲同工么?
事實(shí)上,如果不考慮工程實(shí)現(xiàn)、解決問題上的一些差異,XGBoost與GBDT比較大的不同就是目標(biāo)函數(shù)的定義。XGBoost的目標(biāo)函數(shù)如下圖所示:
其中:?
- 紅色箭頭所指向的L 即為損失函數(shù)(比如平方損失函數(shù):)
- 紅色方框所框起來的是正則項(xiàng)(包括L1正則、L2正則)
- 紅色圓圈所圈起來的為常數(shù)項(xiàng)
- 對于f(x),XGBoost利用泰勒展開三項(xiàng),做一個(gè)近似。f(x)表示的是其中一顆回歸樹。
看到這里可能有些讀者會(huì)頭暈了,這么多公式,我在這里只做一個(gè)簡要式的講解,具體的算法細(xì)節(jié)和公式求解請查看這篇博文,講得很仔細(xì):通俗理解kaggle比賽大殺器xgboost
XGBoost的核心算法思想不難,基本就是:
顯然,我們的目標(biāo)是要使得樹群的預(yù)測值,?盡量接近真實(shí)值,而且有盡量大的泛化能力。類似之前GBDT的套路,XGBoost也是需要將多棵樹的得分累加得到最終的預(yù)測得分(每一次迭代,都在現(xiàn)有樹的基礎(chǔ)上,增加一棵樹去擬合前面樹的預(yù)測結(jié)果與真實(shí)值之間的殘差)。
那接下來,我們?nèi)绾芜x擇每一輪加入什么 f 呢?答案是非常直接的,選取一個(gè) f 來使得我們的目標(biāo)函數(shù)盡量最大地降低。這里 f 可以使用泰勒展開公式近似。
實(shí)質(zhì)是把樣本分配到葉子結(jié)點(diǎn)會(huì)對應(yīng)一個(gè)obj,優(yōu)化過程就是obj優(yōu)化。也就是分裂節(jié)點(diǎn)到葉子不同的組合,不同的組合對應(yīng)不同obj,所有的優(yōu)化圍繞這個(gè)思想展開。到目前為止我們討論了目標(biāo)函數(shù)中的第一個(gè)部分:訓(xùn)練誤差。接下來我們討論目標(biāo)函數(shù)的第二個(gè)部分:正則項(xiàng),即如何定義樹的復(fù)雜度。
1.2 正則項(xiàng):樹的復(fù)雜度
XGBoost對樹的復(fù)雜度包含了兩個(gè)部分:
- 一個(gè)是樹里面葉子節(jié)點(diǎn)的個(gè)數(shù)T
- 一個(gè)是樹上葉子節(jié)點(diǎn)的得分w的L2模平方(對w進(jìn)行L2正則化,相當(dāng)于針對每個(gè)葉結(jié)點(diǎn)的得分增加L2平滑,目的是為了避免過擬合)
?我們再來看一下XGBoost的目標(biāo)函數(shù)(損失函數(shù)揭示訓(xùn)練誤差 + 正則化定義復(fù)雜度):
正則化公式也就是目標(biāo)函數(shù)的后半部分,對于上式而言,?是整個(gè)累加模型的輸出,正則化項(xiàng)∑Ω(ft)是則表示樹的復(fù)雜度的函數(shù),值越小復(fù)雜度越低,泛化能力越強(qiáng)。
1.3 樹該怎么長
很有意思的一個(gè)事是,我們從頭到尾了解了xgboost如何優(yōu)化、如何計(jì)算,但樹到底長啥樣,我們卻一直沒看到。很顯然,一棵樹的生成是由一個(gè)節(jié)點(diǎn)一分為二,然后不斷分裂最終形成為整棵樹。那么樹怎么分裂的就成為了接下來我們要探討的關(guān)鍵。對于一個(gè)葉子節(jié)點(diǎn)如何進(jìn)行分裂,XGBoost作者在其原始論文中給出了一種分裂節(jié)點(diǎn)的方法:枚舉所有不同樹結(jié)構(gòu)的貪心法
不斷地枚舉不同樹的結(jié)構(gòu),然后利用打分函數(shù)來尋找出一個(gè)最優(yōu)結(jié)構(gòu)的樹,接著加入到模型中,不斷重復(fù)這樣的操作。這個(gè)尋找的過程使用的就是貪心算法。選擇一個(gè)feature分裂,計(jì)算loss function最小值,然后再選一個(gè)feature分裂,又得到一個(gè)loss function最小值,你枚舉完,找一個(gè)效果最好的,把樹給分裂,就得到了小樹苗。
總而言之,XGBoost使用了和CART回歸樹一樣的想法,利用貪婪算法,遍歷所有特征的所有特征劃分點(diǎn),不同的是使用的目標(biāo)函數(shù)不一樣。具體做法就是分裂后的目標(biāo)函數(shù)值比單子葉子節(jié)點(diǎn)的目標(biāo)函數(shù)的增益,同時(shí)為了限制樹生長過深,還加了個(gè)閾值,只有當(dāng)增益大于該閾值才進(jìn)行分裂。從而繼續(xù)分裂,形成一棵樹,再形成一棵樹,每次在上一次的預(yù)測基礎(chǔ)上取最優(yōu)進(jìn)一步分裂/建樹。
1.4 如何停止樹的循環(huán)生成
凡是這種循環(huán)迭代的方式必定有停止條件,什么時(shí)候停止呢?簡言之,設(shè)置樹的最大深度、當(dāng)樣本權(quán)重和小于設(shè)定閾值時(shí)停止生長以防止過擬合。具體而言,則
2. XGBoost與GBDT有什么不同
除了算法上與傳統(tǒng)的GBDT有一些不同外,XGBoost還在工程實(shí)現(xiàn)上做了大量的優(yōu)化。總的來說,兩者之間的區(qū)別和聯(lián)系可以總結(jié)成以下幾個(gè)方面。
3. 為什么XGBoost要用泰勒展開,優(yōu)勢在哪里?
XGBoost使用了一階和二階偏導(dǎo), 二階導(dǎo)數(shù)有利于梯度下降的更快更準(zhǔn),使用泰勒展開取得函數(shù)做自變量的二階導(dǎo)數(shù)形式, 可以在不選定損失函數(shù)具體形式的情況下, 僅僅依靠輸入數(shù)據(jù)的值就可以進(jìn)行葉子分裂優(yōu)化計(jì)算, 本質(zhì)上也就把損失函數(shù)的選取和模型算法優(yōu)化/參數(shù)選擇分開了。這種去耦合增加了XGBoost的適用性, 使得它按需選取損失函數(shù), 可以用于分類, 也可以用于回歸。
4. XGBoost的優(yōu)勢
1、正則化
標(biāo)準(zhǔn)GBM的實(shí)現(xiàn)沒有像XGBoost這樣的正則化步驟。正則化對減少過擬合也是有幫助的。
實(shí)際上,XGBoost以“正則化提升(regularized boosting)”技術(shù)而聞名。
2、并行處理
XGBoost可以實(shí)現(xiàn)并行處理,相比GBM有了速度的飛躍,LightGBM也是微軟最新推出的一個(gè)速度提升的算法。 XGBoost也支持Hadoop實(shí)現(xiàn)。
3、高度的靈活性
XGBoost 允許用戶定義自定義優(yōu)化目標(biāo)和評(píng)價(jià)標(biāo)準(zhǔn) 。
4、缺失值處理
XGBoost內(nèi)置處理缺失值的規(guī)則。用戶需要提供一個(gè)和其它樣本不同的值,然后把它作為一個(gè)參數(shù)傳進(jìn)去,以此來作為缺失值的取值。XGBoost在不同節(jié)點(diǎn)遇到缺失值時(shí)采用不同的處理方法,并且會(huì)學(xué)習(xí)未來遇到缺失值時(shí)的處理方法。
5、剪枝
當(dāng)分裂時(shí)遇到一個(gè)負(fù)損失時(shí),GBM會(huì)停止分裂。因此GBM實(shí)際上是一個(gè)貪心算法。XGBoost會(huì)一直分裂到指定的最大深度(max_depth),然后回過頭來剪枝。如果某個(gè)節(jié)點(diǎn)之后不再有正值,它會(huì)去除這個(gè)分裂。
這種做法的優(yōu)點(diǎn),當(dāng)一個(gè)負(fù)損失(如-2)后面有個(gè)正損失(如+10)的時(shí)候,就顯現(xiàn)出來了。GBM會(huì)在-2處停下來,因?yàn)樗龅搅艘粋€(gè)負(fù)值。但是XGBoost會(huì)繼續(xù)分裂,然后發(fā)現(xiàn)這兩個(gè)分裂綜合起來會(huì)得到+8,因此會(huì)保留這兩個(gè)分裂。
6、內(nèi)置交叉驗(yàn)證
XGBoost允許在每一輪boosting迭代中使用交叉驗(yàn)證。因此,可以方便地獲得最優(yōu)boosting迭代次數(shù)。
而GBM使用網(wǎng)格搜索,只能檢測有限個(gè)值。
5. 代碼實(shí)現(xiàn)
GitHub:點(diǎn)擊進(jìn)入(需要事先安裝XGBoost,可以參考這篇文章XGBoost——機(jī)器學(xué)習(xí)(理論+圖解+安裝方法+python代碼)_機(jī)器學(xué)習(xí)初學(xué)者必看,關(guān)注我,一起了解機(jī)器學(xué)習(xí)-CSDN博客_python xgboost 訓(xùn)練)
6. 參考文獻(xiàn)
通俗理解kaggle比賽大殺器xgboost
總結(jié)
以上是生活随笔為你收集整理的机器学习-集成学习-提升树-Xgboost的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最便宜的第二代骁龙7+手机!真我GT N
- 下一篇: 机器学习-集成学习-提升树-LightG