針對Boosting的基本介紹在我的這篇文章中詳細介紹了https://blog.csdn.net/blank_tj/article/details/82229322
簡單總結Boosting:初始對每個樣本分配相同的權重,每次經過分類,把對的結果的權重降低,錯的結果權重增高,如此往復,直到閾值或者循環次數。
梯度提升算法首先給定一個目標損失函數,它的定義域是所有可行的弱函數集合(基函數);提升算法通過迭代的選擇一個負梯度方向上的基函數來逐漸逼近局部極小值。這種在函數域的梯度提升觀點對機器學習的很多領域有深刻影響。
提升的理論意義:如果一個問題存在弱分類器,則可以通過提升的辦法得到強分類器。
簡單理解GBDT:假如有個人30歲,我們首先用20歲去擬合,發現損失有10歲,這時我們用6歲去擬合剩下的損失,發現差距還有4歲,第三輪我們用3歲擬合剩下的差距,差距就只有一歲了。如果我們的迭代輪數還沒有完,可以繼續迭代下面,每一輪迭代,擬合的歲數誤差都會減小。
Boosting算法推導:
給定輸入向量X和輸出變量Y組成的若干訓練樣本,(x1,y1),(x2,y2),...,(xn,yn) ,目標是找到近似函數F^(x⃗ ) ,使得損失函數L(y,F(x⃗ )) 的損失值最小。
L(y,F(x⃗ )) 的典型定義爲:
L(y,F(x⃗ ))=12(y−F(x⃗ ))2
L(y,F(x⃗ ))=|y−F(x⃗ )|
假定最優函數爲F∗(x⃗ ) ,即:
F∗(x⃗ )=argminE(x,y)[L(y,F(x⃗ ))]
假定F(x⃗ ) 是一組基函數fi(x⃗ ) 的加權和:
F(x⃗ )=∑Mi=1γifi(x⃗ )+C
梯度提升方法尋找最優解F(x⃗ ) ,使得損失函數在訓練集上的期望最小。
首先,給定常函數F0(x⃗ ) :
F0(x⃗ )=argmin∑ni=1L(yi,c)
以貪心思路擴展到Fm(x⃗ )
Fm(x⃗ )=Fm−1(x⃗ )+argmin∑ni=1L(yi,Fm−1(x⃗ i)+f(x⃗ i)
貪心法每次選擇最優基函數f 時仍然困難,使用梯度下降的方法近似計算。將樣本帶入基函數f 得到f(x⃗ 1),f(x⃗ 2),...,f(x⃗ n) ,從而L 退化爲向量L(y1,f(x⃗ 1)),L(y2,f(x⃗ 2)),...,L(yn,f(x⃗ n))
Fm(x⃗ )=Fm−1(x⃗ )+γm∑ni=1ΔfL(yi,Fm−1(x⃗ i))
上式中的權值γ 爲梯度下降的步長,使用線性搜索求最優步長:
γm=argmin∑ni=1L(yi,Fm−1(x⃗ i)−γ∗ΔfL(yi,Fm−1(x⃗ i)))
步驟如下:
(1)初始給定模型爲常數F0(x⃗ ) ,對於m=1 到M :
(2)計算僞殘差:
γim=[∂L(yi,F(x⃗ i))∂F(x⃗ i)]F(x⃗ )=Fm−1 (x⃗ ) ,i=1,2,...,n
(3)使用數據(x⃗ i,γim)ni=1 計算擬合殘差的基函數fm(x)
(4)計算步長
γm=argmin∑ni=1L(yi,Fm−1(x⃗ i)−γ∗fm(x⃗ i))
(5)更新模型
Fm(x⃗ )=Fm−1(x⃗ )−γmfm(x⃗ i)
GBDT算法推導
用公式來表達:在GBDT 的迭代中,假設我們前一輪迭代得到的強學習器是ft−1(x) , 損失函數是L(y,ft−1(x)) , 我們本輪迭代的目標是找到一個CART 迴歸樹模型的弱學習器ht(x) ,讓本輪的損失L(y,ft(x)=L(y,ft−1(x)+ht(x)) 最小。也就是說,本輪迭代找到決策樹,要讓樣本的損失儘量變得更小。
GBDT選取了平方損失,並用損失函數的負梯度來擬合本輪損失的近似值。第t輪的第i個樣本的損失函數的負梯度爲:
rti=−[∂L(yi,f(xi))∂f(xi)]f(x)=ft−1(x)
經過負梯度擬合得到了y−fxi ,這就是我們最終要去擬合的,也叫作殘差。
算法圖:
GBDT算法流程:
1)初始化弱學習器:
f0(x)=argminγ∑Ni=1L(yi,γ)
2)對迭代輪數m=1,2,…M有:
對每個樣本i=1,2,...,N ,計算負梯度,即殘差:
rim=−[∂L(yi,f(xi))∂f(xi)]f(x)=fm−1 (x)
將上步得到的殘差作爲樣本新的真實值,並將數據(xi,rim)(i=1,2,...,N) 作爲下棵樹的訓練數據,得到一顆新的迴歸樹fm(x) 其對應的葉子結點區域爲Rjm,j=1,2,...,J 。其中J 爲迴歸樹t的葉子節點的個數。
對葉子區域j=1,2,..,J 計算最佳擬合值:
γjm=argmin∑xi∈RjmL(yi,fm−1(xi)+γ)
更新強學習器:
fm(x)=fm−1(x)+∑Jj=1γjmI(x∈Rjm)
3)得到強學習器
f(x)=fM(x)=f0(x)+∑Mm=1∑Jj=1γjmI(x∈Rjm)
GBDT 算法的實例講解
如下表所示:一組數據,特徵爲年齡、體重,身高爲標籤值。共有5條數據,前四條爲訓練樣本,最後一條爲要預測的樣本。
1:初始化弱學習器:
f0(x)=argminγ∑Ni=1L(yi,γ)
由於此時只有根節點,樣本1,2,3,4都在根節點,此時要找到使得平方損失函數最小的參數Υ,怎麼求呢?平方損失顯然是一個凸函數,直接求導,倒數等於零,得到Υ。
∂L(yi,γ)∂γ=∂(12|y−γ|2)∂γ=γ−y
令γ−y=0 ,得γ=y 。
所以初始化時,γ 爲所有訓練樣本標籤值的均值。γ=(1.1+1.3+1.7+1.8)/4=1.475 ,此時得到的初始學習器f0(x)
f0(x)=γ=1.475
2:對迭代輪數m=1:
計算負梯度——殘差
ri1=−[∂L(yi,f(xi))∂f(xi)]f(x)=f0 (x)
說白了,就是殘差,在此例中,殘差在下表列出:
此時將殘差作爲樣本的真實值訓練f1(x) ,即下表數據
接着,尋找回歸樹的最佳劃分節點,遍歷每個特徵的每個可能取值。從年齡特徵的5開始,到體重特徵的70結束,分別計算方差,找到使方差最小的那個劃分節點即爲最佳劃分節點。
例如:以年齡7爲劃分節點,將小於7的樣本劃分爲一類,大於等於7的樣本劃分爲另一類。樣本1爲一組,樣本2,3,4爲一組,兩組的方差分別爲0,0.047,兩組方差之和爲0.047。所有可能劃分情況如下表所示:
以上劃分點是的總方差最小爲0.0125有兩個劃分點:年齡21和體重60,所以隨機選一個作爲劃分點,這裏我們選年齡21。
此時還需要做一件事情,給這兩個葉子節點分別賦一個參數,來擬合殘差。
γj1=argmin∑xi∈Rj1L(yi,f0(xi)+γ)
這裏其實和上面初始化學習器是一個道理,平方損失,求導,令導數等於零,化簡之後得到每個葉子節點的參數Υ,其實就是標籤值的均值。
根據上述劃分節點:
樣本1,2爲左葉子節點,(x1,x2∈R11) ,所以γ11=(−0.375−0.175)/2=−0.275。
樣本3,4爲左葉子節點,(x3,x4∈R11) ,所以γ21=(0.225+0.325)/2=0.275。
此時可更新強學習器
f1(x)=f0(x)+∑2j=1γj1I(x∈Rj1)
3:對迭代輪數m=2,3,4,5,…,M:
循環迭代M次,M是人爲控制的參數,迭代結束生成M棵樹
4:得到最後的強學習器:
爲了方別展示和理解,我們假設M=1,根據上述結果得到強學習器:
f(x)=fM(x)=f0(x)+∑Mm=1∑Jj=1γjmI(x∈Rjm)=f0(x)+∑2j=1γj1I(x∈Rj1)
如圖所示得到只迭代一次,只有一顆樹的GBDT:
5:預測樣本5:
樣本5在根節點中(即初始學習器)被預測爲1.475,樣本5的年齡爲25,大於劃分節點21歲,所以被分到了右邊的葉子節點,同時被預測爲0.275。此時便得到樣本5的最總預測值爲1.75。
參考了一篇非常不錯的博客:https://blog.csdn.net/zpalyq110/article/details/79527653