1. 程式人生 > >【機器學習】筆記--梯度提升(Gradient boosting)

【機器學習】筆記--梯度提升(Gradient boosting)

1 提升的概念

提升是機器學習技術,可以用於迴歸和分類問題,它每一步產生一個弱預測模型(如決策樹),並加權累加到總模型中;如果每一步的弱預測模型生成都市一句損失函式的梯度方向,則稱之為梯度提升(Gradient boosting).

梯度提升演算法首先給定一個目標函式,它的定義域是所有可行的弱函式集合(基函式);提升演算法通過迭代的選擇一個負梯度方向上的基函式來逐漸逼近區域性極小值。這種在函式域的梯度提升觀點對機器學習的很多領域有深刻影響。

提升的理論意義:如果一個問題存在弱分類器,則可以通過提升的辦法得到強分類器。

額。。這串概念是什麼鬼,看完肯定還不知所云提升是啥玩意兒吧。先不要急,心亂如麻先看下去。

2.提升演算法與推導

2.1 提升演算法大致思路

現在用公式來解釋一下提升演算法的大致思路。

給定輸入向量x和輸出向量y組成的若干訓練樣本: 
(x1,y1), (x2, y2),(x3, y3)…(xn, yn)

目標是要找出一個近似函式640?wx_fmt=png,使得損失函式L(y, F(x))的損失最小。

其中損失函式L(y, F(x))的形式有多種,比較典型為: 
640? 
y是樣本的實際值,F(x)是通過模型F預測出來的預測值,兩者的差距就形成了損失。

也就是說,通過損失最小的目標函式,最終會求的一個最有的函式

640?,那麼這個最優的函式肯定是損失的期望最小的。 
640?

好了,現在已經很明確,我們的目標是去求最優的F(X)函式,它做出的預測與實際的值的差距是最小的,也就是預測是最準的,這當然是我們求之不得的啦。那麼怎麼去求這個F(X)呢? 
它是一個強預測模型,上面的概念裡最後一句回答了,弱預測模型可以通過提升的方式變成強預測模型。

所以的所以,我們假定F(x)是一組基函式(弱預測函式)f(xi)的加權和。 
640? 
γ是每個基函式的權重。

於是問題變成了求取基函式,以及它們對應的權值γ。

2.2 梯度提升演算法的推導

以上大致瞭解了基本思路之後,現在我們重點來講下推導的過程。

要求得的最優函式F(X)是由一組基函式f(x)加權而來。 
基函式:f0, f1, f2…fn 
權值:γ0, γ1, γ2,…γn

首先,給定常函式F0(x): 
640?

使得第一個基函式f0 = 1,所以F0(x)就簡化為以上公式。以上函式中未知數為γ。目標是要求以上函式最小值時γ為多少,其實就是定義F0(x)求導=0, 求出來之後常係數γ=1/n。

於是現在我們有了f0和γ0,即第一個基函式與它的權值,即F0(x)。那麼如何繼續求接下去的基函式與權值呢?這裡以貪心演算法的思路擴充套件到Fm(x)(貪心演算法就是運籌學裡的動態規劃): 
640? 
假設我們已經知道了Fm-1(x),即已經知道了f0,f1,…fm-1,與γ0,γ1…γm-1,可以將以上函式求出最優的f(xi),從而求得最優的Fm(x).

然而貪心法在每次選擇最優基函式f時仍然困難。所以,選擇使用梯度下降的方法來近似計算。過程是這樣的: 
將樣本代入基函式f得到了f(x1), f(x2), …,f(xn),從而L退化維向量L(y1,f(x1)), L(y2, f(x2)),…,L(yn, f(xn)) 
於是可以對損失函式求f的偏導: 
640?

上式的權值γ為梯度下降的步長,使用線性搜尋求最優步長: 
640?

以前的梯度下降法是求出最小值時的那個x,現在是求最小值時的那個函式f(這個函式f有可能是決策樹模型,邏輯迴歸模型等等)。

來來來,把上面的再理一下思路:

1.初始給定的模型為常數640? =1

2.對於m=1到M 
(1)
640?

(2)使用資料640?計算你和參差的基函式fm(x). 
說人話,就是通過求得參差,我們有了一組新的資料
640?,假設這組資料是樣本點,對這組樣本點去求得一個分類器,這個分類器其實就是我們的基函式f。

(3)計算步長640?

(4)更新模型640?

對重複以上的步驟一直到M,這就是GBDT梯度提升決策樹。

3 XGboost

上面GBDT用的是一階導,那麼使用二階導會咋樣呢?

3.1 二階導:

目標函式: 
640?

640?是Ft-1函式預測出來的值,640?是ft基函式,將兩個相加,就是Ft(x)函式的預測值,yi是實際的觀測值,故L()表示預測值與觀測值的損失。Ω(ft)是正則項, C是常數。

回顧一下Taylor展式: 
640?

令: 
640?

將各部分代入Taylor展式,可以得到: 
640?

上面公式中的ft我們是不是到的,它是一個基函式,也就是一個模型,比如說是一個決策樹,現在我們還不知道這個決策樹的結構與葉子節點的資訊等。

3.2 決策樹的描述

假設ft是決策樹。 
使用決策樹對樣本做分類或迴歸,是從根節點到葉子節點的細化過程,落在相同葉子節點的樣本的預測值是相同的。

假定某決策樹的葉子節點數目為T,每個葉子節點的權值為640? 
(在分類中葉子節點是不同的類別,裡面有被分在那裡的樣本,在迴歸中,葉子節點是值,我們用w權值來表示)

於是決策樹的學習過程,就是構造如何使用特徵得到劃分,從而得到這些權值的過程。

樣本x落在葉子節點q中,定義f為:640?

一個決策樹的核心即“樹結構”與“葉節點”。這兩個確定了之後,這課決策樹就確定了。

比如說以下例子: 
640?wx_fmt=png

通過樣本點的學習,構造了一個決策樹,這個樹有3個葉子節點,於是T=3; 
葉子節點分別是w1,w2,w3,3個葉子節點對應的值分別是2,0.1,-1 
如果把奶奶帶進去,就會分在第3個葉子節點。

3.3 正則項的定義

決策樹越複雜,那麼就越可能導致過擬合,所以要用一個正則項Ω(ft)去懲罰它。 
決策樹複雜度可以考慮葉節點數和葉權值,也就是說,葉節點越多,那麼懲罰的力度應該越大。

下面給出定義正則項的一個方式: 
640?wx_fmt=png

γ與λ是需要事先傳入的。

比如上面的例子的正這項就可寫成: 
640?wx_fmt=png

3.4 目標函式的計算

根據上面的解釋,於是我們就可以來計算我們之前給出的目標函數了: 
640?

C常數項,是將公式中已知的元素取出來扔進C中。

第一步:式中的L( )損失函式的值應該是已知的,因為實際觀測值y已知,t-1的預測值也是已知的。所以這是一個常數項,將它扔到C中。

第二步:f(x)的其實是f這個若預測函式對x的預測值,上文2.2.2中已經分析了預測值可以寫成w權值,所以將其替換。

第三步:注意第三個等號的那個式子開頭的640?,與前一個式子不同了,前面是i=1到n是對每一個樣本點做加權,在決策樹中,所有的樣本點都會被分到一個葉子節點上,所以只要對每個葉子節點加權就行,因為每個葉子節點上的w是相同的。所以後面的640?表示對該葉子節點上的所有點的g求和,w一致所以提出來在括號外面。

第四步:代入正則項後會發現可以提取出共同的因子,所以這個式子最後變成這樣。

但是呢這個目標函式還是看上去大腹便便,我們再來簡化瘦身下它:

定義: 
640?

代入上面的目標函式式子,得到: 
640?

對上式的w求偏導,得到: 
640?

將w回代入目標函式,得到: 
640?

恩恩,這樣美多了呢。

我們還是用上面那個小例子來解釋一下這個目標函式的計算在做啥玩意兒。

640?

總共有5個樣本點,所以分別可以求得每個樣本點對應的g,h。

然後針對每個葉子節點,求每個葉子節點的G,H

最後代入公式: 
640?

3.5 構造決策樹的結構

那麼對於當前節點,應該如何進行子樹的劃分呢?

這裡同樣使用貪心演算法的思路:

對樣本進行所有可能的劃分,然後計算每次劃分的損失降低的數量。選擇J(f)降低最小的分割點。 
也就是說,列舉素有可行的分割點,選擇增益最大的劃分,繼續同樣的操作,直到滿足某閥值得到純節點。

增益的公式如下:

640?

L和R表示一刀下去左邊和右邊形成兩個節點。

如此數也構造好了,而且也可以去計算得權值w了。

3.6 XGBoost小結

以上就是XGBoost使用的核心推到過程。

相對於傳統的GBDT, XGBoost使用了二階資訊,可以更快地在訓練集上收斂。

有序隨機森林本身具備防止過擬合的優勢,因此XGBoost仍然一定程度上具有該優勢。

XGBoost的實現中使用了並行/多核計算,因此訓練速度快。 
同事它的原生語言為C/C++,這是它速度快的實踐原因。

4 Adaboost

4.1 演算法推導

設訓練資料集: 
640?

再給定一個初始化訓練資料的權值分佈: 
640? 
初始化的時候所有的權值都設為均值即可。

使用具有權值分佈Dm的訓練資料集學習,得到基本分類器: 
640?

計算Gm(x)在訓練書記尚的分類誤差率: 
640?

利用誤差計算Gm(x)的係數: 
640?

利用係數更新權值: 
640? 
這裡zm是規範化因子,它的目的僅僅是使得Dm+1稱為一個概率分佈。 
640?

構建基本分類器的線性組合: 
640?

得到最終的分類器: 
640?

4.2 案例

來來來,一般晦澀難懂的公式都需要一杯example來調節調節氣氛。

給定下列訓練樣本,目標使用AdaBoost演算法學習一個強分類器。 
640?

初始化訓練資料的權值分佈 
640? 
所有權值都為均值,W1i=0.1

當m=2時: 
(1)在權值分佈維為D1的訓練資料上,閥值v取2.5的時候誤差最低,所有,構建一個基本的分類器為: 
640?

(2)計算這個分類器在訓練資料集上的武昌率: 
e1 = 0.3

(3)計算G1分類器的係數α 
640?

(4)更新權值分佈: 
640?

(5)構建基本分類器的線性組合 
640?

(6)分類器sign(f1(x))在訓練集上有3個誤分類點。迭代繼續。

當m=1時: 
注意此時權值已經更新了,為: 
640?

(1)在權值分佈為D2的訓練資料集中,閥值取8.5的時候誤差率最低,於是基本分類器可以定義為: 
640?

(2)計算G2的誤差率: 
640?

(3)計算G2的係數: 
640?

(4)更新權值分佈,新的權值為: 
640?

(5)構建基本分類器的線性組合: 
640?

(6)分類器sign(f1(x))在訓練集上有3個誤分類點。迭代繼續。

當m=3時: 
(1)在權值分佈為D23的訓練資料集中,閥值取5.5的時候誤差率最低,於是基本分類器可以定義為: 
640?

(2)計算G2的誤差率: 
640?

(3)計算G2的係數: 
α3 = 0.7514

(4)更新權值分佈,新的權值為: 
640?

(5)構建基本分類器的線性組合: 
640?wx_fmt=png

(6)分類器sign(f1(x))在訓練集上有0個誤分類點。完美結束

4.3 總結

Adaboost演算法可以看做是採用指數損失函式的提升方法,其每個基函式的學習演算法前向分步演算法。

Adaboost的訓練誤差是以指數率下降的。

Adaboost演算法不需要事先知道下界γ,具有自適應性,它能自適應弱分類器的訓練誤差。

參考資料: 

小象學院《機器學習》課程 
李航《統計學》