集成學習系列:
Gradient Boosted Decision Tree(梯度提升決策樹)
上一篇介紹了Random Forest,該算法利用Bagging 中的bootstrap 機制得到不同的Decision Tree , 然後將這些Decision Tree 融合起來。除了基本的Bagging 和Decision Tree 之外,Random Forest 還在decision tree 中加入了更多的隨機性。有了這些機制之後,我們發現這個算法可以利用OOB 數據做self validation , 進一步結合self validation 的機制和permutation test 的做法我們利用random forest 來做feature selection 。
提升方法(boosting) 的代表性算法是AdaBoost。提升樹是以分類或者回歸樹爲基本學習器的提升方法。由於樹的線性組合可以很好的擬合訓練數據,即使數據中的輸入和輸出之間的關係很複雜也沒關係,所以提升樹是一個高功能的學習算法。本篇討論針對不同問題的提升樹學習算法。其主要的區別在於使用的損失函數不同,首先介紹使用指數損失的分類問題,此時的提升樹算法只需要將Adaboost 算法的弱分類器設置爲加了限制的二分類樹即可,可以說提升樹算法用於分類是Adaboost 的特殊情況。接下來介紹提升樹算法損失函數爲平方損失時候的迴歸問題,之後我們會發現對迴歸問題的提升樹算法來說,只需要在每一輪使得弱學習器來簡單的擬合當前模型的殘差就好了。提升樹利用加法模型和前向分步算法實現優化過程,當損失函數爲平方損失或者是指數損失時分別爲我們上述討論的迴歸問題和分類問題。但是對於一般的損失函數而言,每一步的優化並不簡單。這樣便有了梯度提升算法。其關鍵是利用損失函數的負梯度在當前模型的值作爲迴歸問題提升樹算法中的殘差的近似值來進行迴歸樹的擬合。
1 - 提升樹模型
1.1 - 提升樹用於分類-Adaboost的特殊情況
先再回顧下random forest 的算法的形式:外層是一個bagging , 可以使用bootstrap 的方式來得到不同的gt ,內層是一個加了更多randomness 的randomized-decision tree 。
再回憶下adaboost 算法的步驟:在這個算法中,每一輪每一個樣本被賦予一個權重u(t)n ,算法通過最小化被 u(t)n 加權的 Ein 來得到gt ,再計算gt 的權重αt 來融合得到最終的G 。
我們之前將decision tree 搭配bagging 得到了random forest ,同樣地,我們可以將decision tree 搭配adaboost 得到boosting tree提升樹算法。但是現在我們需要面對的一個新的問題是,在算法boosting tree 中, 決策樹作爲弱學習器是處理不了加權的數據的, 而在adaboost 中每一輪的數據都是帶有權重的數據, 也就是adaboost 中的base algorithm 要能夠解決如下的最小化問題:
minimize Euin=1N∑n=1Nun⋅err(yn,h(xn))
因爲decision tree 有很多種實現,有很多技巧在裏面。所以我們決定將decision tree 當做是一個黑盒子,我們不再要求這個黑盒子可以處理加權的數據,而是對加權的數據本身做處理,使之變爲不加權的數據然後餵給decision tree 。
其實這一點是很容易做到, 權重是從bagging 中的bootstrap 中得到的,在做bootstrap 的時候,得到了幾份(xn,yn) , 那麼(xn,yn) 的權重就是幾:(xn,yn) 的權重是3代表抽取到了3份(xn,yn) ,權重是4代表抽取到了4份(xn,yn) ,所以權重就代表了在資料中有幾份(xn,yn) 的複製。所以我們就可以根據bootstrap 的計算機制得到的權重u(t)n 先對資料進行抽樣,這樣就得到了一筆新的大小爲N′ 資料D~t , 在這筆資料中就隱含了權重的信息。現在看來,在bagging 中我們是先bootstrap ,通過得到的樣本數量獲得權重;現在在boosting tree 中,我們利用了這個過程的逆過程,根據權重來得到樣本的數量,這樣做的目的是爲了不改變底層的decision tree 算法。
所以在boosting tree 中,我們沒有更改decision tree 的部分, 沒有更改adaptive boosting 的部分, 而是在中間的環節按照樣本的權重做了一個抽樣的過程得到新的資料 D~t 然後餵給 decision tree 。
boosting tree :
AdaBoost+sampling∝u(t)+DecisionTree(D~t)
1.2 - 提升樹的一些改進
在adaboost 中,當得到了一個gt 的時候,我們下一步需要作出的決定是這個gt 該以多大的權重加入到G 中。這個權重我們記爲αt , αt 的計算公式如下:
αt=ln⧫t=ln1−ϵtϵt−−−−−√
其中
ϵt 指的是
gt 的錯誤率。
這樣可能會出現一個問題:
如果我們用於訓練的資料完全是不同的,那麼一棵完全長成的決策樹的Ein 就是0 , 那麼Euin=0 , 那麼ϵt=0 ,所以αt=∞ 。所以在這種情況下,最終只是得到了一棵“最好”的樹,這就違背了我們的大主題:aggregation 。
問題出在哪裏呢?因爲我們把所有的數據都餵給了算法, 並且算法能得到的是一個完全長成的樹。所以如果要解決這個問題的話,有兩個方面可以着手:
- 不要把所有的數據都餵給算法;
- 對決策樹構造算法做一些限制;
通過這樣的技巧我們就可以得到一棵“弱”一點的樹。其實我們通過bootstrap 抽樣已經做到了不將所有的數據都餵給算法。另外通過採用簡單的策略,例如限制決策樹的高度也可以得到一棵比較“弱”的樹。
所以在實際的應用中,提升樹通常是如下的形式:原來的adaboost 算法的框架下,根據權重進行採樣sampling ,從而得到隱含有權重意義的數據D~t ,並且通過這樣的採樣方式也可以避免得到一棵所謂“最好”的樹,然後將D~t 餵給decision tree ,但是decision tree 的構造要加一點限制,通常是限制樹的高度,也就是利用數據D~t 構造一棵pruned decision tree 。
boosting tree :
AdaBoost+sampling∝u(t)+pruned Decision Tree(D~t)
1.3 - 提升樹實例
上面提到在boosting tree 算法中,決策樹在構造的時候需要限制樹的高度, 得到一些“弱”一點的樹, 再和adaboost 搭配起來。我們考慮一種極端的情況,如果我們限制樹的高度小於等於1,此時的決策樹變爲決策樹樁。那麼adaboost 和這樣的decision tree(height<=1) 搭配起來會是什麼樣子的呢?其實這個時候的boosting tree 就退化爲了boosting stump 。
因爲針對每一個樣本集合,這時decision tree(CART) 需要做的就只是選擇一個分支條件 b(x) 將樣本集合劃分爲兩個子樹。其劃分的依據就是要使得劃分之後的數據的不純度最低:
b(x)=argmindecision stump h(x)∑c=12|Dc with h|⋅impurity(Dc with h)
這個時候就幾乎不會出現ϵ=0 的情況, 那麼這個時候也不見得會做抽樣,而是直接在decision stump 中考慮權重。
所以簡單來說,提升樹用於分類只是將AdaBoost 算法框架中的弱分類器限制爲二類分類樹即可。
2 - 優化視角下的Adaboost
2.1 - Adaboost的指數損失函數
這一小節通過分析得到AdaBoost 算法的損失函數是實際上是指數損失L=exp(−ys) 。並且可以證明,AdaBoost 算法是前向分步算法在損失函數爲指數函數時的加法模型。
首先我們回憶一下AdaBoost 中每一個樣本的權重的計算公式,u(t+1)n 是根據u(t)n 計算得到的。如果該樣本劃分不正確,那麼u(t+1)n=u(t)n⋅⧫t ;如果該樣本劃分正確,那麼u(t+1)n=u(t)n/⧫t 。我們再來審視一下這個更新規則:樣本劃分不正確的意思就是:yn≠gt(xn) ;樣本劃分正確的意思就是:yn=gt(xn) 。那麼權重u 的更新規則就變爲:
u(t+1)n=u(t)n⋅⧫−yngt(xn)t
而αt=ln(⧫t)=ln(1−ϵtϵt−−−−√) ,所以⧫t=eαt
更新規則進一步變爲:
u(t+1)n=u(t)n⋅exp(−ynαtgt(xn))
通過這樣的表達我們看到樣本(xn,yn) 最終的權重u(T+1)n 和初始的u(1)n 的關係如下:
u(T+1)n=u(1)n⋅∏t=1Texp(−ynαtgt(xn))=1N⋅exp(−yn∑t=1Tαtgt(xn))
我們將∑Tt=1αtgt(x) 稱爲voting score。因爲最後我們需要根據這個分數加一個sign 的操作來做分類的決定,即我們最終得到的模型是:G(x)=sign(∑Tt=1αtgt(x)) 。從上面的式子可以看出AdaBoost 中的每一個數據點的權重u(T+1)n 正比於負yn 和voting score 的乘積的exponential 。
我們知道AdaBoost 是linear blending 的延伸, 也就是要將g 線性的融合在一起。在linear blending 中我們可以將整個過程分爲兩步:1. 將所有的g 當做是一個特徵轉換;2. 將特徵轉換之後的結果使用一個線性的模型融合起來。
linear blending=linear model+hypothesis as transform
G(xn)=sign(∑t=1Tαtwtgt(xn)ϕt(xn))
因爲gt(xn) 可以視爲特徵轉換,我們將其記爲ϕt(xn) ,將每一個gt(xn) 的權重記爲wt 。這時, voting score 就變成了wTΦ(xn) 。這樣我們就得到了一個我們比較熟悉的形式, 因爲在硬間隔的SVM 中:margin=yn⋅(wTϕ(xn)+b)||w|| , 表示這個數據點距離邊界有多遠。所以在這裏voting score (雖然和上面的相比少了一些項)也是某一種距離, 也是某一種margin , 也是在某一個空間中這個點到分割線的距離的一種衡量。
所以 yn⋅(voting score) 就相當於在SVM 中的沒有歸一化的margin ,也可以說是函數間隔。結合我們對SVM 的認識,我們希望 yn⋅(voting score) 越大越好,即首先這個值要是個正的,正值保證了劃分的正確性;其次要儘量的大,這樣就能有更大的置信區間或者說更大的margin 。所以我們就會希望 exp(−yn(voting score)) 越小越好。也就是每一個數據點的權重 u(T+1)n 要越小越好。
通過上面的分析我們知道AdaBoost想要達到large margin 的效果,就是要努力的使所有的yn⋅(voting score) 變大,就是要使所有的exp(−yn(voting score)) 變小。就是要最小化∑Nn=1u(T+1)n, 現在可以將adaboost 的損失函數定義爲:
L=∑n=1Nu(T+1)n=1N∑n=1Nexp(−yn∑t=1Tαtgt(xn))(1)
所以得到了AdaBoost 的損失函數爲指數損失函數。
2.2 - 又一個0/1誤差的上界
畫出0/1 error 和AdaBoost error 的曲線發現,exponential error(圖中的曲線)是0/1 error (圖中的折線)的一個上限。我們之前就碰到過0/1 error 的一些上限,SVM 的hinge error(max(1−sy,0)) ,logistic regression 的scale cross entropy(ln(1+exp(−ys)))都是0/1 error 的上限,我們之前都是利用這些上限將0/1 error 做到最小,從而將分類問題做好。
現在我們從另一個角度看到Adaboost 通過最小化∑Nn=1u(T+1)n 以使得得到的邊界有large margin 的效果,所以adaboost 算法在函數
∑n=1Nexp(−yn∑t=1Tαtgt(xn))(2)
上做最小化,我們就將(2) 定義爲adaboost error measure 。最終通過最小化erradaˆ 將err0/1 做到最好。
- err0/1(s,y)=|[ys≤0]|
- erradaˆ(s,y)=exp(−ys)
在AdaBoost 中既然我們想要所有的樣本點的權重越小越好,也就是想要最後的權重的總和越小越好,也就是要在上式(1) 中做最小化。AdaBoost 就是要做如下的一個最優化的問題:
minhEADA=1N∑n=1Nexp(−yn∑t=1Tαtgt(xn))
解決上述最優化問題利用的工具是梯度下降法,梯度下降法的思路基本上是:當想要最小化一個函數的時候,可以看看從當前的點出發往哪個方向v 走一小步會使得結果變好。 通常的方法是在該點附近使用泰勒公式進行展開,之後通過分析可以得到能使得函數變小的最好的方向就是負梯度的方向。沿着這個方向走一個小小的步長η , 這樣就離我們的目標更近了一步。
泰勒展開
min||v||=1 Ein(wt+ηv)≈Ein(wt)+ηvT▽Ein(wt)(3)
現在如果我們想要找一個函數gt 當做方向,(向量和函數在本質上是一樣的。當操作的對象是向量的時候,我們根據下標index 可以得到向量中的值;當操作的對象是函數的時候,我們根據輸入x 可以得到函數的輸出值,所以向量的index 是整數,函數的index 是實數。這樣看來,函數就是無限維度的向量)。在gradient descent 中,我們想要找一個好的向量方向,沿着這個向量方向走一個步長η 來做最優化;在這裏我們想要找一個好的函數h(x) ,沿着這個函數走一個步長η 來做最優化。
當前的adaboost 已經得到函數是∑t−1τ=1ατgτ(xn) , 所以就是要在∑t−1τ=1ατgτ(xn) 上加一個好的函數h(xn) (向量方向)和步長 η 的乘積ηh(xn) 來使得最終的結果變好一點。
minh Eadaˆ=1N∑n=1Nexp(−yn(∑τ=1t−1ατgτ(xn)+ηh(xn)))(4)
現在我們要想辦法將
(4) 變成
(3) 的形式,
minhEadaˆ=1N∑n=1Nexp(−yn(∑τ=1t−1ατgτ(xn)+ηh(xn)))=1N∑n=1Nexp((−yn)∑τ=1t−1ατgτ(xn))⋅exp(−ynηh(xn))=∑n=1Nu(t)nexp(−ynηh(xn))≈taylor∑n=1Nu(t)n(1−ynηh(xn))=∑n=1Nu(t)n−η∑n=1Nu(t)nynh(xn)
泰勒展開式:exp(x)=1+x+x22!+x33!+⋅+xNN!+⋯
通過上面的操作得到了和在gradient descient 中類似的形式,現在我們的目標是要找到一個好的 h 來最小化∑Nn=1u(t)n(−ynh(xn)) 。對於二分類問題來說:
===∑n=1Nu(t)n(−ynh(xn))∑n=1Nu(t)n{−1if yn=h(xn)1if yn≠h(xn)−∑n=1Nu(t)n+∑n=1Nu(t)n{0if yn=h(xn)2if yn≠h(xn)−∑n=1Nu(t)n+2Eu(t)in⋅N(1)(2)(3)(4)
我們的出發點是要找到一個好的h(x) 讓∑Nn=1u(t)n(−ynh(xn)) 變小,經過上面的推導發現想要讓∑Nn=1u(t)n(−ynh(xn)) 變小的就要讓Eu(t)in 變小。能夠使得Eu(t)in 變小的正是adaboost 中的base algorithm 算法 A 。所以 base algorithm 找到了一個好的函數方向。我們原來認爲A 找到的gt 只是爲了讓Eu(t)in 變小, 現在經過這樣的推導發現,這個gt 是一個能夠讓Eadaˆ 變小的函數方向。
adaboost 通過大概的最小化Eadaˆ=∑Nn=1u(t)nexp(−ynηh(xn)) 得到了一個好的函數(方向),按照gradient descent 的做法,現在要做的就是沿着這個方向走一小步。但是在這裏我們不僅僅滿足於只走一小步,而是想要走一大步。也就是說在gt 被固定了之後,想要選擇一個最大的η 來使得Eadaˆ 最小:
minηEadaˆ=∑n=1Nu(t)nexp(−ynηgt(xn))◯
那麼怎麼來得到這個最好的步長
η 呢?
- 當yn=gt(xn) 的時候,◯=u(t)nexp(−η)
- 當yn≠gt(xn) 的時候,◯=u(t)nexp(+η)
Eadaˆ=(∑n=1Nu(t)n)⋅((1−ϵ)exp(−η)+ϵt exp(+η))
對
η 求導來得到最優解:
∂Eadaˆ∂η=0⟶ηt=ln1−ϵtϵ−−−−−√=αt
所以這樣看來, adaboost 使用base algorithm A 來得到一個最好的函數方向,當最好的函數方向gt 得到之後,adaboost 給這個gt 一個權重或者說是票數αt ,現在我們知道了這個由adaboost 給出的權重αt 是一個最佳問題的解。所以adaboost 通過也可以稱爲steepest descent with approximate functional gradient 。
3 - Gradient Boosting
上一小節對adaboost 做了另一種解釋,adaboost 的每一輪可以看做是在最小化exponential error :在每一輪中首先找出一個h ,將這個h 作爲gt ;然後再決定要沿着這個gt 走多遠的距離,這個距離會變成gt 的權重αt。所以一共有兩個最佳化的過程:一個是對h 的最佳化過程, 一個是對η 的最佳化過程。
minηminh1N∑n=1Nexp(−yn(∑τ=1t−1αtgτ(xn)+ηh(xn)))(1)
這樣的概念可以不可以用在不同的error function 上呢?也就是說不再僅僅只是(1) 中的exponential error 。例如如果我們想做的是logistic regression 的話,我們關注的error 是cross entropy error ,如果我們想做的是regression 的話,我們關注的error 是squared error 。
3.1 - 前向分步算法優化加法模型
基於上述的討論,將(1) 式進行擴展,將err 換掉,不再侷限於使用exponential error ,而是可以使用任何我們感興趣的error function 。
minηminh1N∑n=1Nerr(∑τ=1t−1αtgτ(xn)+ηh(xn),yn)(1)
這是一個新的aggregation 的模型:從當前已經得到的模型∑t−1τ=1αtgτ(xn) 出發,沿着h(xn) 走步長η ,目的是爲了讓err 變小,所以同樣的在每一輪都是做兩件事:先決定一個好的方向h 作爲gt ,然後決定要沿着這個gt 更新多遠得到步長η 並作爲權重αt 將gt 融入到最中的G 中。所以這樣的模型很像是adaboost 只不過是對adaboost 做了延伸,我們稱之爲gradientBoost ,由不同的error funciton 就可以解決不同的問題例如regression 或者是soft classification 。
3.2 - 提升樹用於迴歸
當我們想要使用boosting tree 做regression 的時候應該怎麼做呢?我們關心的是squared error :err(s,y)=(s−y)2
minηminh1N∑n=1Nerr(∑τ=1t−1ατgτ(xn)sn+ηh(xn),yn)
我們將使用當前已經得到的模型∑t−1τ=1ατgτ(xn) 對樣本xn 做出的預測結果記爲sn ,我們的目的就是要從sn 出發沿着某個h(xn) 更新某個步長η 來使得err 變小。 所以第一步我們首先找一個最好的h(x) 作爲gt :
minh1N∑n=1Nerr(sn+ηh(xn),yn)≈tarlorminh1N∑n=1Nerr(sn,yn)+1N∑n=1Nηh(xn)∂err(s,yn)∂s|s=sn=minhconstants+ηN∑n=1Nh(xn)2(sn−yn)◯
我們現在是要找一個h(xn) 來使得◯ 最小, 那麼易知當h(xn)=−∞⋅(sn−yn) 的時候,上式可以取得最小。因爲首先−(sn−yn) 保證了結果是負數,再乘以一個∞ ,就是負的無窮大,這是最直觀的該最小化問題的解。 但是因爲在這裏h(xn) 相當於一個方向, 所以應該對其長度進行一下限制,這樣就可以避免出現−∞ 。並且長度的問題最後交給步長 η 來解決。
基於以上的討論我們應該解決的問題是:
min||h||=1constants+ηN∑n=1Nh(xn)2(sn−yn)
但是這樣的話變成了需要求解一個有條件||h||=1 的最佳化問題,因爲我們並不在乎h 的大小,所以我們將其作爲一個懲罰項放入目標函數中的,只是限制使得h(x) 不要太大即可,新的問題變爲:
minhconstants+ηN∑n=1N(2h(xn)(sn−yn)+h(xn)2)=constants+ηN∑n=1N(constant+(h(xn)−(yn−sn)residual)2)
yn 是目標值,sn 是目前給出的預測值, 我們將yn−sn 定義爲殘差residual。爲了達到最小化的目的,就是要找一個h , 使得對於所有的樣本來說,h(xn) 和(yn−sn) 儘可能的接近,即h(xn) 和(yn−sn) 的均方誤差要儘可能的小。
所以我們迴歸問題的提升樹只要在每一輪都擬合當前模型的殘差就好了, 即在數據{(xn,yn−sn)} 上做一個regression 就好了。
所以當我們使用gradientboost 來做regression 的時候,我們需要利用base algorithm 在residual 數據{(xn,yn−sn)} 上找一個好的gt (方向); 而在adaboost 中的base algorithm 是根據加權的數據{xn,yn} 來找到一個好的gt 。
在上一步中我們知道了怎麼找到一個好的gt 了,也就是要求解一個regression 問題來擬合xn 和yn−sn , 現在的問題是,當找到了一個好的gt 之後,我們要怎麼決定這個gt 的權重 η 呢?同樣是求解如下的一個最優化的問題:
minη1N∑n=1N(sn+ηgt(xn)−yn)2=1N∑n=1N((yn−sn)residual−ηgt(xn))2
爲了最小化我們需要求解的是一個在數據集{(gt(xn),residual)} 上的單變量η 的線性迴歸問題。所以當使用gradientboost 來做regression 的時候,在需要求解gt 的權重αt 的時候是使用gt 來做一個特徵轉換,然後求解一個簡單的linear regression 。
把以上討論的東西都合在一起就得到了一個算法我們稱之爲Gradient Boosted Decision Tree(GBDT) 。剛剛只是講解了gradient boosted ,這裏的decision tree 用做base learner 。
Gradient Boosted Decision Tree(GBDT)
for regression
s1=s2=⋯=sN=0
for t=1,2,⋯,T
1. obtain gt by A({(xn,yn−sn)}) where A is a(squared error) regression algorithm
2. compute αt=OneVarLinearRegression({(gt(xn),yn−sn)})
3. update sn⟵sn+αtgt(xn)
returnG(x)=∑αtgt(x)
因爲初始的s1=s2=⋯=sN=0 ,所以在第一輪的時候base learner , 這裏是用decision tree 做的是一個正常的regression , 從第二輪之後纔在數據{(xn,yn−sn)}上做regression 。 在得到了gt 之後我們要想辦法得到一個αt ,這時就是在{(gt(xn),yn−sn)}上做一個單變量的迴歸問題。當計算完成之後, 就需要對每一個樣本的分數進行更新,sn⟵sn+αtgt(xn) 。這樣做了T 輪之後就可以得到一堆decision tree 最後得到G 。
通過上述的推導可以引出gradient boosting 。 到現在爲止我們分析了提升樹算法的損失函數爲指數損失函數和平方誤差損失函數的情況,但是對於一般的損失函數而言,優化的過程並不是這麼簡單的。針對這一問題Feridman 提出了梯度提升(gradient boosting )。其關鍵有點類似提升樹用於迴歸的推導:利用損失函數的負梯度在當前模型的值作爲迴歸問題提升樹中的殘差的近似值,以此來擬合一個迴歸樹。
rn≈−[∂L(y,f(xi))∂f(xi)]f(x)=fm−1(x)
4 - Summary of Aggregation Models
4.1 - Blending Models
用於當手頭已經有了一些gt 的時候,將它們進行集成, 集成的方式有如下的三種:
- uniform :每一個gt 都是同樣的地位,可以通過voting 或者是averaging 來進行集成。
- non -uniform :如果每一個gt 有不同的重要性的時候,可以將這些gt 看成是特徵轉換,然後再餵給一個linear model 來學習每一個gt 的權重。
- conditional :如果要在不同的情況下使用不同的gt , 同樣將每一個gt 看成是特徵轉換, 只是在第二個階段的學習當中, 使用non linear model 而不是linear model 。這樣的模型稱爲stacking 。
通過uniform 的方式,不同的gt 會取長補短,相互修正,得到的模型比較穩定。通過non uniform 或者是conditional 的方式可以得到比較複雜的模型,但是要小心overfitting 的風險。
4.2 - Aggregation-Learning Modeling
learning 指的是我們還沒有g,我們要邊學g 邊考慮怎麼樣對它們進行集成,
- Bagging:通過bootstrap 機制來得到不同的gt , 然後通過uniform 的形式進行集成
- AdaBoost:adaboost 通過更新每一筆資料的權重的方式來得到很不一樣的gt ,在得到了gt 之後依據它們的表現來決定其在最終的G 中的權重αt 。從最佳化的角度來說,gt 是能夠使得error 降低的最好的方向,類似於梯度下降中的負梯度方向,這個權重可以理解爲要在gt 的方向上更新的最大的步長。
- Decision Tree:通過尋找不同的特徵劃分數據,最後在不同的條件下使用不同的g 。
- GradientBoost:將adaboost 延伸到gradientboost ,不同於adaboost ,在學習g 的時候不是通過更新樣本的權重,例如在regression 的時候,是對residual 進行擬合從而得到好的g 。
4.3 - Aggregation of Aggregation Models
- decision tree + bagging 可以得到random forest
- decision tree + adaboost 可以得到boostin tree
- decision tree + gradient boost 可以得到gradient boost decision tree
4.4 - Specialty of Aggregation Models
爲什麼aggregation 這樣的模型可以表現的很好呢?主要由於兩個方面的原因:首先aggregation 解決了underfitting ,因爲集成了很多的g 的表現,可以把這些g 看成是對原始特徵不同的feature transform ;另一個方面來說當集成了很多的g 之後,會得到一個比較“中庸”的結果,aggregation 達到了regularzation 的效果,
5 - 總結
這篇的主要內容是Gradient Boosted Decision Tree 。首先先講述瞭如何將adaboost 和decision tree 進行搭配來得到adaboost decision tree ,爲此引入了sampling and pruning 來得到一棵棵比較弱的decisiontree ,這樣adaboost 和decision tree 的組合才能發揮最大的效果。之後我們使用optimization 的角度來重新的看adaboost , 發現adaboost 每一次找到一個gt 就是找了一個好的方向, 這個gt 的權重αt 其實就是一個適當的步長。我們將這個模型延伸得到了gradient boosting ,引入不同種類的error ,經過推導發現當gradient boosting 用於regression 的時候其實base learner 是在做一個residual fitting 。