XGBoost

本文借鑑自多篇博客,非原創。

XGBoost是機器學習領域最近幾年比較火熱的一種十分強大的集成學習方法(系統),全稱爲eXtreme Gradient Boosting,由大牛陳天奇博士開發(陳天奇,交大ACM班畢業,華盛頓大學計算機博士)。

 

預備知識

Boosting

Boosting是一類可將弱學習器提升爲強學習器的集成學習算法。集成學習主要分爲兩大類,第一類是以Boosting爲代表的串聯集成學習器,第二類是以Random Forest和Bagging爲代表的並聯集成學習器。

Boosting的思想是:先訓練處初始基學習器,再根據所得基學習器的變現對訓練樣本的分佈進行調整,使得先前在基學習器中做錯的樣本在後續受到更多的關注,然後基於調整後的樣本分佈來訓練下一個基學習器;如此往復進行,直到基學習器數目達到約定好的數目,最終將所有的基學習器進行加權結合。

Boosting中有名的成員包括:AdaBoost,GradientBoosting,和LPBoost等。

 

Gradient Boosting

這部分內容摘自:一步一步理解GB、GBDT、xgboost

對於Boosting,一般基於這樣的迭代優化:

F_{m+1}(x)=F_m(x)+h_m(x)

關鍵在於怎麼生成h(x)。如果目標函數是迴歸問題的均方誤差,很容易想到最理想的h(x)應該是能夠完全擬合y-F_m(x),這就是常說基於殘差的學習。殘差學習在迴歸問題中可以很好的使用,但是爲了一般性(分類,排序問題),實際中往往是基於loss Function 在函數空間的的負梯度學習,對於迴歸問題(y-F(x))^2,殘差和負梯度也是相同的。基於Loss Function函數空間的負梯度的學習也稱爲“僞殘差”。

GB算法的步驟:

      

 

GBDT

這部分內容摘自:一步一步理解GB、GBDT、xgboost

關於GBDT(Gradient Boosting Decision Tree)還可參考:GBDT

GB算法中最典型的基學習器是決策樹,尤其是CART,正如名字的含義,GBDT(Gradient Boosting Decision Tree)是GB和DT的結合。要注意的是這裏的決策樹是迴歸樹,GBDT中的決策樹是個弱模型,深度較小一般不會超過5,葉子節點的數量也不會超過10,對於生成的每棵決策樹乘上比較小的縮減係數(學習率<0.1),有些GBDT的實現加入了隨機抽樣(subsample 0.5<=f <=0.8)提高模型的泛化能力。通過交叉驗證的方法選擇最優的參數。因此GBDT實際的核心問題變成怎麼基於\{(x_i,r_{im})\}_{i=1}^m 使用CART迴歸樹生成h(x)。

CART分類樹在很多書籍和資料中介紹比較多,但是再次強調GDBT中使用的是迴歸樹。作爲對比,先說分類樹,我們知道CART是二叉樹,CART分類樹在每次分枝時,是窮舉每一個feature的每一個閾值,根據GINI係數找到使不純性降低最大的的feature以及其閥值,然後按照feature<=閾值,和feature>閾值分成的兩個分枝,每個分支包含符合分支條件的樣本。用同樣方法繼續分枝直到該分支下的所有樣本都屬於統一類別,或達到預設的終止條件,若最終葉子節點中的類別不唯一,則以多數人的類別作爲該葉子節點的性別。迴歸樹總體流程也是類似,不過在每個節點(不一定是葉子節點)都會得一個預測值,以年齡爲例,該預測值等於屬於這個節點的所有人年齡的平均值。分枝時窮舉每一個feature的每個閾值找最好的分割點,但衡量最好的標準不再是GINI係數,而是最小化均方差--即(每個人的年齡-預測年齡)^2 的總和 / N,或者說是每個人的預測誤差平方和 除以 N。這很好理解,被預測出錯的人數越多,錯的越離譜,均方差就越大,通過最小化均方差能夠找到最靠譜的分枝依據。分枝直到每個葉子節點上人的年齡都唯一(這太難了)或者達到預設的終止條件(如葉子個數上限),若最終葉子節點上人的年齡不唯一,則以該節點上所有人的平均年齡做爲該葉子節點的預測年齡。

 

XGBoost

GBDT是一種基於集成思想下的Boosting學習器,並採用梯度提升的方法進行每一輪的迭代最終組建出強學習器,這樣的話算法的運行往往要生成一定數量的樹才能達到令我們滿意的準確率。當數據集大且較爲複雜時,運行一次極有可能需要幾千次的迭代運算,這將對我們使用算法造成巨大的計算瓶頸。

雖然GBDT無論在理論推導還是在應用場景實踐都是相當完美的,但有一個問題:第n顆樹訓練時,需要用到第n-1顆樹的(近似)殘差。從這個角度來看,GBDT比較難以實現分佈式,XGBoost正是解決了這個難題。XGBoost是GBDT的高效實現,XGBoost中的基學習器除了可以是CART(GBTree)也可以是線性分類器(GBLinear)。

XGBoost最大的特點在於它能夠自動利用CPU的多線程進行並行計算,同時在算法上加以改進提高了精度。在Kaggle的希格斯子信號識別競賽中,XGBoost因爲出衆的效率與較高的預測準確度在比賽論壇中引起了參賽選手的廣泛關注,在1700多支隊伍的激烈競爭中佔有一席之地。隨着它在Kaggle社區知名度的提高,在其他的比賽中也有隊伍藉助XGBoost奪得第一。

這部分所有的內容來自原始paper。

 

從GB到XGBoost

(1) XGBoost在目標函數中顯示的加上了正則化項,基學習爲CART時,正則化項與樹的葉子節點的數量T和葉子節點的值有關。

      

(2) GB中使用Loss Function對f(x)的一階導數計算出僞殘差用於學習生成fm(x),XGBoost不僅使用到了一階導數,還使用二階導數。第t次的loss:

      

    對上式做二階泰勒展開:g爲一階導數,h爲二階導數

      

(3) 上面提到CART迴歸樹中尋找最佳分割點的衡量標準是最小化均方差,XGBoost尋找分割點的標準是最大化,lamda,gama與正則化項相關

      

 

XGBoost算法的步驟和GB基本相同,都是首先初始化爲一個常數,GB是根據一階導數ri,XGBoost是根據一階導數gi和二階導數hi,迭代生成基學習器,相加更新學習器。

XGBoost與GBDT除了上述不同,XGBoost在實現時還做了許多優化

  • 在尋找最佳分割點時,考慮傳統的枚舉每個特徵的所有可能分割點的貪心法效率太低,xgboost實現了一種近似的算法。大致的思想是根據百分位法列舉幾個可能成爲分割點的候選者,然後從候選者中根據上面求分割點的公式計算找出最佳的分割點。
  • xgboost考慮了訓練數據爲稀疏值的情況,可以爲缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率,paper提到50倍。
  • 特徵列排序後以塊的形式存儲在內存中,在迭代中可以重複使用;雖然boosting算法迭代必須串行,但是在處理每個特徵列時可以做到並行
  • 按照特徵列方式存儲能優化尋找最佳的分割點,但是當以行計算梯度數據時會導致內存的不連續訪問,嚴重時會導致cache miss,降低算法效率。paper中提到,可先將數據收集到線程內部的buffer,然後再計算,提高算法的效率。
  • xgboost 還考慮了當數據量比較大,內存不夠時怎麼有效的使用磁盤,主要是結合多線程、數據壓縮、分片的方法,儘可能的提高算法的效率。

 

XGBoost原理

目標函數:損失與正則

在監督學習中,我們通常會構造一個目標函數和一個預測函數,使用訓練樣本對目標函數最小化學習到相關的參數,然後用預測函數和訓練樣本得到的參數來對未知的樣本進行分類的標註或者數值的預測。在XGBoost中,目標函數的形式爲:Obj(\Theta )=L(\Theta )+\Omega (\Theta )

L(\Theta ):損失函數,常用損失函數有:

      

\Omega (\Theta ):正則化項,之所以要引入它是因爲我們的目標是希望生成的模型能準確的預測新的樣本(即應用於測試數據集),而不是簡單的擬合訓練集的結果(這樣會導致過擬合)。所以需要在保證模型“簡單”的基礎上最小化訓練誤差,這樣得到的參數才具有好的泛化性能。而正則項就是用於懲罰複雜模型,避免預測模型過分擬合訓練數據,常用的正則有[公式]正則與[公式]正則。

      

上圖所展示的就是損失函數與正則化項在模型中的應用(圖片來源:Introduction to Boosted Trees。觀察發現,如果目標函數中的損失函數權重過高,那麼模型的預測精度則不盡人意,反之如果正則項的權重過高,所生成的模型則會出現過擬合情況,難以對新的數據集做出有效預測。只有平衡好兩者之間的關係,控制好模型複雜度,並在此基礎上對參數進行求解,生成的模型纔會“簡單有效”(這也是機器學習中的偏差方差均衡)。

 

XGBoost的推導過程

1. 目標函數的迭代與泰勒展開

由於之前已經學習過樹的生成及集成方法,這裏不再贅述。首先,我們可以把某一次迭代後集成的模型表示爲:

      

相對應的目標函數:

      

將這兩個公式進行擴展,應用在前 t 輪的模型迭代中,具體表示爲:

      

\hat{y_i}^{t-1}就是前 t-1 輪的模型預測,f_t(x_i)爲新 t 輪加入的預測函數。

這裏自然就涉及一個問題:如何選擇在每一輪中加入的f(x_i)呢?答案很直接,選取的f(x_i)必須使得我們的目標函數儘量最大地降低(這裏應用到了Boosting的基本思想,即當前的基學習器重點關注以前所有學習器犯錯誤的那些數據樣本,以此來達到提升的效果)。先對目標函數進行改寫,表示如下:

      

如果我們考慮使用平方誤差作爲損失函數,公式可改寫爲:

      

更加一般的,對於不是平方誤差的情況,我們可以採用如下的泰勒展開近似來定義一個近似的目標函數,方便我們進行這一步的計算。

      

如果移除掉常數項,我們會發現這個目標函數有一個非常明顯的特點,它只依賴於每個數據點的在誤差函數上的一階導數和二階導數(  )。有人可能會問,這個公式似乎比我們之前學過的決策樹學習難懂。爲什麼要花這麼多力氣來做推導呢?
這是因爲,這樣做會使我們可以很清楚地理解整個目標是什麼,並且一步一步推導出如何進行樹的學習。這一個抽象的形式對於實現機器學習工具也是非常有幫助的。因爲它包含所有可以求導的目標函數,也就是說有了這個形式,我們寫出來的代碼可以用來求解包括迴歸,分類和排序的各種問題,正式的推導可以使得機器學習的工具更加一般化。

2. 決策樹的複雜度

接着來討論如何定義樹的複雜度。我們先對於f的定義做一下細化,把樹拆分成結構部分q和葉子權重部分w。其中結構函數q把輸入映射到葉子的索引號上面去,而w給定了每個索引號對應的葉子分數是什麼。具體公式爲:

      

當我們給定上述定義後,那麼一棵樹的複雜度就爲:

      

這個複雜度包含了一棵樹裏面節點的個數(左側),以及每個樹葉子節點上面輸出分數的L_2模平方(右側)。當然這不是唯一的一種定義方式,不過這一定義方式學習出的樹效果一般都比較不錯。

簡單提及一下\gamma\lambda兩個係數的作用,\gamma作爲葉子節點的係數,使XGBoost在優化目標函數的同時相當於做了預剪枝;\lambda作爲L_2平方模的係數也是要起到防止過擬合的作用。

這裏舉一個小例子加深對複雜度的理解(圖片來源:Introduction to Boosted Trees,下同)

      

上圖爲實際生成的一棵決策樹,底部的數字代表決策樹的預測值,那麼這棵樹的複雜度自然就爲:

      

3. 目標函數的最小化

接下來就是非常關鍵的一步,在這種新的定義下,我們可以把目標函數進行如下改寫,其中I被定義爲每個葉子上面樣本集合I_j=\left \{ i|q(x_i)=j \right \}

      

由此,我們將目標函數轉換爲一個一元二次方程求最小值的問題(在此式中,變量爲w_j,函數本質上是關於w_j的二次函數),略去求解步驟,最終結果如下所示:

      

乍一看目標函數的計算與樹的結構函數q沒有什麼關係,但是如果我們仔細回看目標函數的構成,就會發現其中G_jH_j的取值都是由第j個樹葉上數據樣本所決定的。而第j個樹葉上所具有的數據樣本則是由樹結構函數q決定的。也就是說,一旦樹的結構q確定,那麼相應的目標函數就能夠根據上式計算出來。那麼樹的生成問題也就轉換爲找到一個最優的樹結構q,使得它具有最小的目標函數。

計算求得的 Obj 代表了當指定一個樹的結構的時候,目標函數上面最多減少多少。所有我們可以把它叫做結構分數(structure score)。

      

上圖爲結構分數的一次實際應用,根據決策樹的預測結果得到各樣本的梯度數據,然後計算出實際的結構分數。正如圖中所言,分數越小,代表樹的結構越優。

4. 枚舉樹的結構——貪心法

在前面分析的基礎上,當尋找到最優的樹結構時,我們可以不斷地枚舉不同樹的結構,利用這個打分函數來尋找出一個最優結構的樹,加入到我們的模型中,然後再重複這樣的操作。不過枚舉所有樹結構這個操作不太可行,在這裏XGBoost採用了常用的貪心法,即每一次嘗試去對已有的葉子加入一個分割。對於一個具體的分割方案,我們可以獲得的增益可以由如下公式計算得到:

      

對於每次擴展,我們還是要枚舉所有可能的分割方案,那麼如何高效地枚舉所有的分割呢?假設需要枚舉所有x<a這樣的條件,那麼對於某個特定的分割a我們要計算a左邊和右邊的導數和,在實際應用中如下圖所示:

      

我們可以發現對於所有的a,我們只要做一遍從左到右的掃描就可以枚舉出所有分割的梯度與G_LG_R。然後用上面的公式計算每個分割方案的分數就可以了。

但需要注意是:引入的分割不一定會使得情況變好,因爲在引入分割的同時也引入新葉子的懲罰項。所以通常需要設定一個閾值,如果引入的分割帶來的增益小於一個閥值的時候,我們可以剪掉這個分割。此外在XGBoost的具體實踐中,通常會設置樹的深度來控制樹的複雜度,避免單個樹過於複雜帶來的過擬合問題。

到這裏爲止,XGBoost的數學推導就簡要介紹完畢。

 

XGBoost的優良特性

同樣是梯度提升,同樣是集成學習,那麼XGBoost比GBDT要好在哪裏呢?結合前面的推導過程與相關博客文章,可大致總結爲以下幾點:

  • GBDT是以CART爲基分類器,但XGBoost在此基礎上還支持線性分類器,此時XGBoost相當於帶L_1L_2正則化項的Logistics迴歸(分類問題)或者線性迴歸(迴歸問題)
  • XGBoost在目標函數里加入了正則項,用於控制模型的複雜度。正則項裏包含了樹的葉子節點個數和每棵樹葉子節點上面輸出分數的L_2模平方。從偏差方差權衡的角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合
  • 傳統的GBDT在優化時只用到一階導數,XGBoost則對目標函數進行了二階泰勒展開,同時用到了一階和二階導數。(順便提一下,XGBoost工具支持自定義代價函數,只要函數可一階和二階求導)
  • 樹節點在進行分裂時,我們需要計算每個特徵的每個分割點對應的增益,即用貪心法枚舉所有可能的分割點。當數據無法一次載入內存或者在分佈式情況下,貪心算法效率就會變得很低,所以XGBoost採用了一種近似的算法。大致的思想是根據百分位法列舉幾個可能成爲分割點的候選者,然後從候選者中根據上面求分割點的公式計算找出最佳的分割點
  • Shrinkage(縮減),相當於學習速率(XGBoost中的eta)。XGBoost在進行完一次迭代後,會將葉子節點的權重乘上該係數,主要是爲了削弱每棵樹的影響,讓後面有更大的學習空間。實際應用中,一般把eta設置得小一點,然後迭代次數設置得大一點。(當然普通的GBDT實現也有學習速率)
  • 特徵列排序後以塊的形式存儲在內存中,在迭代中可以重複使用;雖然boosting算法迭代必須串行,但是在處理每個特徵列時可以做到並行
  • 列抽樣(column subsampling):XGBoost借鑑了隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算,這也是XGBoost異於傳統GBDT的一個特性
  • 除此之外,XGBoost還考慮了當數據量比較大,內存不夠時怎麼有效的使用磁盤,主要是結合多線程、數據壓縮、分片的方法,儘可能的提高算法效率

 

XGBoost參數

(待完善)

XGBoost調參

XGBoost的參數過多,這裏推薦三種思路

(1)GridSearch

(2)Hyperopt

(3)老外寫的一篇文章,操作性比較強,推薦學習一下。地址

XGBoost代碼示例

python中使用XGBoost示例

      

R語言中使用XGBoost示例

示例1:

      

示例2:

在包中有一組蘑菇數據集可供使用,我們的目標是預測蘑菇是否可以食用(分類任務),此數據集已被分割成訓練數據與測試數據。

# xgboost包在安裝時需要把R升級到3.3.0以上的版本,否則安裝不成功
> install.packages('xgboost')
# 也可使用devtools包安裝github版本
> devtools::install_github('dmlc/xgboost', subdir='R-package')
> library(xgboost)

> data(agaricus.train, package='xgboost')
> data(agaricus.test, package='xgboost')
> train <- agaricus.train 
> test <- agaricus.test

# 整個數據集是由data和label組成的list
> class(train)
[1] "list"
# 查看數據維度
> dim(train$data)
[1] 6513  126
> dim(test$data)
[1] 1611  126

# 在此數據集中,data是一個dgCMatrix類的稀疏矩陣,label是一個由{0,1}構成的數值型向量
> str(train)
List of 2
 $ data :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  .. ..@ i       : int [1:143286] 2 6 8 11 18 20 21 24 28 32 ...
  .. ..@ p       : int [1:127] 0 369 372 3306 5845 6489 6513 8380 8384 10991 ...
  .. ..@ Dim     : int [1:2] 6513 126
  .. ..@ Dimnames:List of 2
  .. .. ..$ : NULL
  .. .. ..$ : chr [1:126] "cap-shape=bell" "cap-shape=conical" "cap-shape=convex" "cap-shape=flat" ...
  .. ..@ x       : num [1:143286] 1 1 1 1 1 1 1 1 1 1 ...
  .. ..@ factors : list()
 $ label: num [1:6513] 1 0 0 1 0 0 0 1 0 0 ...

xgboost包提供了兩個函數用於模型構建,分別是xgboost()與xgb.train(),前者可以滿足對算法參數的基本設置,而後者的話在此基礎上可以實現一些更爲高級的功能。

# data與label分別指定數據與標籤
# max.deph:樹的深度,默認值爲6,在此數據集中的分類問題比較簡單,設置爲2即可
# nthread:並行運算的CPU的線程數,設置爲2;
# nround:生成樹的棵數
# objective = "binary:logistic":設置邏輯迴歸二分類模型
> xgboost_model <- xgboost(data = train$data, label = train$label, max.depth = 2, eta = 1, nthread = 2, nround = 2, objective = "binary:logistic")
# 得到兩次迭代的訓練誤差
[1]	train-error:0.046522 
[2]	train-error:0.022263 

xgboost函數可調用的參數衆多,在此不在詳細展開介紹,可參閱博客文章[譯]快速上手:在R中使用XGBoost算法中的"在xgboost中使用參數"一節,該文章將這些參數歸爲通用、輔助和任務參數三大類,對我們掌握算法與調參有着很大幫助。

# 設置verbose參數,可以顯示內部的學習過程
> xgboost_model <- xgboost(data = train$data, label = train$label, 
+ max.depth = 2, eta = 1, nthread = 2, nround = 2, verbose = 2,
+ objective = "binary:logistic")
[13:56:36] amalgamation/../src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 6 extra nodes, 0 pruned nodes, max_depth=2
[1]	train-error:0.046522 
[13:56:36] amalgamation/../src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 4 extra nodes, 0 pruned nodes, max_depth=2
[2]	train-error:0.022263

# 將建立好的模型用於預測新的數據集
> xgboost_pred <- predict(xgboost_model, test$data)
> head(xgboost_pred)
[1] 0.28583017 0.92392391 0.28583017 0.28583017 0.05169873 0.92392391
# 以上給出的是每一個樣本的預測概率值,進一步轉化後可得到具體的預測分類
> prediction <- as.numeric(xgboost_pred > 0.5)
> head(prediction)
[1] 0 1 0 0 0 1
> model_accuracy <- table(prediction,test$label)
> model_accuracy
          
prediction   0   1
         0 813  13
         1  22 763
> model_accuracy_1 <- sum(diag(model_accuracy))/sum(model_accuracy)
> model_accuracy_1
[1] 0.9782744

高級功能

xgb.train()函數可以實現一些高級功能,幫助我們對模型進行進一步的優化。

# 在使用函數前需要將數據集進行轉換爲xgb.Dmatrix格式
> dtrain <- xgb.DMatrix(data = train$data, label=train$label)
> dtest <- xgb.DMatrix(data = test$data, label=test$label)

# 使用watchlist參數,可同時得到訓練數據與測試數據的誤差
> watchlist <- list(train=dtrain, test=dtest)
> xgboost_model <- xgb.train(data=dtrain, max.depth=2, eta=1, nthread = 2,
+ nround = 3,objective = "binary:logistic",watchlist = watchlist)
[1]	train-error:0.046522	test-error:0.042831 
[2]	train-error:0.022263	test-error:0.021726
[3]	train-error:0.007063	test-error:0.006207

# 自定義損失函數,可同時觀察兩種損失函數的表現
# eval.metric可使用的參數包括'logloss'、'error'、'rmse'等
> xgboost_model <- xgb.train(data=dtrain, max.depth=2, eta=1, nthread = 2,
+ nround=3, watchlist=watchlist, eval.metric = "error", 
+ eval.metric = "logloss", objective = "binary:logistic")
[1]	train-error:0.046522	train-logloss:0.233376	test-error:0.042831	test-logloss:0.226686 
[2]	train-error:0.022263	train-logloss:0.136658	test-error:0.021726	test-logloss:0.137874 
[3]	train-error:0.007063	train-logloss:0.082531	test-error:0.006207	test-logloss:0.080461

# 查看特徵的重要性,方便我們在模型優化時進行特徵篩選
> importance_matrix <- xgb.importance(model = xgboost_model)
> importance_matrix
   Feature       Gain      Cover Frequency
1:      28 0.60036585 0.41841659     0.250
2:      55 0.15214681 0.16140352     0.125
3:      59 0.10936624 0.13772146     0.125
4:     101 0.04843973 0.07979724     0.125
5:     110 0.03391602 0.04120512     0.125
6:      66 0.02973248 0.03859211     0.125
7:     108 0.02603288 0.12286396     0.125
# 使用xgb.plot.importance()函數進行可視化展示
> xgb.plot.importance(importance_matrix)

# 使用xgb.dump()查看模型的樹結構
> xgb.dump(xgboost_model,with_stats = T)
 [1] "booster[0]"                                                            
 [2] "0:[f28<-9.53674e-007] yes=1,no=2,missing=1,gain=4000.53,cover=1628.25" 
 [3] "1:[f55<-9.53674e-007] yes=3,no=4,missing=3,gain=1158.21,cover=924.5"   
 [4] "3:leaf=0.513653,cover=812"                                             
 [5] "4:leaf=-0.510132,cover=112.5"                                          
 [6] "2:[f108<-9.53674e-007] yes=5,no=6,missing=5,gain=198.174,cover=703.75" 
 [7] "5:leaf=-0.582213,cover=690.5"                                          
 [8] "6:leaf=0.557895,cover=13.25"
 ---
# 將上述結果通過樹形結構圖表達出來 
> xgb.plot.tree(model = xgboost_model)

      

 

DART

核心思想就是將dropout引入XGBoost。(待完善)

 

參考資料

陳天奇博士的PPT

XGBoost導讀和實戰

一步一步理解GB、GBDT、xgboost

xgboost原理

梯度提升樹GBDT原理

XGBoost Tutorials

機器學習算法中 GBDT 和 XGBOOST 的區別有哪些

XGBoost的github地址

自定義目標函數

DART

XGBoost: A Scalable Tree Boosting System

XGBoost: Reliable Large-scale Tree Boosting System

XGBoost 論文翻譯+個人註釋

Story and lessons behind the evolution of xgboost

Boosted Tree:一篇很有見識的文章

xgboost的原理沒你想像的那麼難

一文讀懂機器學習大殺器XGBoost原理

COS 訪談第 18 期:陳天奇

Learn R | GBDT of Data Mining(三)

Learn R | GBDT of Data Mining(四)

Get Started with XGBoost

嚴酷的魔王:xgboost:速度快效果好的boosting模型 | 統計之都

xgboost:速度快效果好的Boosting模型

機器學習算法中GBDT和XGBOOST的區別有哪些? - 知乎

[譯]快速上手:在R中使用XGBoost算法 - FinanceR

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