XgBoost推導與總結

一 。機器學習算法中GBDT和XGBOOST的區別有哪些?(轉自知乎https://www.zhihu.com/question/41354392/answer/98658997)html

xgboost相比傳統gbdt有何不一樣?xgboost爲何快?xgboost如何支持並行?

    • 傳統GBDT以CART做爲基分類器,xgboost還支持線性分類器,這個時候xgboost至關於帶L1和L2正則化項的邏輯斯蒂迴歸(分類問題)或者線性迴歸(迴歸問題)。
    • 傳統GBDT在優化時只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,xgboost工具支持自定義代價函數,只要函數可一階和二階求導。
    • xgboost在代價函數里加入了正則項,用於控制模型的複雜度。正則項裏包含了樹的葉子節點個數、每一個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來說,正則項下降了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。
    • Shrinkage(縮減),至關於學習速率(xgboost中的eta)。xgboost在進行完一次迭代後,會將葉子節點的權重乘上該係數,主要是爲了削弱每棵樹的影響,讓後面有更大的學習空間。實際應用中,通常把eta設置得小一點,而後迭代次數設置得大一點。(補充:傳統GBDT的實現也有學習速率)
    • 列抽樣(column subsampling)。xgboost借鑑了隨機森林的作法,支持列抽樣,不只能下降過擬合,還能減小計算,這也是xgboost異於傳統gbdt的一個特性。

    • 對缺失值的處理。對於特徵的值有缺失的樣本,xgboost能夠自動學習出它的分裂方向。
    • xgboost工具支持並行。boosting不是一種串行的結構嗎?怎麼並行的?注意xgboost的並行不是tree粒度的並行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數裏包含了前面t-1次迭代的預測值)。xgboost的並行是在特徵粒度上的。咱們知道,決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(由於要肯定最佳分割點),xgboost在訓練以前,預先對數據進行了排序,而後保存爲block結構,後面的迭代中重複地使用這個結構,大大減少計算量。這個block結構也使得並行成爲了可能,在進行節點的分裂時,須要計算每一個特徵的增益,最終選增益最大的那個特徵去作分裂,那麼各個特徵的增益計算就能夠開多線程進行。

  • 可並行的近似直方圖算法。樹節點在進行分裂時,咱們須要計算每一個特徵的每一個分割點對應的增益,即用貪心法枚舉全部可能的分割點。當數據沒法一次載入內存或者在分佈式狀況下,貪心算法效率就會變得很低,因此xgboost還提出了一種可並行的近似直方圖算法,用於高效地生成候選的分割點

2、xgboost參數詳解


官方參數介紹看這裏: 
Parameters (official guide)node

General Parameters(常規參數) 
1.booster [default=gbtree]:選擇基分類器,gbtree: tree-based models/gblinear: linear models 
2.silent [default=0]:設置成1則沒有運行信息輸出,最好是設置爲0. 
3.nthread [default to maximum number of threads available if not set]:線程數python

Booster Parameters(模型參數) 
1.eta [default=0.3]:shrinkage參數,用於更新葉子節點權重時,乘以該係數,避免步長過大。參數值越大,越可能沒法收斂。把學習率 eta 設置的小一些,小學習率可使得後面的學習更加仔細。 
2.min_child_weight [default=1]:這個參數默認是 1,是每一個葉子裏面 h 的和至少是多少,對正負樣本不均衡時的 0-1 分類而言,假設 h 在 0.01 附近,min_child_weight 爲 1 意味着葉子節點中最少須要包含 100 個樣本。這個參數很是影響結果,控制葉子節點中二階導的和的最小值,該參數值越小,越容易 overfitting。 
3.max_depth [default=6]: 每顆樹的最大深度,樹高越深,越容易過擬合。 
4.max_leaf_nodes:最大葉結點數,與max_depth做用有點重合。 
5.gamma [default=0]:後剪枝時,用於控制是否後剪枝的參數。 
6.max_delta_step [default=0]:這個參數在更新步驟中起做用,若是取0表示沒有約束,若是取正值則使得更新步驟更加保守。能夠防止作太大的更新步子,使更新更加平緩。 
7.subsample [default=1]:樣本隨機採樣,較低的值使得算法更加保守,防止過擬合,可是過小的值也會形成欠擬合。 
8.colsample_bytree [default=1]:列採樣,對每棵樹的生成用的特徵進行列採樣.通常設置爲: 0.5-1 
9.lambda [default=1]:控制模型複雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。 
10.alpha [default=0]:控制模型複雜程度的權重值的 L1 正則項參數,參數值越大,模型越不容易過擬合。 
11.scale_pos_weight [default=1]:若是取值大於0的話,在類別樣本不平衡的狀況下有助於快速收斂。面試

Learning Task Parameters(學習任務參數) 
1.objective [default=reg:linear]:定義最小化損失函數類型,經常使用參數: 
binary:logistic –logistic regression for binary classification, returns predicted probability (not class) 
multi:softmax –multiclass classification using the softmax objective, returns predicted class (not probabilities) 
you also need to set an additional num_class (number of classes) parameter defining the number of unique classes 
multi:softprob –same as softmax, but returns predicted probability of each data point belonging to each class. 
2.eval_metric [ default according to objective ]: 
The metric to be used for validation data. 
The default values are rmse for regression and error for classification. 
Typical values are: 
rmse – root mean square error 
mae – mean absolute error 
logloss – negative log-likelihood 
error – Binary classification error rate (0.5 threshold) 
merror – Multiclass classification error rate 
mlogloss – Multiclass logloss 
auc: Area under the curve 
3.seed [default=0]: 
The random number seed. 隨機種子,用於產生可復現的結果 
Can be used for generating reproducible results and also for parameter tuning.算法

注意: python sklearn style參數名會有所變化 
eta –> learning_rate 
lambda –> reg_lambda 
alpha –> reg_alpha多線程

三。推導過程dom

1.如下內容轉自http://www.52cs.org/?p=429,陳天奇大牛的解釋。機器學習

2. Boosted Tree的若干同義詞
說到這裏可能有人會問,爲何我沒有聽過這個名字。這是由於Boosted Tree有各類馬甲,好比GBDT, GBRT (gradient boosted regression tree),MART11,LambdaMART也是一種boosted tree的變種。網上有不少介紹Boosted tree的資料,不過大部分都是基於Friedman的最先一篇文章Greedy Function Approximation: A Gradient Boosting Machine的翻譯。我的以爲這不是最好最通常地介紹boosted tree的方式。而網上除了這個角度以外的介紹並很少。這篇文章是我我的對於boosted tree和gradient boosting 類算法的總結,其中不少材料來自於我TA UW機器學習時的一份講義22。分佈式

3. 有監督學習算法的邏輯組成
要講boosted tree,要先從有監督學習講起。在有監督學習裏面有幾個邏輯上的重要組成部件33,初略地分能夠分爲:模型,參數 和 目標函數。ide

i. 模型和參數
模型指給定輸入xixi如何去預測 輸出 yiyi。咱們比較常見的模型如線性模型(包括線性迴歸和logistic regression)採用了線性疊加的方式進行預測y^i=jwjxijy^i=∑jwjxij 。其實這裏的預測yy能夠有不一樣的解釋,好比咱們能夠用它來做爲迴歸目標的輸出,或者進行sigmoid 變換獲得機率,或者做爲排序的指標等。而一個線性模型根據yy的解釋不一樣(以及設計對應的目標函數)用到迴歸,分類或排序等場景。參數指咱們須要學習的東西,在線性模型中,參數指咱們的線性係數ww。

ii. 目標函數:損失 + 正則
模型和參數自己指定了給定輸入咱們如何作預測,可是沒有告訴咱們如何去尋找一個比較好的參數,這個時候就須要目標函數登場了。通常的目標函數包含下面兩項

1

常見的偏差函數有L=nil(yi,y^i)L=∑inl(yi,y^i) 好比平方偏差 l(yi,y^i)=(yiy^i)2l(yi,y^i)=(yi−y^i)2 ,logistic偏差函數(l(yi,y^i)=yiln(1+ey^i)+(1yi)ln(1+ey^i)l(yi,y^i)=yiln⁡(1+e−y^i)+(1−yi)ln⁡(1+ey^i) )等。而對於線性模型常見的正則化項有L2L2正則和L1L1正則。這樣目標函數的設計來自於統計學習裏面的一個重要概念叫作Bias-variance tradeoff44。比較感性的理解,Bias能夠理解爲假設咱們有無限多數據的時候,能夠訓練出最好的模型所拿到的偏差。而Variance是由於咱們只有有限數據,其中隨機性帶來的偏差。目標中偏差函數鼓勵咱們的模型儘可能去擬合訓練數據,這樣相對來講最後的模型會有比較少的 bias。而正則化項則鼓勵更加簡單的模型。由於當模型簡單以後,有限數據擬合出來結果的隨機性比較小,不容易過擬合,使得最後模型的預測更加穩定。

iii. 優化算法
講了這麼多有監督學習的基本概念,爲何要講這些呢? 是由於這幾部分包含了機器學習的主要成分,也是機器學習工具設計中劃分模塊比較有效的辦法。其實這幾部分以外,還有一個優化算法,就是給定目標函數以後怎麼學的問題。之因此我沒有講優化算法,是由於這是你們每每比較熟悉的「機器學習的部分」。而有時候咱們每每只知道「優化算法」,而沒有仔細考慮目標函數的設計的問題,比較常見的例子如決策樹的學習,你們知道的算法是每一步去優化gini entropy,而後剪枝,可是沒有考慮到後面的目標是什麼。

4. Boosted Tree
i. 基學習器:分類和迴歸樹(CART)
話題回到boosted tree,咱們也是從這幾個方面開始講,首先講模型。Boosted tree 最基本的組成部分叫作迴歸樹(regression tree),也叫作CART55。

2

上面就是一個CART的例子。CART會把輸入根據輸入的屬性分配到各個葉子節點,而每一個葉子節點上面都會對應一個實數分數。上面的例子是一個預測一我的是否會喜歡電腦遊戲的 CART,你能夠把葉子的分數理解爲有多可能這我的喜歡電腦遊戲。有人可能會問它和decision tree的關係,其實咱們能夠簡單地把它理解爲decision tree的一個擴展。從簡單的類標到分數以後,咱們能夠作不少事情,如機率預測,排序。

 

ii. Tree Ensemble
一個CART每每過於簡單沒法有效地預測,所以一個更增強力的模型叫作tree ensemble。

image2

在上面的例子中,咱們用兩棵樹來進行預測。咱們對於每一個樣本的預測結果就是每棵樹預測分數的和。到這裏,咱們的模型就介紹完畢了。如今問題來了,咱們常見的隨機森林和boosted tree和tree ensemble有什麼關係呢?若是你仔細的思考,你會發現RF和boosted tree的模型都是tree ensemble,只是構造(學習)模型參數的方法不一樣。第二個問題:在這個模型中的「參數」是什麼。在tree ensemble中,參數對應了樹的結構,以及每一個葉子節點上面的預測分數。

最後一個問題固然是如何學習這些參數。在這一部分,答案可能千奇百怪,可是最標準的答案始終是一個:定義合理的目標函數,而後去嘗試優化這個目標函數。在這裏我要多說一句,由於決策樹學習每每充滿了heuristic。 如先優化吉尼係數,而後再剪枝啦,限制最大深度,等等。其實這些heuristic的背後每每隱含了一個目標函數,而理解目標函數自己也有利於咱們設計學習算法,這個會在後面具體展開。
對於tree ensemble,咱們能夠比較嚴格的把咱們的模型寫成是:

y^i=Kk=1fk(xi),fkFy^i=∑k=1Kfk(xi),fk∈F

  其中每一個ff是一個在函數空間66(FF)裏面的函數,而FF對應了全部regression tree的集合。咱們設計的目標函數也須要遵循前面的主要原則,包含兩部分

Obj(Θ)=nil(yi,y^i)+Kk=1Ω(fk)Obj(Θ)=∑inl(yi,y^i)+∑k=1KΩ(fk)

iii. 模型學習:additive training
其中第一部分是訓練偏差,也就是你們相對比較熟悉的如平方偏差, logistic loss等。而第二部分是每棵樹的複雜度的和。這個在後面會繼續講到。由於如今咱們的參數能夠認爲是在一個函數空間裏面,咱們不能採用傳統的如SGD之類的算法來學習咱們的模型,所以咱們會採用一種叫作additive training的方式(另外,在我我的的理解裏面77,boosting就是指additive training的意思)。每一次保留原來的模型不變,加入一個新的函數$f$到咱們的模型中。

4

如今還剩下一個問題,咱們如何選擇每一輪加入什麼ff呢?答案是很是直接的,選取一個ff來使得咱們的目標函數儘可能最大地下降88。
5
這個公式可能有些過於抽象,咱們能夠考慮當ll是平方偏差的狀況。這個時候咱們的目標能夠被寫成下面這樣的二次函數99:
6
更加通常的,對於不是平方偏差的狀況,咱們會採用以下的泰勒展開近似來定義一個近似的目標函數,方便咱們進行這一步的計算。
7
當咱們把常數項移除以後,咱們會發現以下一個比較統一的目標函數。這一個目標函數有一個很是明顯的特色,它只依賴於每一個數據點的在偏差函數上的一階導數和二階導數1010。有人可能會問,這個材料彷佛比咱們以前學過的決策樹學習難懂。爲何要花這麼多力氣來作推導呢?
8
由於這樣作使得咱們能夠很清楚地理解整個目標是什麼,而且一步一步推導出如何進行樹的學習。這一個抽象的形式對於實現機器學習工具也是很是有幫助的。傳統的GBDT可能你們能夠理解如優化平法aa殘差,可是這樣一個形式包含可全部能夠求導的目標函數。也就是說有了這個形式,咱們寫出來的代碼能夠用來求解包括迴歸,分類和排序的各類問題,正式的推導可使得機器學習的工具更加通常

iv. 樹的複雜度
到目前爲止咱們討論了目標函數中訓練偏差的部分。接下來咱們討論如何定義樹的複雜度。咱們先對於f的定義作一下細化,把樹拆分紅結構部分qq和葉子權重部分ww。下圖是一個具體的例子。結構函數qq把輸入映射到葉子的索引號上面去,而ww給定了每一個索引號對應的葉子分數是什麼。
9
當咱們給定了如上定義以後,咱們能夠定義一棵樹的複雜度以下。這個複雜度包含了一棵樹裏面節點的個數,以及每一個樹葉子節點上面輸出分數的$L2$模平方。固然這不是惟一的一種定義方式,不過這必定義方式學習出的樹效果通常都比較不錯。下圖還給出了複雜度計算的一個例子。

10

v. 關鍵步驟
接下來是最關鍵的一步1111,在這種新的定義下,咱們能夠把目標函數進行以下改寫,其中I被定義爲每一個葉子上面樣本集合 IjIj = { i|q(xi)=ji|q(xi)=j}

a

這一個目標包含了TT個相互獨立的單變量二次函數。咱們能夠定義

Gj=iIjgiHj=iIjhiGj=∑i∈IjgiHj=∑i∈Ijhi

  那麼這個目標函數能夠進一步改寫成以下的形式,假設咱們已經知道樹的結構qq,咱們能夠經過這個目標函數來求解出最好的ww,以及最好的ww對應的目標函數最大的增益

Obj(t)=Tj=1[(iIjgi)wj+12(iIjhi+λ)w2j]+γT=Tj=1[Gjwj+12(Hj+λ)w2j]+γTObj(t)=∑j=1T[(∑i∈Ijgi)wj+12(∑i∈Ijhi+λ)wj2]+γT=∑j=1T[Gjwj+12(Hj+λ)wj2]+γT

  這兩個的結果對應以下,左邊是最好的ww,右邊是這個ww對應的目標函數的值。到這裏你們可能會以爲這個推導略複雜。其實這裏只涉及到了如何求一個一維二次函數的最小值的問題1212。若是以爲沒有理解不妨再仔細琢磨一下

wj=GjHj+λObj=12Tj=1G2jHj+λ+γTwj∗=−GjHj+λObj=−12∑j=1TGj2Hj+λ+γT

vi. 打分函數計算舉例
Obj表明了當咱們指定一個樹的結構的時候,咱們在目標上面最多減小多少。咱們能夠把它叫作結構分數(structure score)。你能夠認爲這個就是相似吉尼係數同樣更加通常的對於樹結構進行打分的函數。下面是一個具體的打分函數計算的例子
1

vii. 枚舉全部不一樣樹結構的貪心法
因此咱們的算法也很簡單,咱們不斷地枚舉不一樣樹的結構,利用這個打分函數來尋找出一個最優結構的樹,加入到咱們的模型中,再重複這樣的操做。不過枚舉全部樹結構這個操做不太可行,因此經常使用的方法是貪心法,每一次嘗試去對已有的葉子加入一個分割。對於一個具體的分割方案,咱們能夠得到的增益能夠由以下公式計算

image1
對於每次擴展,咱們仍是要枚舉全部可能的分割方案,如何高效地枚舉全部的分割呢?我假設咱們要枚舉全部 x<ax<a 這樣的條件,對於某個特定的分割aa咱們要計算aa左邊和右邊的導數和。
13
咱們能夠發現對於全部的aa,咱們只要作一遍從左到右的掃描就能夠枚舉出全部分割的梯度和GLGL和GRGR。而後用上面的公式計算每一個分割方案的分數就能夠了。

觀察這個目標函數,你們會發現第二個值得注意的事情就是引入分割不必定會使得狀況變好,由於咱們有一個引入新葉子的懲罰項。優化這個目標對應了樹的剪枝, 當引入的分割帶來的增益小於一個閥值的時候,咱們能夠剪掉這個分割。你們能夠發現,當咱們正式地推導目標的時候,像計算分數和剪枝這樣的策略都會天然地出現,而再也不是一種由於heuristic而進行的操做了。

講到這裏文章進入了尾聲,雖然有些長,但願對你們有所幫助,這篇文章介紹瞭如何經過目標函數優化的方法比較嚴格地推導出boosted tree的學習。由於有這樣通常的推導,獲得的算法能夠直接應用到迴歸,分類排序等各個應用場景中去。 

 尋找分裂結點的候選集 
一、暴力枚舉

二、近似方法 ,近似方法經過特徵的分佈,按照百分比肯定一組候選分裂點,經過遍歷全部的候選分裂點來找到最佳分裂點。 
兩種策略:全局策略和局部策略。在全局策略中,對每個特徵肯定一個全局的候選分裂點集合,就再也不改變;而在局部策略中,每一次分裂 都要重選一次分裂點。前者須要較大的分裂集合,後者能夠小一點。對比補充候選集策略與分裂點數目對模型的影響。 全局策略須要更細的分裂點才能和局部策略差很少

三、Weighted Quantile Sketch

這裏寫圖片描述

近似算法的主要思想就是將每一個特徵的值劃分範圍,而不是暴力枚舉,在劃分的時候是經過特徵值分佈密度的面積來劃分的,經過構建直方圖來計算面試,儘可能使得劃分以後的每一個部分面積差很少。

相關文章
相關標籤/搜索