xgboost 算法總結


  

xgboost有一篇博客寫的很清楚,但是現在網址已經失效了,之前轉載過,可以搜索XGBoost 與 Boosted Tree。

現在參照這篇,自己對它進行一個總結。

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

一、基學習器:分類和回歸樹(CART) 

cart樹既可以 進行分類,也可以進行回歸,但是兩種情況下,采用的切分變量選擇方式不同。

CART在進行回歸的時候,選擇最優切分變量和切分點采用的是如下的標准

其中,c和c2滿足下式,即為該段變量取值的均值

 

CART采用暴力的遍歷方式來確定最優切分變量和切分點,具體算法如下:

CART分類樹的算法類似,由於分類無法計算均值,CART分類樹采用的是計算基尼指數,通過遍歷所有特征和他們的可能切分點,選擇基尼指數最小的特征及切分點作為最優特征和最優切分點,並重復調用,直到生成CART分類樹。

二、Tree Ensemble

如果單棵樹的過於簡單無法有效地預測,因此一個更加強力的模型叫做tree ensemble,也就是分類樹的集成算法。如果采用boost集成,也就是加法集成,可以寫成如下

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

目標函數如下:

前半部分是誤差函數,后半部分是正則化項。

 三、模型學習 additive training 

因為現在我們的參數可以認為是在一個函數空間里面,我們不能采用傳統的如SGD之類的算法來學習我們的模型,因此我們會采用一種叫做additive training的方式。。每一次保留原來的模型不變,加入一個新的函數ff到我們的模型中。

現在還剩下一個問題,我們如何選擇每一輪加入什么f呢?答案是非常直接的,選取一個f來使得我們的目標函數盡量最大地降低

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

 

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

當我們把常數項移除之后,我們會發現如下一個比較統一的目標函數。這一個目標函數有一個非常明顯的特點,它只依賴於每個數據點的在誤差函數上的一階導數和二階導數

四、樹的復雜度 

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

當我們給定了如上定義之后,我們可以定義一棵樹的復雜度如下。這個復雜度包含了一棵樹里面節點的個數,以及每個樹葉子節點上面輸出分數的L2模平方。當然這不是唯一的一種定義方式,不過這一定義方式學習出的樹效果一般都比較不錯。

五、關鍵步驟 

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

 這樣目標函數可以如下變化,使用步驟四中的方式來表示誤差函數和復雜度,如下

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

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

六、打分函數計算舉例

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

第五部分中提到的Obj代表了當我們指定一個樹的結構的時候,我們在目標上面最多減少多少。我們可以把它叫做結構分數(structure score)。你可以認為這個就是類似吉尼系數一樣更加一般的對於樹結構進行打分的函數。下面是一個具體的打分函數計算的例子 

七、枚舉所有不同樹結構的貪心法

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

 

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

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

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

 八、最后:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM