XGBoost 算法原理

一、簡介

XGBoost(eXtreme Gradient Boosting)是GBDT(Gradient Boosting Decision Tree)的一種實現。GBDT又是提升樹(Boosting Tree)的一種優化模型。Boosting則是集成學習的一種算法。
enssemble learning

1.1 梯度提升樹(Gradient Boosting Decison Tree, GBDT)

之前提到的 Bagging 的思想比較簡單,即每一次從原始數據中根據均勻概率分佈有放回的抽取和原始數據大小相同的樣本集合,樣本點可能出現重複,然後對每一次產生的訓練集構造一個分類器,再對分類器進行組合。

Boosting的每一次抽樣的樣本分佈都是不一樣的。每一次迭代,都根據上一次迭代的結果,增加被錯誤分類的樣本的權重,使得模型能在之後的迭代中更加註意到難以分類的樣本,這是一個不斷學習的過程,也是一個不斷提升的過程,這也就是Boosting思想的本質所在。迭代之後,將每次迭代的基分類器進行集成。那麼如何進行樣本權重的調整和分類器的集成是我們需要考慮的關鍵問題。

GB(Gradient Boosting) 是一種 Boosting 算法,因此它也試圖利用一羣弱學習器來創建一個強學習器。該算法與 AdaBoost算法 算法相似,但在某些方面有所不同。在這種方法中,我們試圖將增強問題形象化爲一個優化問題。我們採用一個損失函數,並試圖優化它。

提升樹是一種以分類樹或者回歸樹作爲基本分類器的算法。提升樹一般採用加法模型,即基函數的線性組合與前向分步算法。對分類問題決策樹是二叉分類樹,對迴歸問題決策樹是二叉迴歸樹。對於提升樹,當損失函數是平方誤差損失函數和指數損失函數時,每一步優化比較簡單,但是對於一般損失函數,往往每一步優化沒那麼容易。通常優化損失函數,是希望損失函數能夠不斷的減小,而且是損失函數能夠儘可能快的減小。而梯度提升算法針對這問題 ,讓損失函數沿着梯度方向最速下降的方法。

GBDT是以決策樹(CART)爲基學習器的GB算法。在GBDT的迭代中,假設我們前一輪迭代得到的強學習器是 ft1(x)f_{t-1}(x), 損失函數是 L(y,ft1(x))L(y,f_{t-1}(x)) , 我們本輪迭代的目標是找到一個CART迴歸樹模型的弱學習器 ht(x)h_t(x),讓本輪的損失函數 L(y,ft1(x)+ht(x))L(y,f_{t-1}(x)+h_t(x)) 最小(這裏也可以看出來,其實GBDT就是一個學習殘差的過程)。也就是說,本輪迭代找到決策樹,要讓樣本的損失儘量變得更小。

GBDT的核心就在於:每一棵樹學的是之前所有樹結論和的殘差,這個殘差就是一個加預測值後能得真實值的累加量。比如A的真實年齡是18歲,但第一棵樹的預測年齡是12歲,差了6歲,即殘差爲6歲。那麼在第二棵樹裏我們把A的年齡設爲6歲去學習,如果第二棵樹真的能把A分到6歲的葉子節點,那累加兩棵樹的結論就是A的真實年齡;如果第二棵樹的結論是5歲,則A仍然存在1歲的殘差,第三棵樹裏A的年齡就變成1歲,繼續學習。

GBDT的目標函數:
L(y,ft1(x)+ht(x))L(y,f_{t-1}(x)+h_t(x))

GBDT用於分類算法的損失函數:

  • 指數損失函數
  • 對數損失函數

GBDT用於迴歸算法的損失函數:

  • 均方損失函數
  • 絕對值損失函數
  • Huber損失函數
  • 分位數損失函數

GBDT的算法描述如下:
(1)初始化弱學習器:
f0(x)=arg minci=1mL(yi,c)f_0(x)=arg\ min_c \sum_{i=1}^m L(y_i,c)

(2)對t=1,2,…,T有:
  (a)首先對樣本i=1,2,…,m,計算損失函數在當前模型 ft1(x)f_{t−1}(x)的負梯度值,作爲殘差
rti=[L(yi,f(xi)))f(xi)]f(x)=ft1    (x)r_{ti} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)}
  (b)將上一步得到的殘差作爲樣本新的真實值,利用新的訓練樣本(xix_i,rtir_{ti})(i=1,2,…,m), 擬合一顆CART迴歸樹,得到第t顆迴歸樹,其對應的葉子節點區域爲對應的葉節點區域爲Rtj,j=1,2,...,JR_{tj}, j =1,2,..., J
   (c)最小化損失函數,從而在葉結點區域j=1,2,...,Jj=1,2,...,J上計算最佳擬合值:
ctj=arg  mincxiRtjL(yi,ft1(xi)+c)c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} L(y_i,f_{t-1}(x_i) +c)
這樣我們就得到了本輪的決策樹擬合函數如下(ct是葉子節點的輸出,I是指示函數):
ht(x)=j=1JctjI(xRtj)h_t(x) = \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})
  (d)更新強學習器:
ft(x)=ft1(x)+j=1JctjI(xRtj)f_{t}(x) = f_{t-1}(x) + \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})

(3)得到最終學習器:
f(x)=fT(x)=f0(x)+t=1Tj=1JctjI(xRtj)f(x)=f_T(x)=f_0(x)+\sum_{t=1}^T \sum_{j=1}^{J} c_{tj}I(x \in R_{tj})

上面步驟二中的第一步是得到負梯度,或者是泰勒展開式的一階導數。第二步是第一個優化求解,即基於殘差擬合一顆CART迴歸樹,得到J個葉子節點區域。第三步是第二個優化求解,在第二步優化求解的結果上,對每個節點區域再做一次線性搜索,得到每個葉子節點區域的最優取值。最終得到當前輪的強學習器。

1.2 XGBoost

作爲GBDT的高效實現,XGBoost是一個上限特別高的算法,因此在算法競賽中比較受歡迎。簡單來說,對比原算法GBDT,XGBoost主要從下面三個方面做了優化:

  • 一是算法本身的優化:在算法的弱學習器模型選擇上,對比GBDT只支持決策樹,XGBoost還支持很多其他的弱學習器。在算法的損失函數上,除了本身的損失,還加上了正則化部分。在算法的優化方式上,GBDT的損失函數只對誤差部分做負梯度(一階泰勒)展開,而XGBoost損失函數對誤差部分做二階泰勒展開,更加準確。算法本身的優化是我們後面討論的重點。
  • 二是算法運行效率的優化:對每個弱學習器,比如決策樹建立的過程做並行選擇,找到合適的子樹分裂特徵和特徵值。在並行選擇之前,先對所有的特徵的值進行排序分組,方便前面說的並行選擇。對分組的特徵,選擇合適的分組大小,使用CPU緩存進行讀取加速。將各個分組保存到多個硬盤以提高IO速度。
  • 三是算法健壯性的優化:對於缺失值的特徵,通過枚舉所有缺失值在當前節點是進入左子樹還是右子樹來決定缺失值的處理方式。算法本身加入了L1和L2正則化項,可以防止過擬合,泛化能力更強。

在上面三方面的優化中,第一部分算法本身的優化是重點也是難點。現在我們就來看看算法本身的優化內容。

二、XGboost的目標函數推導

從上面GBDT的算法描述可以看出,GBDT求最優解的方法是分兩步走:求解當前決策樹最優的所有葉子節點區域和每個葉子節點區域的最優解ctjc_{tj}

對於XGBoost,它期望把第2步和第3步合併在一起做,即一次求解出決策樹最優的所有葉子節點區域和每個葉子節點區域的最優解。在討論如何求解前,我們先看看XGBoost的損失函數的形式。

2.1 重新定義一棵樹

我們將一顆樹ft(x)=wq(x)f_t(x)=w_{q(x)}重新定義,包括兩個部分:

  • 葉子結點的權重向量w;
  • (實例 -> 葉子結點)的映射關係q(本質是樹的分支結構);
    一棵樹的表達形式定義如下:
    tree
    通俗的講就是給定一個輸入x之後,先通過q(x)從樹中找到相應地葉子節點leaf,然後以這個節點作爲下標從權重向量得到對應的權重,所以ft(x)f_t(x)其實是權重值。

2.2 重新定義樹的複雜度

我們將一顆樹的複雜度重新定義爲 Ω(ft)=γT+12λj=1Twj2\Omega(f_t)=\gamma T+\frac{1}{2} \lambda \sum_{j=1}^T w_j^2,它由兩部分組成:

  • 葉子結點的數量T;
  • 葉子結點權重向量的L2範數wj2w_j^2

實例如下:
複雜度

2.3 XGBoost 的目標函數

首先,爲了防止過擬合,XGBoost的目標函數在GBDT損失函數 i=1nl(yi,y^i)\sum\limits_{i=1}^n l(y_i, \hat y_i) 的基礎上,將全部 K 棵樹的複雜度進行累加求和作爲正則項加入,最終XGBoost目標函數定義如下:
Obj=i=1nl(yi,y^i)+k=1KΩ(fk)(2.3.1) Obj=\sum\limits_{i=1}^n l(y_i, \hat y_i) + \sum\limits_{k=1}^K \Omega(f_k) \tag{2.3.1}
這裏的 ll 是訓練損失,y^i\hat y_i 是第 i 個樣本 xix_i 的預測值。由於XGBoost是一個加法模型,因此,預測得分是每棵樹打分的累加之和:
y_hat
假設我們第 t 次迭代要訓練的樹模型是 ft(xi)f_t(x_i) ,也就是要學習第 t 棵樹,由於XGBoost 是一個加法模型,所以此時前 t-1 次的訓練結果 y^i(t1)\hat y_i^{(t-1)} 其實是已經通過之前累加得出來了,可以將其看做一個常數值,於是樣本i的第t棵樹的預測結果 y^i(t)\hat y_i^{(t)} 可表示爲:
在這裏插入圖片描述
還要注意的一點是,這裏我們將正則化項進行了拆分,和上面的y^\hat y一樣,由於前 t-1棵樹的結構已經確定,因此,前 t-1 棵樹的複雜度之和可以用一個常量表示const,而Ω(ft)\Omega(f_t)則是未知的第t棵樹的複雜度,於是所有t棵樹的複雜度之和可以表示爲:
在這裏插入圖片描述
將上面兩式帶入等式(2.3.1)中的目標函數 Obj ,可以得到等式(2.3.2):
t_tree
注意上式中,只有一個變量,那就是第 t 棵樹:ft(xi)f_t(x_i),其餘的都是已知量或可通過已知量可以計算出來的(注意要理解哦!)。

最終我們要極小化上面這個損失函數,得到第t個決策樹最優的所有J個葉子節點區域和每個葉子節點區域的最優解。XGBoost沒有和GBDT一樣去擬合泰勒展開式的一階導數,而是期望直接基於損失函數的二階泰勒展開式來求解。下面我們來看看這個損失函數的二階泰勒展開式。

2.4 二階泰勒展開

首先簡單回憶一下,泰勒公式:

泰勒公式是將一個在 x = x0 處具有n階導數的函數 f(x) 利用關於 (x-x0) 的n次多項式來逼近函數的方法。

泰勒公式的二階展開形式如下:
tale
回到我們的問題上來, f(x)f(x) 對應於我們的損失函數 ll ,x 對應於前 t-1 棵樹的預測值,Δx\Delta x 對應於我們正在訓練的第 t 棵樹。

首先定義損失函數 ll 關於 y^(t1)\hat y^{(t-1)} 的一階偏導數gig_i和二階偏導數hih_i
partial
那麼,我們的損失函數就可以轉化爲下式(標出了與泰勒公式中x和Δx的對應關係)。
loss function
將上述二階展開式,帶入到目標函數(2.3.2)中,可以得到目標函數 Obj 的近似值:
obj
去掉全部常數項,得到目標函數(2.4.1):
obj

2.5 葉子結點歸組

我們將屬於第 j 個葉子結點的所有樣本 xi , 劃入到一個葉子結點樣本集中,數學表示如下:
I
然後,將【2.1】和【2.2】中一棵樹及其複雜度的定義,帶入到泰勒展開後的目標函數Obj(2.4.1)中,具體推導如下:
obj
可以看出,對葉子節點歸組是爲了把損失函數求和中的n個結點和樹的複雜度求和中的T個葉子節點進行統一,結點權重wqw_q也因此統一成了wjw_j,方便了化簡公式。

爲進一步簡化該式,我們進行如下定義:
Gj=iIjgi,Hj=iIjhiG_j=\sum_{i \in I_j}g_i,H_j=\sum_{i \in I_j} h_i

含義如下:

  • GjG_j:葉子結點 j 所包含樣本的一階偏導數累加之和,是一個常量;
  • HjH_j:葉子結點 j 所包含樣本的二階偏導數累加之和,是一個常量;

GjG_jHjH_j 帶入目標式Obj,得到我們最終的目標函數(注意,此時式中的變量只剩下第t棵樹的權重向量W):
obj

三、XGBoost目標函數的優化求解

XGBoost目標函數的優化求解涉及到2個問題:

  • 如果我們已經求出了第t個決策樹的J個最優的葉子節點區域,如何求出每個葉子節點區域的最優解ww^*
  • 對當前決策樹做子樹分裂決策時,應該如何選擇哪個特徵和特徵值進行分裂,使最終我們的目標函數最小化?

3.1 求每個葉子節點區域的最優解

回憶一下高中數學知識。假設有一個一元二次函數,形式如下:
Gx+12Hx2,H>0Gx+\frac{1}{2}Hx^2,H>0
我們可以套用一元二次函數的最值公式輕易地求出最值點:
在這裏插入圖片描述
那回到我們的目標函數 Obj,該如何求出它的最值呢?
在這裏插入圖片描述
先簡單分析一下上面的式子,對於每個葉子結點 j , 可以將其從目標式 Obj 中拆解出來:
在這裏插入圖片描述
在【2.5】中我們提到,GjG_jHjH_j 相對於第 t 棵樹來說是可以計算出來的。那麼,這個式子就是一個只包含一個變量 葉子結點權重wjw_j 的一元二次函數,上面也提到了,我們可以通過最值公式求出它的最值點。

再次分析一下目標函數Obj,可以發現,各個葉子結點的目標子式是相互獨立的,也就是說,當每個葉子結點的子式都達到最值點時,整個目標函數式Obj才達到最值點(下面Obj中對每個葉子節點的求和)。

那麼,假設目前樹的結構已經固定,套用一元二次函數的最值公式,我們可以輕易求出,每個葉子結點的權重 wjw_j^* 及其此時達到最優的 Obj 的目標值:
在這裏插入圖片描述
實例演示:
在這裏插入圖片描述

3.2 如何選擇特徵和特徵值進行分裂

3.2.1 分裂一個結點

在GBDT裏面,我們是直接擬合的CART迴歸樹,所以樹節點分裂使用的是均方誤差。XGBoost這裏不使用均方誤差,而是使用貪心法,即每次分裂都期望最小化我們的損失函數的誤差。在實際訓練過程中,當建立第 t 棵樹時,從樹深爲0時開始:

  • 對樹中的每個葉子結點嘗試進行分裂
  • 每次分裂後,原來的一個葉子結點繼續分裂爲左右兩個子葉子結點,原葉子結點中的樣本集將根據該結點的判斷規則分散到左右兩個葉子結點中;
  • 新分裂一個結點後,我們需要檢測這次分裂是否會給損失函數帶來增益,增益的定義如下:
    在這裏插入圖片描述

也就是說,我們的決策樹分裂標準不再使用CART迴歸樹的均方誤差,而是上式了。如果增益Gain>0,即分裂爲兩個葉子節點後,目標函數下降了,那麼我們會考慮此次分裂的結果。

但是,在一個結點分裂時,可能有很多個分裂點,每個分裂點都會產生一個增益,如何才能尋找到最優的分裂點呢?接下來會講到。

3.2.2 尋找最佳分裂點

在分裂一個結點時,我們會有很多個候選分割點,尋找最佳分割點的大致步驟如下:

  • 遍歷每個結點的每個特徵;
  • 對每個特徵,按特徵值大小將特徵值排序;
  • 線性掃描,找出每個特徵的最佳分裂特徵值;

在所有特徵中找出最好的分裂點(分裂後增益最大的特徵及特徵值)

上面是一種貪心的方法,每次進行分裂嘗試都要遍歷一遍全部候選分割點,也叫做全局掃描法

但當數據量過大導致內存無法一次載入或者在分佈式情況下,貪心算法的效率就會變得很低,全局掃描法不再適用。

基於此,XGBoost提出了一系列加快尋找最佳分裂點的方案:

  • 特徵預排序+緩存:XGBoost在訓練之前,預先對每個特徵按照特徵值大小進行排序,然後保存爲block結構,後面的迭代中會重複地使用這個結構,使計算量大大減小。
  • 分位點近似法:對每個特徵按照特徵值排序後,採用類似分位點選取的方式,僅僅選出常數個特徵值作爲該特徵的候選分割點,在尋找該特徵的最佳分割點時,從候選分割點中選出最優的一個。
  • 並行查找:由於各個特性已預先存儲爲block結構,XGBoost支持利用多個線程並行地計算每個特徵的最佳分割點,這不僅大大提升了結點的分裂速度,也極利於大規模訓練集的適應性擴展。
3.2.3 停止生長

一棵樹不會一直生長下去,下面是一些常見的限制條件。

(1) 當新引入的一次分裂所帶來的增益Gain<0時,放棄當前的分裂。這是訓練損失和模型結構複雜度的博弈過程。
gain

(2) 當樹達到最大深度時,停止建樹,因爲樹的深度太深容易出現過擬合,這裏需要設置一個超參數max_depth

(3) 當引入一次分裂後,重新計算新生成的左、右兩個葉子結點的樣本權重和。如果任一個葉子結點的樣本權重低於某一個閾值,也會放棄此次分裂。這涉及到一個超參數:最小樣本權重和,是指如果一個葉子節點包含的樣本數量太少也會放棄分裂,防止樹分的太細,這也是過擬合的一種措施。

每個葉子結點的樣本權值和計算方式如下:
在這裏插入圖片描述
具體如何分裂呢?舉個簡單的年齡特徵的例子如下,假設我們選擇年齡這個特徵的值a作爲決策樹的分裂標準,則可以得到左子樹2個人,右子樹三個人,這樣可以分別計算出左右子樹的一階和二階導數和,進而求出最終的上式的值。我們可以發現對於所有的a,我們只要做一遍從左到右的掃描就可以枚舉出所有分割的梯度和 GLG_LGRG_R。然後用上面的公式計算每個分割方案的分數就可以了。

在這裏插入圖片描述

四、XGBoost算法主流程

這裏我們總結下XGBoost的算法主流程,基於決策樹弱分類器。不涉及運行效率的優化和健壯性優化的內容。

輸入:訓練集樣本I={(x,y1),(x2,y2),...(xm,ym)}I=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\}, 最大迭代次數T, 損失函數L, 正則化係數 λ,γ\lambda, \gamma
輸出:強學習器f(x)

對迭代輪數t=1,2,…T有:

(1) 計算第i個樣本(i=1,2,…m)在當前輪損失函數L基於 ft1(xi)f_{t-1}(x_i) 的一階導數gtig_{ti},二階導數 htih_{ti},計算所有樣本的一階導數和 Gt=i=1mgtiG_t=\sum_{i=1}^m g_{ti},二階導數和 Ht=i=1mhtiH_t=\sum_{i=1}^m h_{ti}

(2) 基於當前節點嘗試分裂決策樹,默認分數score=0
對特徵序號 k=1,2…K:
  (a) GL=0,HL=0G_L=0, H_L=0
  (b.1) 將樣本按特徵k從小到大排列,依次取出第i個樣本,依次計算當前樣本放入左子樹後,左右子樹一階和二階導數和:
GL=GL+gti,GR=GGLG_L = G_L+ g_{ti}, G_R=G-G_L
HL=HL+hti,HR=HHLH_L = H_L+ h_{ti}, H_R=H-H_L
  (b.2) 嘗試更新最大的分數:
score=max(score,12GL2HL+λ+12GR2HR+λ12(GL+GR)2HL+HR+λγ)score = max(score, \frac{1}{2}\frac{G_L^2}{H_L + \lambda} + \frac{1}{2}\frac{G_R^2}{H_R+\lambda} - \frac{1}{2}\frac{(G_L+G_R)^2}{H_L+H_R+ \lambda} -\gamma )

(3) 基於最大score對應的劃分特徵和特徵值分裂子樹。

(4) 如果最大score爲0,則當前決策樹建立完畢,計算所有葉子區域的wtjw_{tj}, 得到弱學習器ht(x)h_t(x),更新強學習器ft(x)f_t(x),進入下一輪弱學習器迭代.如果最大score不是0,則轉到第2)步繼續嘗試分裂決策樹。

五、XGBoost算法優化

5.1 XGBoost算法運行效率的優化

上面我們重點討論了XGBoost算法本身的優化,在這裏我們再來看看XGBoost算法運行效率的優化。

首先明確的是:XGBoost的並行,並不是說每棵樹可以並行訓練,XGBoost本質上仍然採用 Boosting 思想,Boosting算法的弱學習器是沒法並行迭代的,每棵樹訓練前需要等前面的樹訓練完成才能開始訓練。但是單個弱學習器裏面最耗時的是決策樹的分裂過程,XGBoost針對這個分裂做了比較大的並行優化。對於不同的特徵的特徵劃分點,XGBoost分別在不同的線程中並行選擇分裂的最大增益。

XGBoost的特徵維度的並行是這樣實現的:在訓練之前,每個特徵按特徵值對樣本進行預排序,並以Block結構存儲在內存中,在後面查找特徵分割點時可以重複使用,減少計算量。計算量的減少是指:默認所有的樣本都在右子樹,然後從小到大迭代,依次放入左子樹,並尋找最優的分裂點。這樣做可以減少很多不必要的比較。而且特徵已經被存儲爲一個個block結構,那麼在尋找每個特徵的最佳分割點時,可以利用多線程對每個block並行計算。

此外,通過設置合理的分塊的大小,充分利用了CPU緩存進行讀取加速(cache-aware access)。使得數據讀取的速度更快。另外,通過將分塊進行壓縮(block compressoin)並存儲到硬盤上,並且通過將分塊分區到多個硬盤上實現了更大的IO。

5.2 XGBoost算法健壯性的優化

首先我們來了解一下一般情況下對存在缺失值的特徵的解決方法是:

  • 離散型變量:用出現次數最多的特徵值填充;
  • 連續型變量:用中位數或均值填充;

一些模型如SVM和KNN,其模型原理中涉及到了對樣本距離的度量,如果缺失值處理不當,最終會導致模型預測效果很差。
樹模型對缺失值的敏感度低,大部分時候可以在數據缺失時時使用。原因就是,一棵樹中每個結點在分裂時,尋找的是某個特徵的最佳分裂點(特徵值),完全可以不考慮存在特徵值缺失的樣本,也就是說,如果某些樣本缺失的特徵值缺失,對尋找最佳分割點的影響不是很大。

因此,對於有缺失值的數據在經過缺失處理後:

  • 當數據量很小時,優先用樸素貝葉斯
  • 數據量適中或者較大,用樹模型,優先XGBoost
  • 數據量較大,也可以用神經網絡
  • 避免使用距離度量相關的模型,如KNN和SVM

XGBoost模型的一個優點就是允許特徵存在缺失值,XGBoost對特徵的缺失值的處理方式是這樣的:

  • 在特徵k上尋找最佳 split point 時,不會對該列特徵 missing 的樣本進行遍歷,而只對該列特徵值爲 non-missing 的樣本上對應的特徵值進行遍歷,通過這個技巧來減少了爲稀疏離散特徵尋找 split point 的時間開銷。
  • 在邏輯實現上,爲了保證完備性,XGBoost沒有假設缺失值一定進入左子樹還是右子樹,會將該特徵值missing的樣本分別分配到左葉子結點和右葉子結點,兩種情形都計算一遍後,選擇分裂後增益最大的那個方向(左分支或是右分支),作爲預測時特徵值缺失樣本的默認分支方向,這樣處理起來更加的靈活和合理。
  • 如果在訓練中沒有缺失值而在預測中出現缺失,那麼會自動將缺失值的劃分方向放到右子結點

也就是說,其實每次都是針對沒有缺失值的特徵k的樣本走上述第四節的一般流程。而對應有缺失值的特徵,上面第4節的算法的步驟(a),(b.1)和(b.2)會執行2次,第一次假設特徵k所有有缺失值的樣本都走左子樹,第二次假設特徵k所有有缺失值的樣本都走右子樹

  • 如果是所有的缺失值走右子樹,使用上面第4節的(a),(b.1)和(b.2)即可。
  • 如果是所有的樣本走左子樹,則上面第4節的(a)步要變成:GR=0,HR=0G_R=0, H_R=0
    (b.1)步要更新爲:
    GR=GR+gti,GL=GGRG_R = G_R+g_{ti}, G_L=G-G_R
    HR=HR+hti,HL=HHRH_R = H_R+h_{ti}, H_L=H-H_R

六、面試題

  1. 珍藏版 | 20道XGBoost面試題,你會幾個?(上篇)
  2. 珍藏版 | 20道XGBoost面試題,你會幾個?(下篇)

參考
【0】 https://xgboost.ai
【1】【ML】XGBoost超詳細推導,終於有人講明白了!
【2】 機器學習經典算法(4)——Xgboost
【3】 機器學習總結(一) Adaboost,GBDT和XGboost算法
【4】 ID3、C4.5、CART、隨機森林、bagging、boosting、Adaboost、GBDT、xgboost算法總結
【5】 梯度提升樹(GBDT)原理小結
【6】 XGBoost算法原理小結
【7】 AdaBoost, GBDT和XGBoost的區別和聯繫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章