XGBoost算法原理小結

2020-12-17 機器學習算法那些事

前言

XGBoost(eXtreme Gradient Boosting)全名叫極端梯度提升,XGBoost是集成學習方法的王牌,在Kaggle數據挖掘比賽中,大部分獲勝者用了XGBoost,XGBoost在絕大多數的回歸和分類問題上表現的十分頂尖,本文較詳細的介紹了XGBoost的算法原理。

目錄

1. 最優模型的構建方法

2. Boosting的回歸思想

3. XGBoost的目標函數推導

4. XGBoost的回歸樹構建方法

5. XGBoost與GDBT的區別

最優模型的構建方法

構建最優模型的一般方法是最小化訓練數據的損失函數,我們用字母 L表示,如下式:

式(1)稱為經驗風險最小化,訓練得到的模型複雜度較高。當訓練數據較小時,模型很容易出現過擬合問題。

因此,為了降低模型的複雜度,常採用下式:

其中J(f)為模型的複雜度,式(2)稱為結構風險最小化,結構風險最小化的模型往往對訓練數據以及未知的測試數據都有較好的預測 。

應用:決策樹的生成和剪枝分別對應了經驗風險最小化和結構風險最小化,XGBoost的決策樹生成是結構風險最小化的結果,後續會詳細介紹。

Boosting方法的回歸思想

Boosting法是結合多個弱學習器給出最終的學習結果,不管任務是分類或回歸,我們都用回歸任務的思想來構建最優Boosting模型 。

回歸思想:把每個弱學習器的輸出結果當成連續值,這樣做的目的是可以對每個弱學習器的結果進行累加處理,且能更好的利用損失函數來優化模型。

假設

是第 t 輪弱學習器的輸出結果,

是模型的輸出結果,

是實際輸出結果,表達式如下:

上面兩式就是加法模型,都默認弱學習器的輸出結果是連續值。因為回歸任務的弱學習器本身是連續值,所以不做討論,下面詳細介紹分類任務的回歸思想。

分類任務的回歸思想:

根據2.1式的結果,得到最終的分類器:

分類的損失函數一般選擇指數函數或對數函數,這裡假設損失函數為對數函數,學習器的損失函數是

若實際輸出結果yi=1,則:

求(2.5)式對

的梯度,得:

負梯度方向是損失函數下降最快的方向,(2.6)式取反的值大於0,因此弱學習器是往增大

的方向迭代的,圖形表示為:

如上圖,當樣本的實際標記 yi 是 1 時,模型輸出結果

隨著迭代次數的增加而增加(紅線箭頭),模型的損失函數相應的減小;當樣本的實際標記 yi 是 -1時,模型輸出結果

隨著迭代次數的增加而減小(紅線箭頭),模型的損失函數相應的減小 。這就是加法模型的原理所在,通過多次的迭代達到減小損失函數的目的。

小結:Boosting方法把每個弱學習器的輸出看成是連續值,使得損失函數是個連續值,因此可以通過弱學習器的迭代達到優化模型的目的,這也是集成學習法加法模型的原理所在 。

XGBoost算法的目標函數推導

目標函數,即損失函數,通過最小化損失函數來構建最優模型,由第一節可知, 損失函數應加上表示模型複雜度的正則項,且XGBoost對應的模型包含了多個CART樹,因此,模型的目標函數為:

(3.1)式是正則化的損失函數,等式右邊第一部分是模型的訓練誤差,第二部分是正則化項,這裡的正則化項是K棵樹的正則化項相加而來的。

CART樹的介紹:

上圖為第K棵CART樹,確定一棵CART樹需要確定兩部分,第一部分就是樹的結構,這個結構將輸入樣本映射到一個確定的葉子節點上,記為

。第二部分就是各個葉子節點的值,q(x)表示輸出的葉子節點序號,

表示對應葉子節點序號的值。由定義得:

樹的複雜度定義

XGBoost法對應的模型包含了多棵cart樹,定義每棵樹的複雜度:

其中T為葉子節點的個數,||w||為葉子節點向量的模 。γ表示節點切分的難度,λ表示L2正則化係數。

如下例樹的複雜度表示:

目標函數推導

根據(3.1)式,共進行t次迭代的學習模型的目標函數為:

泰勒公式的二階導近似表示:

為Δx,則(3.5)式的二階近似展開:

其中:

表示前t-1棵樹組成的學習模型的預測誤差,gi和hi分別表示預測誤差對當前模型的一階導和二階導 ,當前模型往預測誤差減小的方向進行迭代。

忽略(3.8)式常數項,並結合(3.4)式,得:

通過(3.2)式簡化(3.9)式:

(3.10)式第一部分是對所有訓練樣本集進行累加,因為所有樣本都是映射為樹的葉子節點,我們換種思維,從葉子節點出發,對所有的葉子節點進行累加,得:

Gj 表示映射為葉子節點 j 的所有輸入樣本的一階導之和,同理,Hj表示二階導之和。

得:

對於第 t 棵CART樹的某一個確定結構(可用q(x)表示),其葉子節點是相互獨立的,Gj和Hj是確定量,因此,(3.12)可以看成是關於葉子節點的一元二次函數 。最小化(3.12)式,得:

得到最終的目標函數:

(3.14)也稱為打分函數(scoring function),它是衡量樹結構好壞的標準,值越小,代表這樣的結構越好 。我們用打分函數選擇最佳切分點,從而構建CART樹。

CART回歸樹的構建方法

上節推導得到的打分函數是衡量樹結構好壞的標準,因此,可用打分函數來選擇最佳切分點。首先確定樣本特徵的所有切分點,對每一個確定的切分點進行切分,切分好壞的標準如下:

Gain表示單節點obj*與切分後的兩個節點的樹obj*之差,遍歷所有特徵的切分點,找到最大Gain的切分點即是最佳分裂點,根據這種方法繼續切分節點,得到CART樹。若 γ 值設置的過大,則Gain為負,表示不切分該節點,因為切分後的樹結構變差了。γ值越大,表示對切分後obj下降幅度要求越嚴,這個值可以在XGBoost中設定。

XGBoost與GDBT的區別

1. XGBoost生成CART樹考慮了樹的複雜度,GDBT未考慮,GDBT在樹的剪枝步驟中考慮了樹的複雜度。

2. XGBoost是擬合上一輪損失函數的二階導展開,GDBT是擬合上一輪損失函數的一階導展開,因此,XGBoost的準確性更高,且滿足相同的訓練效果,需要的迭代次數更少。

3. XGBoost與GDBT都是逐次迭代來提高模型性能,但是XGBoost在選取最佳切分點時可以開啟多線程進行,大大提高了運行速度。

PS:本節只選取了與本文內容相關的幾個區別。

參考

陳天奇 《XGBoost:A Scalable Tree Boosting System》

李航 《統計學習方法》

-END-

相關焦點

  • 【機器學習】XGBoost算法學習小結
    XGBoost概述    xgboost 是"極端梯度上升"(Extreme Gradient Boosting)的簡稱,是一種現在在數據科學競賽的獲勝方案很流行的算法,它的流行源於在著名的Kaggle數據科學競賽上被稱為"奧託分類"的挑戰。由於
  • 從零解讀 Xgboost 算法 (原理+代碼)
    文中涉及到的公式和註解都可以左右滑動查看全部,涉及到的代碼去這裡下載:https://github.com/DA-southampton/NLP_ability全文目錄如下:0.提升樹1. xgboost原理解讀1.0 學習路徑:1.1
  • 資料|陳天奇介紹Xgboost原理的PPT
    from=leiphonecolumn_res0929【 圖片來源:https://xgboost.apachecn.org/所有者:https://xgboost.apachecn.org/ 】內容簡介陳天奇介紹Xgboost原理的PPT,用於學習xgboost原理。XGBoost是一個優化的分布式梯度增強庫,旨在實現高效,靈活和便攜。
  • Python XGBoost算法代碼實現和篩選特徵應用
    一、算法原理之前一直有聽說GBM,GBDT(Gradient Boost Decision Tree)漸進梯度決策樹GBRT(Gradient Boost RegressionTree)漸進梯度回歸樹是GBDT的一種,因為GBDT核心是累加所有樹的結果作為最終結果,而分類樹的結果是沒法累加的,所以GBDT中的樹都是回歸樹,不是分類樹。
  • Hessian矩陣在XGBoost算法的應用小結
    本文深入淺出的總結了Hessian矩陣在XGboost算法中的兩種應用,即權重分位點算法和樣本權重和算法 。其中,L 表示損失函數,y和越大,損失函數越小,(2.7)式越接近於0 。(2)、當yi為0時,
  • 第113天: Python XGBoost 算法項目實戰
    XGBoost高效地實現了GBDT算法並進行了算法和工程上的許多改進,被廣泛應用在Kaggle競賽及其他許多機器學習競賽中並取得了不錯的成績。這一篇最適合剛剛接觸XGBoost的人閱讀,通過一個實戰項目拆解整個XGBoost算法。
  • 資源 | XGBoost 中文文檔開放:上去就是一把梭
    中文文檔地址:http://xgboost.apachecn.org/cn/latest/英文文檔地址:http://xgboost.apachecn.org/en/latest/中文文檔 GitHub 地址:https://github.com/apachecn/xgboost-doc-zh梯度提升樹已經在實踐中證明可以有效地用於分類和回歸任務的預測挖掘
  • 我的XGBoost學習經歷及動手實踐
    引入基本工具庫:import numpy as npimport pandas as pdimport xgboost as xgbimport matplotlib.pyplot as pltplt.style.use("ggplot")%matplotlib inline2.
  • 機器學習實戰|GBDT Xgboost LightGBM對比
    import xgboost as xgbimport numpy as npimport time# read data into Xgboost DMatrix formatdtrain = xgb.DMatrix(Xtrain
  • 機器學習算法XGBoost原理和實踐(下)
    機器學習算法XGBoost原理和實踐(上)這篇文章中已經講了xgboost的基本原理,不了解的可以點擊查看,這篇文章將介紹xgboost的實踐,= xgb.DMatrix(X_train, label=y_train)xg_test = xgb.DMatrix(X_test, label=y_test)watchlist = [(xg_train, 'train'), (xg_test, 'test')]
  • XGBoost之切分點算法
    前言上文介紹了XGBoost的算法原理並引出了衡量樹結構好壞的打分函數(目標函數),根據特徵切分點前後的打分函數選擇最佳切分點,但並未對節點的切分算法作詳細的介紹。本文詳細的介紹了XGBoost的切分點算法,內容參考陳天奇博士《XGBoost :A scalable Tree Boosting System》。
  • 數學推導+純Python實現機器學習算法17:XGBoost
    XGBoost與GBDT同出一脈,都屬於boosting集成學習算法,但XGBoost相較於GBDT要青出於藍而勝於藍。     XGBoost的全程為eXtreme Gradient Boosting,即極端梯度提升樹。
  • XGBoost算法
    XGBoost(eXtreme Gradient Boosting)算法近年來在各種比賽中可謂是「香餑餑」,預測性能很好。下面我們就來介紹它的原理。 原理 首先,我們要了解的是,XGBoost是GBDT算法的一種改進。
  • 機器學習 | 機器學習之XGBoost Part2
    XGB因此引入了模型複雜度來衡量算法的運算效率。因此XGB的目標函數被寫作:傳統損失函數 + 模型複雜度。試試看在其他參數相同的情況下,我們xgboost庫本身和sklearn比起來,效果如何:#默認reg:linearreg = XGBR(n_estimators=180,random_state=420).fit(Xtrain,Ytrain)reg.score(Xtest, Ytest)#sklearn調用方法結果#0.9050526026617368
  • 大戰三回合:XGBoost、LightGBM和Catboost一決高低
    但在大訓練樣本和高維度特徵的數據環境下,GBDT 算法的性能以及準確性卻面臨了極大的挑戰,隨後,2017 年 LightGBM 應勢而生,由微軟開源的一個機器學習框架;同年,俄羅斯的搜索巨頭 Yandex 開源 Catboost 框架。
  • 100天搞定機器學習|Day61 手算+可視化,終於徹底理解了 XGBoost
    #本文用到的庫import numpy as npimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn import preprocessingfrom xgboost.sklearn
  • 數學推導 + 純 Python 實現 XGBoost
    XGBoost與GBDT同出一脈,都屬於boosting集成學習算法,但XGBoost相較於GBDT要青出於藍而勝於藍。XGBoost的全程為eXtreme Gradient Boosting,即極端梯度提升樹。
  • Bagging與隨機森林算法原理小結
    在集成學習原理小結中,我們講到了集成學習有兩個流派,一個是boosting派系,它的特點是各個弱學習器之間有依賴關係。
  • SHAP——Xgboost的歸因新境界
    Learning with XGBoosthttps://towardsdatascience.com/interpretable-machine-learning-with-xgboost-9ec80d148d27Understand your dataset with XGBoosthttps://cran.r-project.org/web/packages/xgboost
  • 【機器學習基礎】xgboost系列丨xgboost建樹過程分析及代碼實現
    <<  左右滑動查看更多  >>import xgboost as xgbmodel = xgb.XGBClassifier(n_estimators=2,max_depth=3,learning_rate=0.1,random_state=1,reg_lambda=1,gamma=0,objective='binary:logistic