xgboost 算法總結

  

xgboost有一篇博客寫的很清楚,可是如今網址已經失效了,以前轉載過,能夠搜索XGBoost 與 Boosted Tree。git

如今參照這篇,本身對它進行一個總結。github

xgboost是GBDT的後繼算法,也是採用boost算法的cart 樹集合。算法

1、基學習器:分類和迴歸樹(CART) 函數

cart樹既能夠 進行分類,也能夠進行迴歸,可是兩種狀況下,採用的切分變量選擇方式不一樣。工具

CART在進行迴歸的時候,選擇最優切分變量和切分點採用的是以下的標準學習

其中,c和c2知足下式,即爲該段變量取值的均值
優化

 

CART採用暴力的遍歷方式來肯定最優切分變量和切分點,具體算法以下:spa

CART分類樹的算法相似,因爲分類沒法計算均值,CART分類樹採用的是計算基尼指數,經過遍歷全部特徵和他們的可能切分點,選擇基尼指數最小的特徵及切分點做爲最優特徵和最優切分點,並重復調用,直到生成CART分類樹。xml

2、Tree Ensembleblog

若是單棵樹的過於簡單沒法有效地預測,所以一個更增強力的模型叫作tree ensemble,也就是分類樹的集成算法。若是採用boost集成,也就是加法集成,能夠寫成以下

其中每一個f是一個在函數空間裏面的函數,而對應了全部regression tree的集合。

目標函數以下:

前半部分是偏差函數,後半部分是正則化項。

 3、模型學習 additive training 

由於如今咱們的參數能夠認爲是在一個函數空間裏面,咱們不能採用傳統的如SGD之類的算法來學習咱們的模型,所以咱們會採用一種叫作additive training的方式。。每一次保留原來的模型不變,加入一個新的函數ff到咱們的模型中。

如今還剩下一個問題,咱們如何選擇每一輪加入什麼f呢?答案是很是直接的,選取一個f來使得咱們的目標函數儘可能最大地下降

這個公式可能有些過於抽象,咱們能夠考慮當ll是平方偏差的狀況。這個時候咱們的目標能夠被寫成下面這樣的二次函數

 

 更加通常的,對於不是平方偏差的狀況,咱們會採用以下的泰勒展開近似來定義一個近似的目標函數,方便咱們進行這一步的計算

當咱們把常數項移除以後,咱們會發現以下一個比較統一的目標函數。這一個目標函數有一個很是明顯的特色,它只依賴於每一個數據點的在偏差函數上的一階導數和二階導數

4、樹的複雜度 

到目前爲止咱們討論了目標函數中訓練偏差的部分。接下來咱們討論如何定義樹的複雜度。咱們先對於f的定義作一下細化,把樹拆分紅結構部分q和葉子權重部分w。下圖是一個具體的例子。結構函數q把輸入映射到葉子的索引號上面去,而w給定了每一個索引號對應的葉子分數是什麼

當咱們給定了如上定義以後,咱們能夠定義一棵樹的複雜度以下。這個複雜度包含了一棵樹裏面節點的個數,以及每一個樹葉子節點上面輸出分數的L2模平方。固然這不是惟一的一種定義方式,不過這必定義方式學習出的樹效果通常都比較不錯。

5、關鍵步驟 

這是xgboost最巧妙處理的部分,在這種新的定義下,咱們能夠把目標函數進行以下改寫,其中被定義爲每一個葉子上面樣本集合

 這樣目標函數能夠以下變化,使用步驟四中的方式來表示偏差函數和複雜度,以下

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

這是一個關於的二次函數,能夠知道最值以下:

6、打分函數計算舉例

 最後一部分是算法計算的簡化。

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

7、枚舉全部不一樣樹結構的貪心法

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

 

對於每次擴展,咱們仍是要枚舉全部可能的分割方案,如何高效地枚舉全部的分割呢?我假設咱們要枚舉全部 x小於a 這樣的條件,對於某個特定的分割a咱們要計算a左邊和右邊的導數和。

咱們能夠發現對於全部的a,咱們只要作一遍從左到右的掃描就能夠枚舉出全部分割的梯度和GL和GR。而後用上面的公式計算每一個分割方案的分數就能夠了。

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

 8、最後:

 xgboost的github地址: https://github.com/dmlc/xgboost 。xgboost是大規模並行boosted tree的工具,它是目前最快最好的開源boosted tree工具包,比常見的工具包快10倍以上。

相關文章
相關標籤/搜索