日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2023/12/19 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习-集成学习-提升树-Xgboost 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?內容整理自:ML-NLP/Machine Learning/3.3 XGBoost at master · NLP-LOVE/ML-NLP · GitHub

XGBoost——機器學習(理論+圖解+安裝方法+python代碼)_機器學習初學者必看,關注我,一起了解機器學習-CSDN博客_python xgboost 訓練

目錄

1. 什么是XGBoost

1.1 XGBoost樹的定義

1.2 正則項:樹的復雜度

1.3 樹該怎么長

1.4 如何停止樹的循環生成

2. XGBoost與GBDT有什么不同

3. 為什么XGBoost要用泰勒展開,優勢在哪里?

4. XGBoost的優勢

5. 代碼實現

6. 參考文獻


1. 什么是XGBoost

XGBoost 的全稱是eXtreme Gradient Boosting,由華盛頓大學的陳天奇博士提出,在Kaggle的希格斯子信號識別競賽中使用,因其出眾的效率與較高的預測準確度而引起了廣泛的關注。

XGBoost 高效地實現了GBDT算法并進行了算法和工程上的許多改進,被廣泛應用在Kaggle競賽及其他許多機器學習競賽中并取得了不錯的成績。

說到XGBoost,不得不提GBDT(Gradient Boosting Decision Tree)。因為XGBoost本質上還是一個GBDT,但是力爭把速度和效率發揮到極致,所以叫X (Extreme) GBoosted。GBDT算法只利用了一階的導數信息,xgboost對損失函數做了二階的泰勒展開,并在目標函數之外加入了正則項對整體求最優解,用以權衡目標函數的下降和模型的復雜程度,避免過擬合。所以不考慮細節方面,兩者最大的不同就是目標函數的定義。

關于GBDT,這里不再提,可以查看我前一篇的介紹,點此跳轉。

1.1 XGBoost樹的定義

先來舉個例子,我們要預測一家人對電子游戲的喜好程度,考慮到年輕和年老相比,年輕更可能喜歡電子游戲,以及男性和女性相比,男性更喜歡電子游戲,故先根據年齡大小區分小孩和大人,然后再通過性別區分開是男是女,逐一給各人在電子游戲喜好程度上打分,如下圖所示。

就這樣,訓練出了2棵樹tree1和tree2,類似之前gbdt的原理,兩棵樹的結論累加起來便是最終的結論,所以小孩的預測分數就是兩棵樹中小孩所落到的結點的分數相加:2 + 0.9 = 2.9。爺爺的預測分數同理:-1 + (-0.9)= -1.9。具體如下圖所示:

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

事實上,如果不考慮工程實現、解決問題上的一些差異,XGBoost與GBDT比較大的不同就是目標函數的定義。XGBoost的目標函數如下圖所示:

其中:?

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

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

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

  • 不斷地添加樹,不斷地進行特征分裂來生長一棵樹,每次添加一個樹,其實是學習一個新函數f(x),去擬合上次預測的殘差。
  • 當我們訓練完成得到k棵樹,我們要預測一個樣本的分數,其實就是根據這個樣本的特征,在每棵樹中會落到對應的一個葉子節點,每個葉子節點就對應一個分數
  • 最后只需要將每棵樹對應的分數加起來就是該樣本的預測值。
  • 顯然,我們的目標是要使得樹群的預測值,?盡量接近真實值,而且有盡量大的泛化能力。類似之前GBDT的套路,XGBoost也是需要將多棵樹的得分累加得到最終的預測得分(每一次迭代,都在現有樹的基礎上,增加一棵樹去擬合前面樹的預測結果與真實值之間的殘差)。

    那接下來,我們如何選擇每一輪加入什么 f 呢?答案是非常直接的,選取一個 f 來使得我們的目標函數盡量最大地降低。這里 f 可以使用泰勒展開公式近似。

    實質是把樣本分配到葉子結點會對應一個obj,優化過程就是obj優化。也就是分裂節點到葉子不同的組合,不同的組合對應不同obj,所有的優化圍繞這個思想展開。到目前為止我們討論了目標函數中的第一個部分:訓練誤差。接下來我們討論目標函數的第二個部分:正則項,即如何定義樹的復雜度。

    1.2 正則項:樹的復雜度

    XGBoost對樹的復雜度包含了兩個部分:

    • 一個是樹里面葉子節點的個數T
    • 一個是樹上葉子節點的得分w的L2模平方(對w進行L2正則化,相當于針對每個葉結點的得分增加L2平滑,目的是為了避免過擬合)

    ?我們再來看一下XGBoost的目標函數(損失函數揭示訓練誤差 + 正則化定義復雜度):

    正則化公式也就是目標函數的后半部分,對于上式而言,?是整個累加模型的輸出,正則化項∑Ω(ft)是則表示樹的復雜度的函數,值越小復雜度越低,泛化能力越強。

    1.3 樹該怎么長

    很有意思的一個事是,我們從頭到尾了解了xgboost如何優化、如何計算,但樹到底長啥樣,我們卻一直沒看到。很顯然,一棵樹的生成是由一個節點一分為二,然后不斷分裂最終形成為整棵樹。那么樹怎么分裂的就成為了接下來我們要探討的關鍵。對于一個葉子節點如何進行分裂,XGBoost作者在其原始論文中給出了一種分裂節點的方法:枚舉所有不同樹結構的貪心法

    不斷地枚舉不同樹的結構,然后利用打分函數來尋找出一個最優結構的樹,接著加入到模型中,不斷重復這樣的操作。這個尋找的過程使用的就是貪心算法。選擇一個feature分裂,計算loss function最小值,然后再選一個feature分裂,又得到一個loss function最小值,你枚舉完,找一個效果最好的,把樹給分裂,就得到了小樹苗。

    總而言之,XGBoost使用了和CART回歸樹一樣的想法,利用貪婪算法,遍歷所有特征的所有特征劃分點,不同的是使用的目標函數不一樣。具體做法就是分裂后的目標函數值比單子葉子節點的目標函數的增益,同時為了限制樹生長過深,還加了個閾值,只有當增益大于該閾值才進行分裂。從而繼續分裂,形成一棵樹,再形成一棵樹,每次在上一次的預測基礎上取最優進一步分裂/建樹。

    1.4 如何停止樹的循環生成

    凡是這種循環迭代的方式必定有停止條件,什么時候停止呢?簡言之,設置樹的最大深度、當樣本權重和小于設定閾值時停止生長以防止過擬合。具體而言,則

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

    除了算法上與傳統的GBDT有一些不同外,XGBoost還在工程實現上做了大量的優化。總的來說,兩者之間的區別和聯系可以總結成以下幾個方面。

  • GBDT是機器學習算法,XGBoost是該算法的工程實現。
  • 在使用CART作為基分類器時,XGBoost顯式地加入了正則項來控制模 型的復雜度,有利于防止過擬合,從而提高模型的泛化能力。
  • GBDT在模型訓練時只使用了代價函數的一階導數信息,XGBoost對代價函數進行二階泰勒展開,可以同時使用一階和二階導數,適度下降更快。
  • 傳統的GBDT采用CART作為基分類器,XGBoost支持多種類型的基分類器,比如線性分類器。
  • 傳統的GBDT在每輪迭代時使用全部的數據,XGBoost則采用了與隨機森林相似的策略,支持對數據進行采樣。
  • 傳統的GBDT沒有設計對缺失值進行處理,XGBoost能夠自動學習出缺 失值的處理策略。
  • 3. 為什么XGBoost要用泰勒展開,優勢在哪里?

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

    4. XGBoost的優勢

    1、正則化
    標準GBM的實現沒有像XGBoost這樣的正則化步驟。正則化對減少過擬合也是有幫助的。
    實際上,XGBoost以“正則化提升(regularized boosting)”技術而聞名。

    2、并行處理
    XGBoost可以實現并行處理,相比GBM有了速度的飛躍,LightGBM也是微軟最新推出的一個速度提升的算法。 XGBoost也支持Hadoop實現。

    3、高度的靈活性
    XGBoost 允許用戶定義自定義優化目標和評價標準 。

    4、缺失值處理
    XGBoost內置處理缺失值的規則。用戶需要提供一個和其它樣本不同的值,然后把它作為一個參數傳進去,以此來作為缺失值的取值。XGBoost在不同節點遇到缺失值時采用不同的處理方法,并且會學習未來遇到缺失值時的處理方法。

    5、剪枝
    當分裂時遇到一個負損失時,GBM會停止分裂。因此GBM實際上是一個貪心算法。XGBoost會一直分裂到指定的最大深度(max_depth),然后回過頭來剪枝。如果某個節點之后不再有正值,它會去除這個分裂。
    這種做法的優點,當一個負損失(如-2)后面有個正損失(如+10)的時候,就顯現出來了。GBM會在-2處停下來,因為它遇到了一個負值。但是XGBoost會繼續分裂,然后發現這兩個分裂綜合起來會得到+8,因此會保留這兩個分裂。

    6、內置交叉驗證
    XGBoost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數。
    而GBM使用網格搜索,只能檢測有限個值。

    5. 代碼實現

    GitHub:點擊進入(需要事先安裝XGBoost,可以參考這篇文章XGBoost——機器學習(理論+圖解+安裝方法+python代碼)_機器學習初學者必看,關注我,一起了解機器學習-CSDN博客_python xgboost 訓練)

    6. 參考文獻

    通俗理解kaggle比賽大殺器xgboost

    總結

    以上是生活随笔為你收集整理的机器学习-集成学习-提升树-Xgboost的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。