【机器学习】集成学习之梯度提升树GBDT
Boosting方法的核心思想是對錯分類的樣本給予更高關注度,也就是樣本權重,在提升樹中與之對應的就是殘差,在梯度提升樹中就是梯度了。
Regression Decision Tree:回歸樹
回歸樹在之前講決策樹的講過,這里重提一下。其實很簡單,不要對它抱有什么很恐懼對感覺,哈哈,可能有的時候剛看到公式或者算法步驟很長一串,還有一堆數學表達,就感到頭大。其實真的很簡單,關鍵的東西就一點點,而且也不是很晦澀難懂,稍微一想就可以理解為什么要那么做。機器學習的很多東西都是按照常理在做的,可能有的時候發明這個東西的人自己都沒有數學證明出來,但事實就是這么做效果好。很多證明也是后來才被證明出來的。
好了回歸正題,先上算法
如果直到決策樹的話,理解起來這個也很容易。就看第二步,就是把信息增益啥的換成了這種最佳分割策略,按照這個算法作出來的樹是一個二叉樹。
回歸樹總體流程類似于分類樹,區別在于,回歸樹的每一個節點都會得一個預測值,以年齡為例,該預測值等于屬于這個節點的所有人年齡的平均值。分枝時窮舉每一個feature的每個閾值找最好的分割點,但衡量最好的標準不再是最大熵,而是最小化平方誤差。也就是被預測出錯的人數越多,錯的越離譜,平方誤差就越大,通過最小化平方誤差能夠找到最可靠的分枝依據。分枝直到每個葉子節點上人的年齡都唯一或者達到預設的終止條件(如葉子個數上限),若最終葉子節點上人的年齡不唯一,則以該節點上所有人的平均年齡做為該葉子節點的預測年齡。(引用自一篇博客,詳見參考文獻3)
一般回歸樹就是CART樹。
提升樹
提升樹是以分類樹或回歸樹為基本分類器的提升方法。提升樹被認為是統計學習中性能最好的方法之一。(為什么會被認為是最好的呢,后面會講。)
從提升方法學習中就可以知道提升方法采用加法模型(基函數的線性組合)與前向分步算法,以決策樹為基函數的提升方法成為提升樹。對分類問題決策樹是二叉分類樹,對回歸問題決策樹是二叉回歸樹。
提升樹用的是殘差。
直接上算法吧。
算法實例:
提升樹用的也是加法模型和向前分步算法,不過損失函數換成來MSE,在回歸問題中。該實例中只應用了回歸樹的樹樁來做基回歸模型,實際使用中會稍微再復雜一點,但還是與adaboost同樣的道理,基模型不可以太過復雜,否則容易過擬合。boosting方法是降低偏差的。
梯度提升樹GBDT回歸
先上算法
如果對比一下就會發現,梯度提升樹的步驟流程與提升樹幾乎一模一樣。兩處變動,第一處是它不再是求殘差而是負梯度。第二處是求葉子節點回歸值的時候是最小化損失函數不是直接用平均值。
再仔細思考一下,如果說我們這里的損失函數是最小均方誤差MSE,其實梯度提升樹就和提升樹一模一樣了。MSE的負梯度就是殘差,葉子節點處最小化損失函數就是取葉子節點的平均值。
梯度提升樹就可以將損失函數換成其它的,比如指數損失函數,交叉熵損失函數等等。
這里提到的線性搜索就簡單理解成遍歷吧,其實線性搜索也有一堆方法。下次有時間再專門寫一個章節。
好了,到這里提升樹和GBDT的回歸算法應該可以搞清楚了。接下來就講講GBDT的分類算法
GBDT二分類
參考https://blog.csdn.net/qq_22238533/article/details/79192579
將介紹在分類任務下的GBDT,大家將可以看到,對于回歸和分類,其實GBDT過程簡直就是一模一樣的。如果說最大的不同的話,那就是在于由于loss function不同而引起的初始化不同、葉子節點取值不同。
熟悉了吧,這個就是交叉熵損失,激活函數用的還是sigmoid函數,像極了LR回歸的用法,所以這個也只能用在二分類上。
梯度算出來和LR回歸的梯度也一樣,不過LR是對求的梯度,這邊是對F(x)求的,所以少一個x。
這一步想表達的是以為訓練數據,擬合一顆分類樹,最終得到葉子節點的區域。
其實這個時候的分類樹和回歸樹已經一樣了,區域的劃分什么的都一樣了,這個時候的分類樹劃分也可以用MSE了,y也是個數值變量。只是分類樹的節點值計算或者損失函數不一樣,以及在最后得到輸出的時候會再輸入到一個例如sigmoid的激活函數中去得到所屬分類的概率輸出。
關于GBDT二分類強烈建議看一下那篇csdn,里面有一個例子可以幫助理解。
GBDT多分類
https://blog.csdn.net/qq_22238533/article/details/79199605
先上算法
這里需要注意的是:?
看著上面亂七八糟的公式,心里亂糟糟的,可是一看到One VS Rest就完事了,豁然開朗,把思路返回到LR回歸。第二個for循環里面做了一件什么事情呢,就是訓練了K個決策樹,每個決策樹用來判斷屬于這一個類的概率,One Vs Rest總共需要訓練K顆樹,然后第一個循環就是GB算法。
關于第二點也是顯而易見的,第二個for循環完整結束算是成功訓練了一個One VS Rest模型,而GB模型是順序串行的,肯定不能夠亂了順序咯。
看p函數其實也好理解,就是一個softmax函數。
多分類一般要先做one-hot編碼
好了,還是推薦看一下博客,博客里有個例子
GBDT正則化
和Adaboost一樣,我們也需要對GBDT進行正則化,防止過擬合。GBDT的正則化主要有三種方式。?
?
優缺點:
這一部分理解還不太明白,路過大神幫忙解答,這里說的變量之間相互作用具體指什么?我的初步理解是控制了葉結點的數目其實也就控制了樹的深度(層數),每一個分層結點都是選擇了一個最優特征來劃分,這樣如果有多層結點,子結點與父結點的劃分特征之間必然會有相互作用。?
Shrinkage(縮減)的思想認為,每次走一小步逐漸逼近結果的效果,要比每次邁一大步很快逼近結果的方式更容易避免過擬合。即它不完全信任每一個棵殘差樹,它認為每棵樹只學到了真理的一小部分,累加的時候只累加一小部分,通過多學幾棵樹彌補不足。用方程來看更清晰,即沒用Shrinkage時:(yi表示第i棵樹上y的預測值, y(1~i)表示前i棵樹y的綜合預測值)?
y(i+1) = 殘差(y1~yi), 其中: 殘差(y1~yi) = y真實值 - y(1 ~ i)?
y(1 ~ i) = SUM(y1, …, yi)?
Shrinkage不改變第一個方程,只把第二個方程改為:?
y(1 ~ i) = y(1 ~ i-1) + step * yi
即Shrinkage仍然以殘差作為學習目標,但對于殘差學習出來的結果,只累加一小部分(step*殘差)逐步逼近目標,step一般都比較小,如0.01~0.001(注意該step非gradient的step),導致各個樹的殘差是漸變的而不是陡變的。直覺上這也很好理解,不像直接用殘差一步修復誤差,而是只修復一點點,其實就是把大步切成了很多小步。本質上,Shrinkage為每棵樹設置了一個weight,累加時要乘以這個weight,但和Gradient并沒有關系。這個weight就是step。就像Adaboost一樣,Shrinkage能減少過擬合發生也是經驗證明的,目前還沒有看到從理論的證明。
?
在Adaboost中每個弱分類器之間其實聯系不是很大,上一個弱分類器只是改變了下一個弱分類器所要訓練的樣本的權重。而在提升樹中,下一個F(x)是直接由之前的所有的模型加權累加所得再去擬合新的梯度(殘差)。
所以說仔細思考一下不難發現,GBDT到底是通過怎樣的一種核心思想來使得模型的精度可以那么的強大。GBDT通過不斷的去擬合殘差(負梯度),使得模型可以一步一步的逼近最優解,從boosting的角度來看,對一個誤差大的樣本,那下一次擬合中,這個樣本的負梯度就會很大(絕對值),所以模型在擬合的時候會對這個樣本尤其關注,因為這個樣本對模型的損失高低的影響權重相對梯度小的樣本是很大的。再換一個角度思考,GBDT在adaboost上的改進考量其實就是讓模型的優化有了一個更加明確的方向,adaboost是統一的將所有正確的樣本的權重縮放,將錯誤的樣本權重縮放,不難發現,所有的錯誤樣本權重縮放之后權重和是0.5,每一步迭代都會是0.5。但它缺失了一種針對性。而GBDT通過求梯度,使得模型的優化方向為損失函數下降最快的方向,有了一定的針對性。
?
接下來會專門有一篇總結一下ensemble集成學習方法的優缺點等。
參考
https://blog.csdn.net/qq_22238533/article/details/79192579
https://www.jianshu.com/p/005a4e6ac775
https://blog.csdn.net/sb19931201/article/details/52506157
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【机器学习】集成学习之梯度提升树GBDT的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】集成学习之boosting
- 下一篇: 【机器学习】XGBoost学习笔记