GBDT(Gradient Boosting Decision Tree) 沒有實現只有原理

GBDT(Gradient Boosting Decision Tree) 沒有實現只有原理

            阿彌陀佛,好久沒寫文章,實在是受不了了,特來填坑,最近實習了(ting)解(shuo)到(le)很多工業界常用的演算法,諸如GBDT,CRF,topic model的一些演算法等,也看了不少東西,有時間可以詳細寫一下,而至於實現那真的是沒時間沒心情再做了,等回學校了再說吧。今天我們要說的就是GBDT(Gradient Boosting Decision Tree)

=======================================================================

〇.前序

            GBDT是看一個大牛團隊做推薦演算法比賽的時候拿這個模型來處理最後得到的所有的feature並輸出結果的模型,想到自己以前天真地拿著SVD單模型調參參加這類比賽的時候真是……聞者傷心,聽著流淚啊,別的不談,這次講GBDT主要是因為了解GBDT的一些前置條件我都在部落格裡寫過,可以直接跳到關鍵部分開寫……進入正題吧

一.前置條件

       1.決策樹 

            參看我以前的一篇部落格:http://blog.csdn.net/dark_scope/article/details/13168827

            雖然裡面寫的都是決策分類樹,而我們這次主講的是決策迴歸樹,不過其實都差不多,決策迴歸樹呢就是把分到某個分支上的所有訓練樣例的目標值求平均或者取中位數返回而已。

       2.boosting

             一般來說哦講boosting都以adaboost這個特例開始講,所以你可以先看一看我的這篇部落格:AdaBoost–從原理到實現

             然後我們來接著講boosting……新開一章吧,這個其實是主要內容

二.boosting 提升方法

         提升方法其實是一個比adaboost概念更大的演算法,因為adaboost可以表示為boosting的前向分佈演算法(Forward stagewise additive modeling)的一個特例,boosting最終可以表示為:

                                    

         其中的w是權重,Φ是弱分類器(迴歸器)的集合,其實就是一個加法模型(即基函式的線性組合)

         前向分佈演算法 實際上是一個貪心的演算法,也就是在每一步求解弱分類器Φ(m)和其引數w(m)的時候不去修改之前已經求好的分類器和引數:

         (圖自《統計學習方法》)

       為了表示方便,我們以後用β代替w進行描述了,圖中的b是之前說的Φ弱分類器

        OK,這也就是提升方法(之前向分佈演算法)的大致結構了,可以看到其中存在變數的部分其實就是極小化損失函式 這關鍵的一步了,如何選擇損失函式決定了演算法的最終效果(名字)……這一步你可以看出演算法的“趨勢”,以後再單獨把“趨勢”拿出來說吧,因為我感覺理解演算法的關鍵之一就是理解演算法公式的“趨勢”

三.各種提升方法

        不同的損失函式和極小化損失函式方法決定了boosting的最終效果,我們現在來說幾個常見的boosting:

        

        (圖自 Machine Learning A Probabilistic Perspective)對於二分類問題來說:其中πi=sigm(2f(xi)) ,y~i∈{-1, 1},yi∈{0,1}

         廣義上來講,所謂的Gradient Boosting 其實就是在更新的時候選擇梯度下降的方向來保證最後的結果最好,一些書上講的“殘差”
方法其實就是L2Boosting吧,因為它所定義的殘差其實就是L2Boosting的Derivative,接下來我們著重講一下弱迴歸器(不知道叫啥了,自己編的)是決策樹的情況,也就是GBDT。(不知道為何上表的Absolute被命名為了Gradient boosting,關於Gradient boosting在後面會有更細緻的介紹)

四.GBDT

         對於決策樹,其實可以把它表示為下式,即是把特徵空間劃分為多個區域,每個區域返回某個值作為決策樹的預測值

                                          

          其中Rj是區域,γ是返回值,I()在其中的條件成立情況下為1,否則為0.其中的引數J可以大概看做樹的深度的一個表示,這是一個待調的引數

我們知道Gradient Boosting最重要的一步就是去擬合下式:

 
 

對於不同的Loss function,其梯度有不同的表示式:

(圖自The Elements of Statisic Learning)

前三種對應的loss function如下圖:其中Huber是低於某個值表現為square error,高於某個值則表現為線性

下面是GBDT的大概框架:(Gradient
Tree Boosting應該是GBDT另一種說法,有誤請指正)

(演算法自The Elements of Statistical Learning )

整個框架描述得其實已經很清晰了,就不在這裡贅述了,總之所謂Gradient就是去擬合Loss function的梯度,將其作為新的弱迴歸樹加入到總的演算法中即可。

五.尾巴

本文大概寫了一下GBDT的框架和原理,後續其實還有涉及到引數的選擇(如樹的深度),正則化(regularization)等內容,主要是在實現的時候要注意,有時間會寫一份toy程式碼出來。

【Reference】

【1】《The Elements of Statistical Learning 》

【2】《統計學習方法》

【3】《Machine Learning A Probabilistic Perspective》