1.前向分佈算法
基本思想:每次只學習一個基函數及係數,逐步逼近最優解。
如下所示:
其中 爲基函數,爲基函數係數,爲基函數的參數,這樣只需要給定訓練集與損失函數
就可以利用最小化損失函數的原理進行學習,這樣每次新一輪的學習只需要學習一個基函數的參數與對應的係數。
一個栗子:小明有100個蘋果,小紅第一次猜1*50個,剩餘50個沒猜對(殘差),下一次小紅猜有1*50 + 2*10個,殘差30,如此反覆下去,小紅會逐漸向正確答案靠攏。其中第一二次中的1*50和2*10中的1,2就相當於係數,50和10可以理解爲
2.負梯度擬合與迴歸
顧名思義,就是在損失函數梯度的負方向上進行學習,至於是怎麼在負梯度方向上學習的呢?下面搬運的是臺大Hsuan-Tien Lin教授所講的梯度提升視頻裏面的內容,我覺得相對容易理解一些。
這是上文所提到的最小化所示函數的過程。這裏先看基函數的學習過程(以平方損失函數爲例):
這裏的看做一個項,根據泰勒展開可得:
這裏的爲常數,那麼要求的方向的話,只需要求上式子中負方向即可。到此,梯度方向的問題解決了,那麼要怎麼求得呢?
我們知道,的大小我們並不介意,因爲後面我們要給它一個係數也就是上式中的去調整它。所以,我們希望它小一點,但是方向是對的就可以。所以可以在優化過程中添加一個損失項,那麼上式就變成:
通過變換,可以發現我們最終只需要將設置爲一個對殘差的迴歸即可。我理解爲,這是一種正則化的方式。接下來需要調整,確定一個合適的步長。在找到合適的,上面式子可以轉化成
可以看到,這個又是一個迴歸問題,只不過這個迴歸是單變量線性迴歸。以上就是負梯度擬合的過程
在GBDT中,這裏設置一個迴歸樹對殘差進行擬合,然後對該樹的各葉子節點區域分別給定一個最優的“局部殘差”,繼而更新強學習器。
3.正則化
GBDT正則化主要有三種方法。
(1)對樣本設置採樣比例,可以減小方差,但是採樣率太小回增大bias
(2)添加learning rate
(3)對子樹進行正則化剪枝
4.二分類、多分類問題
在參考【2】中有詳細介紹,後期會繼續學習、搬運過來
5.優缺點
優點:
- 精度高
- 能處理非線性數據
- 能處理多特徵類型
- 適合低維稠密數據
缺點:
- 不好並行處理(因爲上下兩顆樹有聯繫)
- 多分類的時候 複雜度很大
6.sklearn參數
1) n_estimators: 也就是弱學習器的最大迭代次數,或者說最大的弱學習器的個數。
2) learning_rate: 即每個弱學習器的權重縮減係數νν,也稱作步長,默認是1。
3) subsample: 即我們在原理篇的正則化章節講到的子採樣,取值爲(0,1]。默認是1.0,即不使用子採樣。
4) init: 即我們的初始化的時候的弱學習器,一般用在我們對數據有先驗知識,或者之前做過一些擬合的時候,如果沒有的話就不用管這個參數了。
5) loss: 即我們GBDT算法中的損失函數。分類模型和迴歸模型的損失函數是不一樣的。
對於分類模型,有對數似然損失函數"deviance"和指數損失函數"exponential"兩者輸入選擇。默認是對數似然損失函數"deviance"。在原理篇中對這些分類損失函數有詳細的介紹。一般來說,推薦使用默認的"deviance"。它對二元分離和多元分類各自都有比較好的優化。而指數損失函數等於把我們帶到了Adaboost算法。
對於迴歸模型,有均方差"ls", 絕對損失"lad", Huber損失"huber"和分位數損失“quantile”。默認是均方差"ls"。一般來說,如果數據的噪音點不多,用默認的均方差"ls"比較好。如果是噪音點較多,則推薦用抗噪音的損失函數"huber"。而如果我們需要對訓練集進行分段預測的時候,則採用“quantile”。
6) alpha:這個參數只有GradientBoostingRegressor有,當我們使用Huber損失"huber"和分位數損失“quantile”時,需要指定分位數的值。默認是0.9,如果噪音點較多,可以適當降低這個分位數的值。
調參實例:
https://github.com/zzzzzzhang/Datawhale_learn/blob/master/GBDT_cla.py
參考
【1】臺大機器學習視頻