日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

机器学习-集成学习-提升树-Xgboost

發(fā)布時(shí)間:2023/12/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习-集成学习-提升树-Xgboost 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?內(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樹(shù)的定義

1.2 正則項(xiàng):樹(shù)的復(fù)雜度

1.3 樹(shù)該怎么長(zhǎng)

1.4 如何停止樹(shù)的循環(huán)生成

2. XGBoost與GBDT有什么不同

3. 為什么XGBoost要用泰勒展開(kāi),優(yōu)勢(shì)在哪里?

4. XGBoost的優(yōu)勢(shì)

5. 代碼實(shí)現(xiàn)

6. 參考文獻(xiàn)


1. 什么是XGBoost

XGBoost 的全稱是eXtreme Gradient Boosting,由華盛頓大學(xué)的陳天奇博士提出,在Kaggle的希格斯子信號(hào)識(shí)別競(jìng)賽中使用,因其出眾的效率與較高的預(yù)測(cè)準(zhǔn)確度而引起了廣泛的關(guān)注。

XGBoost 高效地實(shí)現(xiàn)了GBDT算法并進(jìn)行了算法和工程上的許多改進(jìn),被廣泛應(yīng)用在Kaggle競(jìng)賽及其他許多機(jī)器學(xué)習(xí)競(jìng)賽中并取得了不錯(cuò)的成績(jī)。

說(shuō)到XGBoost,不得不提GBDT(Gradient Boosting Decision Tree)。因?yàn)閄GBoost本質(zhì)上還是一個(gè)GBDT,但是力爭(zhēng)把速度和效率發(fā)揮到極致,所以叫X (Extreme) GBoosted。GBDT算法只利用了一階的導(dǎo)數(shù)信息,xgboost對(duì)損失函數(shù)做了二階的泰勒展開(kāi),并在目標(biāo)函數(shù)之外加入了正則項(xiàng)對(duì)整體求最優(yōu)解,用以權(quán)衡目標(biāo)函數(shù)的下降和模型的復(fù)雜程度,避免過(guò)擬合。所以不考慮細(xì)節(jié)方面,兩者最大的不同就是目標(biāo)函數(shù)的定義。

關(guān)于GBDT,這里不再提,可以查看我前一篇的介紹,點(diǎn)此跳轉(zhuǎn)。

1.1 XGBoost樹(shù)的定義

先來(lái)舉個(gè)例子,我們要預(yù)測(cè)一家人對(duì)電子游戲的喜好程度,考慮到年輕和年老相比,年輕更可能喜歡電子游戲,以及男性和女性相比,男性更喜歡電子游戲,故先根據(jù)年齡大小區(qū)分小孩和大人,然后再通過(guò)性別區(qū)分開(kāi)是男是女,逐一給各人在電子游戲喜好程度上打分,如下圖所示。

就這樣,訓(xùn)練出了2棵樹(shù)tree1和tree2,類(lèi)似之前gbdt的原理,兩棵樹(shù)的結(jié)論累加起來(lái)便是最終的結(jié)論,所以小孩的預(yù)測(cè)分?jǐn)?shù)就是兩棵樹(shù)中小孩所落到的結(jié)點(diǎn)的分?jǐn)?shù)相加:2 + 0.9 = 2.9。爺爺?shù)念A(yù)測(cè)分?jǐn)?shù)同理:-1 + (-0.9)= -1.9。具體如下圖所示:

恩,你可能要拍案而起了,驚呼,這不是跟上文介紹的GBDT乃異曲同工么?

事實(shí)上,如果不考慮工程實(shí)現(xiàn)、解決問(wèn)題上的一些差異,XGBoost與GBDT比較大的不同就是目標(biāo)函數(shù)的定義。XGBoost的目標(biāo)函數(shù)如下圖所示:

其中:?

  • 紅色箭頭所指向的L 即為損失函數(shù)(比如平方損失函數(shù):)
  • 紅色方框所框起來(lái)的是正則項(xiàng)(包括L1正則、L2正則)
  • 紅色圓圈所圈起來(lái)的為常數(shù)項(xiàng)
  • 對(duì)于f(x),XGBoost利用泰勒展開(kāi)三項(xiàng),做一個(gè)近似。f(x)表示的是其中一顆回歸樹(shù)。

看到這里可能有些讀者會(huì)頭暈了,這么多公式,我在這里只做一個(gè)簡(jiǎn)要式的講解,具體的算法細(xì)節(jié)和公式求解請(qǐng)查看這篇博文,講得很仔細(xì):通俗理解kaggle比賽大殺器xgboost

XGBoost的核心算法思想不難,基本就是:

  • 不斷地添加樹(shù),不斷地進(jìn)行特征分裂來(lái)生長(zhǎng)一棵樹(shù),每次添加一個(gè)樹(shù),其實(shí)是學(xué)習(xí)一個(gè)新函數(shù)f(x),去擬合上次預(yù)測(cè)的殘差。
  • 當(dāng)我們訓(xùn)練完成得到k棵樹(shù),我們要預(yù)測(cè)一個(gè)樣本的分?jǐn)?shù),其實(shí)就是根據(jù)這個(gè)樣本的特征,在每棵樹(shù)中會(huì)落到對(duì)應(yīng)的一個(gè)葉子節(jié)點(diǎn),每個(gè)葉子節(jié)點(diǎn)就對(duì)應(yīng)一個(gè)分?jǐn)?shù)
  • 最后只需要將每棵樹(shù)對(duì)應(yīng)的分?jǐn)?shù)加起來(lái)就是該樣本的預(yù)測(cè)值。
  • 顯然,我們的目標(biāo)是要使得樹(shù)群的預(yù)測(cè)值,?盡量接近真實(shí)值,而且有盡量大的泛化能力。類(lèi)似之前GBDT的套路,XGBoost也是需要將多棵樹(shù)的得分累加得到最終的預(yù)測(cè)得分(每一次迭代,都在現(xiàn)有樹(shù)的基礎(chǔ)上,增加一棵樹(shù)去擬合前面樹(shù)的預(yù)測(cè)結(jié)果與真實(shí)值之間的殘差)。

    那接下來(lái),我們?nèi)绾芜x擇每一輪加入什么 f 呢?答案是非常直接的,選取一個(gè) f 來(lái)使得我們的目標(biāo)函數(shù)盡量最大地降低。這里 f 可以使用泰勒展開(kāi)公式近似。

    實(shí)質(zhì)是把樣本分配到葉子結(jié)點(diǎn)會(huì)對(duì)應(yīng)一個(gè)obj,優(yōu)化過(guò)程就是obj優(yōu)化。也就是分裂節(jié)點(diǎn)到葉子不同的組合,不同的組合對(duì)應(yīng)不同obj,所有的優(yōu)化圍繞這個(gè)思想展開(kāi)。到目前為止我們討論了目標(biāo)函數(shù)中的第一個(gè)部分:訓(xùn)練誤差。接下來(lái)我們討論目標(biāo)函數(shù)的第二個(gè)部分:正則項(xiàng),即如何定義樹(shù)的復(fù)雜度。

    1.2 正則項(xiàng):樹(shù)的復(fù)雜度

    XGBoost對(duì)樹(shù)的復(fù)雜度包含了兩個(gè)部分:

    • 一個(gè)是樹(shù)里面葉子節(jié)點(diǎn)的個(gè)數(shù)T
    • 一個(gè)是樹(shù)上葉子節(jié)點(diǎn)的得分w的L2模平方(對(duì)w進(jìn)行L2正則化,相當(dāng)于針對(duì)每個(gè)葉結(jié)點(diǎn)的得分增加L2平滑,目的是為了避免過(guò)擬合)

    ?我們?cè)賮?lái)看一下XGBoost的目標(biāo)函數(shù)(損失函數(shù)揭示訓(xùn)練誤差 + 正則化定義復(fù)雜度):

    正則化公式也就是目標(biāo)函數(shù)的后半部分,對(duì)于上式而言,?是整個(gè)累加模型的輸出,正則化項(xiàng)∑Ω(ft)是則表示樹(shù)的復(fù)雜度的函數(shù),值越小復(fù)雜度越低,泛化能力越強(qiáng)。

    1.3 樹(shù)該怎么長(zhǎng)

    很有意思的一個(gè)事是,我們從頭到尾了解了xgboost如何優(yōu)化、如何計(jì)算,但樹(shù)到底長(zhǎng)啥樣,我們卻一直沒(méi)看到。很顯然,一棵樹(shù)的生成是由一個(gè)節(jié)點(diǎn)一分為二,然后不斷分裂最終形成為整棵樹(shù)。那么樹(shù)怎么分裂的就成為了接下來(lái)我們要探討的關(guān)鍵。對(duì)于一個(gè)葉子節(jié)點(diǎn)如何進(jìn)行分裂,XGBoost作者在其原始論文中給出了一種分裂節(jié)點(diǎn)的方法:枚舉所有不同樹(shù)結(jié)構(gòu)的貪心法

    不斷地枚舉不同樹(shù)的結(jié)構(gòu),然后利用打分函數(shù)來(lái)尋找出一個(gè)最優(yōu)結(jié)構(gòu)的樹(shù),接著加入到模型中,不斷重復(fù)這樣的操作。這個(gè)尋找的過(guò)程使用的就是貪心算法。選擇一個(gè)feature分裂,計(jì)算loss function最小值,然后再選一個(gè)feature分裂,又得到一個(gè)loss function最小值,你枚舉完,找一個(gè)效果最好的,把樹(shù)給分裂,就得到了小樹(shù)苗。

    總而言之,XGBoost使用了和CART回歸樹(shù)一樣的想法,利用貪婪算法,遍歷所有特征的所有特征劃分點(diǎn),不同的是使用的目標(biāo)函數(shù)不一樣。具體做法就是分裂后的目標(biāo)函數(shù)值比單子葉子節(jié)點(diǎn)的目標(biāo)函數(shù)的增益,同時(shí)為了限制樹(shù)生長(zhǎng)過(guò)深,還加了個(gè)閾值,只有當(dāng)增益大于該閾值才進(jìn)行分裂。從而繼續(xù)分裂,形成一棵樹(shù),再形成一棵樹(shù),每次在上一次的預(yù)測(cè)基礎(chǔ)上取最優(yōu)進(jìn)一步分裂/建樹(shù)。

    1.4 如何停止樹(shù)的循環(huán)生成

    凡是這種循環(huán)迭代的方式必定有停止條件,什么時(shí)候停止呢?簡(jiǎn)言之,設(shè)置樹(shù)的最大深度、當(dāng)樣本權(quán)重和小于設(shè)定閾值時(shí)停止生長(zhǎng)以防止過(guò)擬合。具體而言,則

  • 當(dāng)引入的分裂帶來(lái)的增益小于設(shè)定閥值的時(shí)候,我們可以忽略掉這個(gè)分裂,所以并不是每一次分裂loss function整體都會(huì)增加的,有點(diǎn)預(yù)剪枝的意思,閾值參數(shù)為(即正則項(xiàng)里葉子節(jié)點(diǎn)數(shù)T的系數(shù));
  • 當(dāng)樹(shù)達(dá)到最大深度時(shí)則停止建立決策樹(shù),設(shè)置一個(gè)超參數(shù)max_depth,避免樹(shù)太深導(dǎo)致學(xué)習(xí)局部樣本,從而過(guò)擬合;
  • 樣本權(quán)重和小于設(shè)定閾值時(shí)則停止建樹(shù)。什么意思呢,即涉及到一個(gè)超參數(shù)-最小的樣本權(quán)重和min_child_weight,和GBM的 min_child_leaf 參數(shù)類(lèi)似,但不完全一樣。大意就是一個(gè)葉子節(jié)點(diǎn)樣本太少了,也終止同樣是防止過(guò)擬合;
  • 2. XGBoost與GBDT有什么不同

    除了算法上與傳統(tǒng)的GBDT有一些不同外,XGBoost還在工程實(shí)現(xiàn)上做了大量的優(yōu)化。總的來(lái)說(shuō),兩者之間的區(qū)別和聯(lián)系可以總結(jié)成以下幾個(gè)方面。

  • GBDT是機(jī)器學(xué)習(xí)算法,XGBoost是該算法的工程實(shí)現(xiàn)。
  • 在使用CART作為基分類(lèi)器時(shí),XGBoost顯式地加入了正則項(xiàng)來(lái)控制模 型的復(fù)雜度,有利于防止過(guò)擬合,從而提高模型的泛化能力。
  • GBDT在模型訓(xùn)練時(shí)只使用了代價(jià)函數(shù)的一階導(dǎo)數(shù)信息,XGBoost對(duì)代價(jià)函數(shù)進(jìn)行二階泰勒展開(kāi),可以同時(shí)使用一階和二階導(dǎo)數(shù),適度下降更快。
  • 傳統(tǒng)的GBDT采用CART作為基分類(lèi)器,XGBoost支持多種類(lèi)型的基分類(lèi)器,比如線性分類(lèi)器。
  • 傳統(tǒng)的GBDT在每輪迭代時(shí)使用全部的數(shù)據(jù),XGBoost則采用了與隨機(jī)森林相似的策略,支持對(duì)數(shù)據(jù)進(jìn)行采樣。
  • 傳統(tǒng)的GBDT沒(méi)有設(shè)計(jì)對(duì)缺失值進(jìn)行處理,XGBoost能夠自動(dòng)學(xué)習(xí)出缺 失值的處理策略。
  • 3. 為什么XGBoost要用泰勒展開(kāi),優(yōu)勢(shì)在哪里?

    XGBoost使用了一階和二階偏導(dǎo), 二階導(dǎo)數(shù)有利于梯度下降的更快更準(zhǔn),使用泰勒展開(kāi)取得函數(shù)做自變量的二階導(dǎo)數(shù)形式, 可以在不選定損失函數(shù)具體形式的情況下, 僅僅依靠輸入數(shù)據(jù)的值就可以進(jìn)行葉子分裂優(yōu)化計(jì)算, 本質(zhì)上也就把損失函數(shù)的選取和模型算法優(yōu)化/參數(shù)選擇分開(kāi)了。這種去耦合增加了XGBoost的適用性, 使得它按需選取損失函數(shù), 可以用于分類(lèi), 也可以用于回歸。

    4. XGBoost的優(yōu)勢(shì)

    1、正則化
    標(biāo)準(zhǔn)GBM的實(shí)現(xiàn)沒(méi)有像XGBoost這樣的正則化步驟。正則化對(duì)減少過(guò)擬合也是有幫助的。
    實(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)去,以此來(lái)作為缺失值的取值。XGBoost在不同節(jié)點(diǎn)遇到缺失值時(shí)采用不同的處理方法,并且會(huì)學(xué)習(xí)未來(lái)遇到缺失值時(shí)的處理方法。

    5、剪枝
    當(dāng)分裂時(shí)遇到一個(gè)負(fù)損失時(shí),GBM會(huì)停止分裂。因此GBM實(shí)際上是一個(gè)貪心算法。XGBoost會(huì)一直分裂到指定的最大深度(max_depth),然后回過(guò)頭來(lái)剪枝。如果某個(gè)節(jié)點(diǎn)之后不再有正值,它會(huì)去除這個(gè)分裂。
    這種做法的優(yōu)點(diǎn),當(dāng)一個(gè)負(fù)損失(如-2)后面有個(gè)正損失(如+10)的時(shí)候,就顯現(xiàn)出來(lái)了。GBM會(huì)在-2處停下來(lái),因?yàn)樗龅搅艘粋€(gè)負(fù)值。但是XGBoost會(huì)繼續(xù)分裂,然后發(fā)現(xiàn)這兩個(gè)分裂綜合起來(lái)會(huì)得到+8,因此會(huì)保留這兩個(gè)分裂。

    6、內(nèi)置交叉驗(yàn)證
    XGBoost允許在每一輪boosting迭代中使用交叉驗(yàn)證。因此,可以方便地獲得最優(yōu)boosting迭代次數(shù)。
    而GBM使用網(wǎng)格搜索,只能檢測(cè)有限個(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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。