日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【机器学习】集成学习之梯度提升树GBDT

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】集成学习之梯度提升树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

先上算法

這里需要注意的是:?

  • 對于多分類任務,GDBT的做法是采用一對多的策略(詳情見文章)。?也就是說,對每兩個類別訓練一個分類器。假設有K個類別,那么訓練完之后總共有K顆GDBT樹(每棵GDBT樹中又會有很多弱樹)。?
  • 兩層循環的順序不能改變。也就是說,K個類別都擬合完第一顆樹之后才開始擬合第二顆樹,不允許先把某一個類別的M顆樹學習完,再學習另外一個類別。
  • 看著上面亂七八糟的公式,心里亂糟糟的,可是一看到One VS Rest就完事了,豁然開朗,把思路返回到LR回歸。第二個for循環里面做了一件什么事情呢,就是訓練了K個決策樹,每個決策樹用來判斷屬于這一個類的概率,One Vs Rest總共需要訓練K顆樹,然后第一個循環就是GB算法。

    關于第二點也是顯而易見的,第二個for循環完整結束算是成功訓練了一個One VS Rest模型,而GB模型是順序串行的,肯定不能夠亂了順序咯。

    看p函數其實也好理解,就是一個softmax函數。

    多分類一般要先做one-hot編碼

    好了,還是推薦看一下博客,博客里有個例子

    GBDT正則化

    和Adaboost一樣,我們也需要對GBDT進行正則化,防止過擬合。GBDT的正則化主要有三種方式。?
      ?

  • 第一種是和Adaboost類似的正則化項,即步長(learning rate)。對于同樣的訓練集學習效果,較小的νν意味著我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定算法的擬合效果。?
  • 第二種正則化的方式是通過子采樣比例(subsample)。取值為(0,1]。注意這里的子采樣和隨機森林不一樣,隨機森林使用的是放回抽樣,而這里是不放回抽樣。如果取值為1,則全部樣本都使用,等于沒有使用子采樣。如果取值小于1,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小于1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低。推薦在[0.5, 0.8]之間。?使用了子采樣的GBDT有時也稱作隨機梯度提升樹(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采樣,程序可以通過采樣分發到不同的任務去做boosting的迭代過程,最后形成新樹,從而減少弱學習器難以并行學習的弱點。這里其實引入了bagging的思想,所以GBDT能夠有效地抵御訓練數據中的噪音,具有更好的健壯性。(降低方差)
  • 第三種是對于弱學習器即CART回歸樹進行正則化剪枝。在決策樹原理篇里我們已經講過,這里就不重復了。
  • 優缺點:

  • Gradient Boosting:每一次的計算是為了減少上一次的殘差(residual),而為了消除殘差,我們可以在殘差減少的梯度(Gradient)方向上建立一個新的模型。所以說,在Gradient Boost中,每個新的模型的建立是為了使得之前模型的殘差往梯度方向減少(當然也可以變向理解成每個新建的模型都給予上一模型的誤差給了更多的關注),與傳統Boost對正確、錯誤的樣本進行直接加權還是有區別的。
  • Size of trees(J):模型葉結點的數量J需要根據現有數據調整,它控制著模型變量之間的相互作用,例如上一章案例中采用的僅僅兩個葉結點(樹樁),那么變量之間就沒有什么相互作用了。一般情況下都選擇J的大小在4到8之間,J=2一般不能滿足需要,J>10的情況也不太可能需要。—字面翻譯過來的?
    這一部分理解還不太明白,路過大神幫忙解答,這里說的變量之間相互作用具體指什么?我的初步理解是控制了葉結點的數目其實也就控制了樹的深度(層數),每一個分層結點都是選擇了一個最優特征來劃分,這樣如果有多層結點,子結點與父結點的劃分特征之間必然會有相互作用。?
  • Shrinkage(縮減):在《統計》一書中并未提及,在wiki中介紹是正則化部分,防止過擬合。就是一個步長
  • 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能減少過擬合發生也是經驗證明的,目前還沒有看到從理論的證明。

  • GBDT幾乎可用于所有回歸問題(線性/非線性),相對logistic regression僅能用于線性回歸,GBDT的適用面非常廣。亦可用于二分類問題(設定閾值,大于閾值為正例,反之為負例)。多分類也可以。
  • 并行化實現:由于GBDT是迭代的學習方法,且下一模型的學習是在前一模型的基礎上,因而只能在訓練樣本的層面上進行并行化處理。關于并行化相關內容等結合Xgboost學習再詳細了解。
  • GBDT 是一個加性回歸模型,通過 boosting 迭代的構造一組弱學習器,相對LR的優勢如不需要做特征的歸一化,自動進行特征選擇,模型可解釋性較好,可以適應多種損失函數如 SquareLoss,LogLoss 等等。但作為非線性模型,其相對線性模型的缺點也是顯然的:boosting 是個串行的過程,不能并行化,計算復雜度較高,同時其不太適合高維稀疏特征,通常采用稠密的數值特征如點擊率預估中的 COEC?!詘gboost導讀與實戰
  • ?

    在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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。