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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如果你还不了解GBDT,不妨看看这篇文章

發(fā)布時間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如果你还不了解GBDT,不妨看看这篇文章 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:Freemanzxp

簡介:中科大研二在讀,目前在微軟亞洲研究院實(shí)習(xí),主要研究方向是機(jī)器學(xué)習(xí)。

原文:https://blog.csdn.net/zpalyq110/article/details/79527653

Github:https://github.com/Freemanzxp/GBDT_Simple_Tutorial

本文已授權(quán),未經(jīng)原作者允許,不得二次轉(zhuǎn)載


寫在前面: 去年學(xué)習(xí) GBDT 之初,為了加強(qiáng)對算法的理解,整理了一篇筆記形式的文章,發(fā)出去之后發(fā)現(xiàn)閱讀量越來越多,漸漸也有了評論,評論中大多指出來了筆者理解或者編輯的錯誤,故重新編輯一版文章,內(nèi)容更加翔實(shí),并且在 GitHub 上實(shí)現(xiàn)了和本文一致的 GBDT 簡易版(包括回歸、二分類、多分類以及可視化),供大家交流探討。感謝各位的點(diǎn)贊和評論,希望繼續(xù)指出錯誤~Github:https://github.com/Freemanzxp/GBDT_Simple_Tutorial


簡介:

GBDT 的全稱是 Gradient Boosting Decision Tree,梯度提升樹,在傳統(tǒng)機(jī)器學(xué)習(xí)算法中,GBDT 算得上 TOP3 的算法。想要理解 GBDT 的真正意義,那就必須理解 GBDT 中的 Gradient Boosting 和 Decision Tree 分別是什么?

1. Decision Tree:CART回歸樹

首先,GBDT 使用的決策樹是 CART 回歸樹,無論是處理回歸問題還是二分類以及多分類,GBDT 使用的決策樹通通都是都是 CART 回歸樹。

為什么不用 CART 分類樹呢?因?yàn)?GBDT 每次迭代要擬合的是梯度值,是連續(xù)值所以要用回歸樹。

對于回歸樹算法來說最重要的是尋找最佳的劃分點(diǎn),那么回歸樹中的可劃分點(diǎn)包含了所有特征的所有可取的值。在分類樹中最佳劃分點(diǎn)的判別標(biāo)準(zhǔn)是熵或者基尼系數(shù),都是用純度來衡量的,但是在回歸樹中的樣本標(biāo)簽是連續(xù)數(shù)值,所以再使用熵之類的指標(biāo)不再合適,取而代之的是平方誤差,它能很好的評判擬合程度。


回歸樹生成算法:

輸入:訓(xùn)練數(shù)據(jù)集 D:

輸出:回歸樹 f(x).

在訓(xùn)練數(shù)據(jù)集所在的輸入空間中,遞歸的將每個區(qū)域劃分為兩個子區(qū)域并決定每個子區(qū)域上的輸出值,構(gòu)建二叉決策樹:

(1)選擇最優(yōu)切分變量?j?與切分點(diǎn)?s,求解

遍歷變量?j,對固定的切分變量?j?掃描切分點(diǎn)?s,選擇使得上式達(dá)到最小值的對?(j,s).

(2)用選定的對?(j,s) 劃分區(qū)域并決定相應(yīng)的輸出值:

(3)繼續(xù)對兩個子區(qū)域調(diào)用步驟(1)和(2),直至滿足停止條件。

(4)將輸入空間劃分為?M?個區(qū)域?

,生成決策樹:

2. Gradient Boosting:擬合負(fù)梯度

梯度提升樹(Grandient Boosting)是提升樹(Boosting Tree)的一種改進(jìn)算法,所以在講梯度提升樹之前先來說一下提升樹。


先來個通俗理解:

假如有個人30歲,我們首先用20歲去擬合,發(fā)現(xiàn)損失有10歲,這時我們用6歲去擬合剩下的損失,發(fā)現(xiàn)差距還有4歲,第三輪我們用3歲擬合剩下的差距,差距就只有一歲了。

如果我們的迭代輪數(shù)還沒有完,可以繼續(xù)迭代下面,每一輪迭代,擬合的歲數(shù)誤差都會減小。

最后將每次擬合的歲數(shù)加起來便是模型輸出的結(jié)果。


提升樹算法:

?(b)擬合殘差學(xué)習(xí)一個回歸樹,得到


上面?zhèn)未a中的殘差是什么?

損失函數(shù)是

我們本輪迭代的目標(biāo)是找到一個弱學(xué)習(xí)器

最小化讓本輪的損失

當(dāng)采用平方損失函數(shù)時

這里,

是當(dāng)前模型擬合數(shù)據(jù)的殘差(residual)

所以,對于提升樹來說只需要簡單地?cái)M合當(dāng)前模型的殘差。

回到我們上面講的那個通俗易懂的例子中,第一次迭代的殘差是10歲,第二 次殘差4歲……


當(dāng)損失函數(shù)是平方損失和指數(shù)損失函數(shù)時,梯度提升樹每一步優(yōu)化是很簡單的,但是對于一般損失函數(shù)而言,往往每一步優(yōu)化起來不那么容易,針對這一問題,Freidman 提出了梯度提升樹算法,這是利用最速下降的近似方法,其關(guān)鍵是利用損失函數(shù)的負(fù)梯度作為提升樹算法中的殘差的近似值。

那么負(fù)梯度長什么樣呢?

第 t 輪的第 i 個樣本的損失函數(shù)的負(fù)梯度為:

此時不同的損失函數(shù)將會得到不同的負(fù)梯度,如果選擇平方損失

負(fù)梯度為

此時我們發(fā)現(xiàn) GBDT 的負(fù)梯度就是殘差,所以說對于回歸問題,我們要擬合的就是殘差

log(loss),本文以回歸問題為例進(jìn)行講解。

3. GBDT算法原理

上面兩節(jié)分別將 Decision Tree 和 Gradient Boosting 介紹完了,下面將這兩部分組合在一起就是我們的 GBDT 了。


GBDT算法:

(2)對有:,計(jì)算負(fù)梯度,即殘差

作為下棵樹的訓(xùn)練數(shù)據(jù),得到一顆新的回歸樹

其對應(yīng)的葉子節(jié)點(diǎn)區(qū)域?yàn)?span id="ozvdkddzhkzd" class="katex">。其

中 J 為回歸樹 t 的葉子節(jié)點(diǎn)的個數(shù)。計(jì)算最佳擬合值

?(d)更新強(qiáng)學(xué)習(xí)器

(3)得到最終學(xué)習(xí)器

4. 實(shí)例詳解

本人用 python 以及 pandas 庫實(shí)現(xiàn) GBDT 的簡易版本,在下面的例子中用到的數(shù)據(jù)都在 github 可以找到,大家可以結(jié)合代碼和下面的例子進(jìn)行理解,歡迎 star~ ?

Github:https://github.com/Freemanzxp/GBDT_Simple_Tutorial


數(shù)據(jù)介紹:

如下表所示:一組數(shù)據(jù),特征為年齡、體重,身高為標(biāo)簽值。共有5條數(shù)據(jù),前四條為訓(xùn)練樣本,最后一條為要預(yù)測的樣本。

訓(xùn)練階段:


參數(shù)設(shè)置:

  • 學(xué)習(xí)率:learning_rate=0.1

  • 迭代次數(shù):n_trees=5

  • 樹的深度:max_depth=3


1.初始化弱學(xué)習(xí)器:

損失函數(shù)為平方損失,因?yàn)槠椒綋p失函數(shù)是一個凸函數(shù),直接求導(dǎo),倒數(shù)等于零,得到 c。

令導(dǎo)數(shù)等于0

所以初始化時,c取值為所有訓(xùn)練樣本標(biāo)簽值的均值。

c=(1.1+1.3+1.7+1.8)/4=1.475,此時得到初始學(xué)習(xí)器


2.對迭代輪數(shù)m=1,2,…,M:

由于我們設(shè)置了迭代次數(shù):n_trees=5,這里的 M=5。的差值

此時將殘差作為樣本的真實(shí)值來訓(xùn)練弱學(xué)習(xí)器,即下表數(shù)據(jù)

接著,尋找回歸樹的最佳劃分節(jié)點(diǎn),遍歷每個特征的每個可能取值。從年齡特征的5開始,到體重特征的 70 結(jié)束,分別計(jì)算分裂后兩組數(shù)據(jù)的平方損失(Square Error), 左節(jié)點(diǎn)平方損失, 右節(jié)點(diǎn)平方損失,找到使平方損失和 最小的那個劃分節(jié)點(diǎn),即為最佳劃分節(jié)點(diǎn)。

例如:以年齡 7 為劃分節(jié)點(diǎn),將小于 7 的樣本劃分為到左節(jié)點(diǎn),大于等于 7 的樣本劃分為右節(jié)點(diǎn)。左節(jié)點(diǎn)包括 x0,右節(jié)點(diǎn)包括樣本,所有可能劃分情況如下表所示:

以上劃分點(diǎn)是的總平方損失最小為0.025有兩個劃分點(diǎn):年齡21和體重60,所以隨機(jī)選一個作為劃分點(diǎn),這里我們選 年齡21

現(xiàn)在我們的第一棵樹長這個樣子:

我們設(shè)置的參數(shù)中樹的深度 max_depth=3,現(xiàn)在樹的深度只有 2,需要再進(jìn)行一次劃分,這次劃分要對左右兩個節(jié)點(diǎn)分別進(jìn)行劃分:


對于左節(jié)點(diǎn),只含有 0,1 兩個樣本,根據(jù)下表我們選擇 年齡7 劃分

對于右節(jié)點(diǎn),只含有 2,3 兩個樣本,根據(jù)下表我們選擇 年齡30 劃分(也可以選體重70

現(xiàn)在我們的第一棵樹長這個樣子:

此時我們的樹深度滿足了設(shè)置,還需要做一件事情,給這每個葉子節(jié)點(diǎn)分別賦一個參數(shù) γ,來擬合殘差。

這里其實(shí)和上面初始化學(xué)習(xí)器是一個道理,平方損失,求導(dǎo),令導(dǎo)數(shù)等于零,化簡之后得到每個葉子節(jié)點(diǎn)的參數(shù) γ,其實(shí)就是標(biāo)簽值的均值。這個地方的標(biāo)簽值不是原始的 y,而是本輪要擬合的標(biāo)殘差 .

根據(jù)上述劃分結(jié)果,為了方便表示,規(guī)定從左到右為第個葉子結(jié)點(diǎn)

此時的樹長這個樣子:


此時可更新強(qiáng)學(xué)習(xí)器,需要用到參數(shù)學(xué)習(xí)率:learning_rate=0.1,用 lr 表示。

為什么要用學(xué)習(xí)率呢?這是Shrinkage的思想,如果每次都全部加上(學(xué)習(xí)率為1)很容易一步學(xué)到位導(dǎo)致過擬合。


重復(fù)此步驟,直到 結(jié)束,最后生成5棵樹。

下面將展示每棵樹最終的結(jié)構(gòu),這些圖都是GitHub上的代碼生成的,感興趣的同學(xué)可以去一探究竟

https://github.com/Freemanzxp/GBDT_Simple_Tutorial

第一棵樹:


第二棵樹:

第三棵樹:

第四棵樹:

第五棵樹:

4.得到最后的強(qiáng)學(xué)習(xí)器:


5.預(yù)測樣本5:

中,樣本4的年齡為25,大于劃分節(jié)點(diǎn)21歲,又小于30歲,所以被預(yù)測為0.2250。

中,樣本4的…此處省略…所以被預(yù)測為0.2025

為什么是?0.2025

這是根據(jù)第二顆樹得到的,可以 GitHub 簡單運(yùn)行一下代碼

中,樣本4的…此處省略…所以被預(yù)測為0.1823

中,樣本4的…此處省略…所以被預(yù)測為0.1640

中,樣本4的…此處省略…所以被預(yù)測為0.1476

最終預(yù)測結(jié)果:


5. 總結(jié)

本文章從GBDT算法的原理到實(shí)例詳解進(jìn)行了詳細(xì)描述,但是目前只寫了回歸問題,GitHub 上的代碼也是實(shí)現(xiàn)了回歸、二分類、多分類以及樹的可視化,希望大家繼續(xù)批評指正,感謝各位的關(guān)注。

Github:

https://github.com/Freemanzxp/GBDT_Simple_Tutorial


參考資料

  • 李航 《統(tǒng)計(jì)學(xué)習(xí)方法》

  • Friedman J H . Greedy Function Approximation: A Gradient Boosting Machine[J]. The Annals of Statistics, 2001, 29(5):1189-1232.


  • 歡迎關(guān)注我的微信公眾號--機(jī)器學(xué)習(xí)與計(jì)算機(jī)視覺,或者掃描下方的二維碼,大家一起交流,學(xué)習(xí)和進(jìn)步!

    總結(jié)

    以上是生活随笔為你收集整理的如果你还不了解GBDT,不妨看看这篇文章的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。