決策樹系列(四):集成學習->boosting->提升樹->GBDT(梯度提升決策樹)-詳細原理解析

1、GBDT簡介

GBDT,英文全稱是Gradient Boosting Decision Tree,梯度提升決策樹,顧名思義,與梯度、boosting算法、決策樹有關。是一種迭代的決策樹算法,由多棵決策樹組成,每一顆決策樹也叫做基學習器,GBDT最後的結果就是將所有基學習器的結果相加。

從" GBDT累加所有樹的結果作爲最終結果 "這一點來看,我們就知道GBDT中的決策樹是迴歸樹,不是分類樹。並且每棵樹的結論並不是樣本目標值本身,而是目標值的一個累加量。這就是GBDT的核心所在——每一棵樹擬合的是之前所有樹結論和的累加值。這個累加量在某些時候代表的是"殘差 ",某些時候代表的是“殘差的近似值”,這一點下面會展開。

2、集成算法

GBDT既然跟boosting算法有關,就先來講講boosting算法,boosting是集成算法的一種。如果不想看,直接跳到GBDT章節,再回過頭來看也可以。Boosting,是集成學習算法的一種。什麼是集成學習算法?可參考決策樹系列(一):集成學習(ensemble learning)->boosting與bagging的區別。下面來簡單介紹一下。

集成算法,是一種提高弱分類算法準確度的方法,就是將多個弱分類算法(基學習器)以一定的方式集合在一起,然後再以一定的方式集結多個弱學習算法的結果,作爲最終的結果。集成學習通過將多個學習器進行結合,常可獲得比單一學習器顯著優越的泛化性能。

根據集成基學習器方式的不同,會細分爲不同的算法,大致分爲以下2種:
(1)各個基學習器之間相互獨立,不存在依賴關係,典型算法有bagging、隨機森林;
(2)各個基學習器之間存在強依賴關係,每一個基學習器都是在前一個基學習器的基礎上才能生成,典型算法有boosting。

集成算法的結果集合策略也有很多種:
(1) 平均法
(2)加權平均法
(3)投票法
(4)學習法

3、boosting算法

Boosting,是集成學習算法的一種,屬於基學習器之間存在強依賴關係的那一種,並且將所有基分類器的結果相加作爲算法的最後結果。

所以簡單來說,boosting算法,是一個加法模型(將若干個基學習器加在一起,每一個基學習器都有一個係數。用所有基學習器結果的加權和,作爲該算法的最終結果),並且每一個基分類器是在前一個基分類器的基礎之上生成的。

那麼boosting算法究竟是怎麼學習,得到最終結果的呢?

怎麼將boosting算法的原理數學化,變成可以求解的數學公式??將【boosting算法,是將若干個基學習器加在一起,每一個基學習器都有一個係數,並且每一個基分類器是在前一個基分類器的基礎之上生成的。】這句話,數學化就是:boosting算法,就是一個加法模型,利用前向分佈算法作爲優化方法,實現學習,得到最終結果。

什麼是加法模型?

就是基學習器的線性組合。boosting算法不是將若干個基學習器集成在一起嗎?怎麼集成的?就是簡單地將多個基學習器相加,每一個基學習器有一個係數。就是這麼簡單。用一個數學公式表示就是:
加法模型
什麼是算法模型的學習/優化?

用一個算法去預測樣本的目標值,我們怎麼知道這個算法模型好不好用呢?看該算法對樣本的預測值與樣本真實值之間的差異,差異越小,說明該模型算法越好用。

一個算法模型,在最初的參數下,不能保證是好用的,用此時的模型對樣本進行預測,預測值與樣本真實值之間的差異,不能保證是最小的。所以我們就需要讓該算法進行學習,學習的目標就是讓樣本預測值與真實值之間的差異最小,學習的過程就是不斷調整模型參數,以縮小這個差異,直到縮小到足夠小。我們平時說的模型算法的學習過程,就指的是這個過程。

樣本預測值與其真實值之間的差異,總得有一個數學公式來表示,這個數學公式就叫做損失函數,損失函數的值就是樣本預測值與真實值之間的差異。損失函數有很多種定義方式,各有優缺點,這裏先不展開。

在給定訓練數據集S={s1,s2,...,sN}S = {\{s_1, s_2, ..., s_N\}}和損失函數L(y,f(x))L(y, f(x))的情況下,以加法模型爲例,學習加法模型f(x)f(x)就是讓損失函數極小化,可以用以下的數學公式表示:
在這裏插入圖片描述

總結幾種說法,以下幾種說法代表的是同一種意思:
優化一個算法模型 
= 學習一個算法模型 
= 不斷調整該算法模型的參數,使得該算法對樣本的預測值與樣本真實值之間的差異越來越小,直到達到足夠小 
= 不斷調整該算法模型的參數,使得該算法朝着損失函數最小化的方向前進,直到滿足條件

什麼是前向分步算法?

是一種優化方法。

既然算法要進行學習,那麼怎麼來調整算法模型的參數,才能使得損失函數最小呢?總得有一個方法來指導,不能瞎調。這個方法就是我們說的優化方法

加法模型朝着損失函數最小化的方向進行優化,所使用的優化方法就叫做前向分步算法。

優化問題一般都很複雜,加法模型算法涉及到若干個基學習器,每一個基學習器就是一個小算法,要優化若干個小算法,使其整體沿着整體損失函數最小化的方向前進,究竟該怎麼做?基於加法模型的特點,發現如果能夠從前向後,每一步只學習/優化一個基分類器及其係數,逐步逼近最終目標(8.14),就可以簡化優化的複雜度。事情證明,此種方法確實可行,具體步驟如下:
前向分步算法
上面的過程就是boosting算法的學習/優化步驟的大體框架。
那麼損失函數應該使用什麼?公式(8.16)怎麼實現?往下看。

4、提升樹:boosting+決策樹

當boosting算法中的基學習器是決策樹時,這個模型算法就叫做提升樹。

提升樹模型: 採用加法模型(基函數的線性組合),優化方法採用前向分步算法,同時基函數採用決策樹,對待分類問題採用二叉分類樹,對於迴歸問題採用二叉迴歸樹。提升樹模型整體結構如下:
提升樹模型
進一步展開,具體步驟僞代碼如下:提升樹算法步驟
哪個地方體現了boosting算法中,各個基分類器之間存在強依賴關係?這個強依賴關係是怎樣的?

步驟(a)(b)體現了這一點。基分類器是迴歸樹,強依賴關係就是:每一顆迴歸樹擬合的是樣本在前一棵迴歸樹的殘差(當損失函數是平方誤差損失時)。

爲什麼是擬合殘差呢?
殘差
當選用其他損失函數,如指數函數、負二項似然對數損失函數等一般損失函數的時候,殘差就不好計算了。那麼當損失函數是一般損失函數的時候,每一棵迴歸樹擬合的是什麼?擬合的是損失函數的負梯度值(作爲殘差的近似值),這個就是GBDT的核心思想,GBDT章節會展開論述。

boosting算法中還有一步,步驟(8.25):最小化損失函數,可是看上面的僞代碼,沒有這一部分啊?最小化損失函數的操作體現在哪?

體現在步驟(b)。讓每一棵樹擬合前一棵樹殘差的過程,就是最小化損失函數的過程。因爲,殘差 yfm1{y-f_{m-1}}實際上是平方誤差損失函數的負梯度。這樣的話,每一棵迴歸樹,擬合的就是該損失函數的負梯度,然後以此類推,之後產生的每一棵迴歸樹都是朝着損失函數的負梯度方向進行學習擬合。所以整體來看,整個算法就是朝着損失函數的負梯度方向進行學習的,這個不就是梯度下降算法麼?梯度下降算法就是最小化損失函數的算法啊。

上面步驟中,每一棵迴歸樹有了擬合目標值,但究竟是怎麼進行擬合,整棵樹的結構是怎麼產生的?

可以參考決策樹系列(一):CART-分類迴歸樹-建模步驟以及代碼,但是在這裏我在詳細地梳理一下,具體步驟如下:
在這裏插入圖片描述
提升樹生成過程
到這裏,大家就應該明白了提升樹究竟是什麼,並且具體是怎麼學習生成的。

但是有一個問題:當提升樹的損失函數爲均方誤差、指數損失時,每一步優化(最小化損失函數)是簡單的(後一棵樹擬合前一棵樹的殘差),但對於一般損失函數而言,往往每一步的優化並不容易。Freidman提出了梯度提升(Gradient Boosting)算法,利用最速下降的近似方法,其關鍵是利用損失函數的負梯度在當前模型的值作爲提升樹算法中殘差的近似值,擬合一個迴歸樹。這就是GBDT

5、GBDT算法

將上面的內容總結一下:
集成算法: 將多個弱分類算法(基學習器)以一定的方式集合在一起,然後再以一定的方式集結多個弱學習算法的結果,作爲最終的結果。有2種基學習器集成方法:1、 各個基學習器之間相互獨立;2、 各個基學習器之間存在強依賴關係。

boosting算法: 是一個加法模型(將若干個基學習器加在一起,每一個基學習器都有一個係數。用所有基學習器結果的加權和,作爲該算法的最終結果),並且每一個基分類器是在前一個基分類器的基礎之上生成的。

提升樹算法: boosting+決策樹 = 採用加法模型,優化方法採用前向分步算法,以決策樹爲基學習器,每一棵樹擬合的是前一棵樹的殘差(損失函數是均方誤差損失函數)。決策樹可以是迴歸樹,也可以是分類樹。

GBDT: 梯度提升決策樹 = 梯度 + 提升樹,也是一個加法模型,優化算法採用前向分步算法,以迴歸樹爲基學習器(就算解決的是分類任務,也是使用迴歸樹,不是分類樹),每一顆迴歸樹擬合是損失函數的負梯度在上一顆迴歸樹時的值(損失函數爲一般損失函數)。迴歸樹是什麼,可以看這個決策樹系列(一):CART-分類迴歸樹-建模步驟以及代碼

GBDT算法模型,具體步驟僞代碼如下:
GBDT算法模型
其中,迴歸樹的生成過程同提升樹的生成方法。

哪個地方體現了boosting算法中,各個分類器之間存在強依賴關係?

步驟(a)(b),基分類器是迴歸樹,每一棵迴歸樹是在前一棵迴歸樹的基礎之上生成的。強依賴關係就是:當損失函數是任何一般損失函數時,每一顆迴歸樹擬合的是損失函數的負梯度在前一棵迴歸樹時的值。

當每一棵迴歸樹的損失函數是平方損失函數時,每一棵決策樹(除了第一棵決策樹)擬合的是上一棵樹的殘差;當每一顆迴歸樹的損失函數是一般的損失函數時,每一棵決策樹擬合的是上一棵樹殘差的近似值:損失函數的負梯度。

boosting算法中還有一步,步驟(8.25):最小化損失函數,可是看上面的僞代碼,沒有這一部分啊?最小化損失函數的操作體現在哪?

體現在步驟(b)。讓每一棵樹擬合損失函數的負梯度在前一棵迴歸樹時的值的過程,就是最小化損失函數的過程。每一棵迴歸樹,都是朝着該損失函數的負梯度方向進行學習擬合。整體來看,整個算法就是朝着損失函數的負梯度方向進行學習,這個不就是梯度下降算法麼?梯度下降算法就是最小化損失函數的算法。

GBDT更詳細的代碼層級的步驟如下:
在這裏插入圖片描述
還有一個問題,怎麼初始化最一開始的加法模型?

在GBDT中,最一開始的加法模型被初始化成了
在這裏插入圖片描述
爲什麼?
在這裏插入圖片描述

參考文獻

【1】Boosting(Adboost、GBDT、Xgboost)
【2】李航《統計學習》
【3】GBDT詳解
【4】https://github.com/zhaoxingfeng/GBDT

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