這部分主要介紹GBDT以及XGBOOST
這部分能學(xué)到的東西包括:
(1)無所不在的偏差-方差平衡
(2)目標(biāo)函數(shù):loss+正則的模式應(yīng)用于回歸樹學(xué)習(xí)
(3)我們既要預(yù)測還要簡單的模型
(4)定義了我們想要學(xué)習(xí)的(目標(biāo),模型)
(5)如何進(jìn)行學(xué)習(xí)
我們?nèi)绾螌W(xué)習(xí)
1、目標(biāo)函數(shù):loss+正則
2、我們不能用SGD,因?yàn)樗麄兪菢洌皇嵌囗?xiàng)式了
3、解決辦法:疊加訓(xùn)練(boosting提升):從一個(gè)常數(shù)值開始,每次加一個(gè)新的函數(shù)。
疊加訓(xùn)練
1、我們?cè)趺礇Q定要加的函數(shù)呢?通過優(yōu)化目標(biāo)函數(shù)
2、展示在第t輪的預(yù)測
注意:在平方loss中的展開計(jì)算中,有一項(xiàng)殘差的平方被加到const項(xiàng)中了。
泰勒展開擬合損失
1、除了平方誤差的情況,目標(biāo)函數(shù)仍然很復(fù)雜
2、用泰勒展開目標(biāo)函數(shù):
(1)泰勒公式
(2)含義:我現(xiàn)在要做的事情就是用f(t)去擬合殘差:即l=(r+f(x))
3、拿MSE來進(jìn)行計(jì)算演示一下
4、和之前的slice比較
新的目標(biāo)函數(shù)
1、目標(biāo)函數(shù):把常數(shù)項(xiàng)去掉,現(xiàn)在的目標(biāo)函數(shù)就比較清晰,它是一個(gè)關(guān)于f(x)的多項(xiàng)式,不管是MSE,還是logloss,都能通過開了展開的方式展成多項(xiàng)式
2、為什么我們要費(fèi)力氣進(jìn)行推導(dǎo)呢,為什么不只增加樹的數(shù)量呢?
(1)理論收益:知道我們正在學(xué)習(xí)的是什么,以及收斂性
(2)工程收益:召回監(jiān)督學(xué)習(xí)的元素
---g和h來自于損失函數(shù),是損失函數(shù)的求導(dǎo)
---學(xué)習(xí)僅僅通過依靠目標(biāo)函數(shù),目標(biāo)函數(shù)和g和h有關(guān)
---如果要求通過MSE和邏輯loss兩種方式來實(shí)現(xiàn)提升樹,應(yīng)該如何劃分模型呢
重新定義樹
現(xiàn)在我們用葉子分?jǐn)?shù)作為一個(gè)向量來定義樹,如圖所示
定義樹的復(fù)雜度
注意:不是唯一的定義形式哦~~
現(xiàn)在的定義是和葉子節(jié)點(diǎn)的數(shù)目以及葉子節(jié)點(diǎn)分?jǐn)?shù)的L2正則相關(guān)
目標(biāo)函數(shù)計(jì)算:將復(fù)雜度加進(jìn)去,并且整理,是T個(gè)獨(dú)立二次函數(shù)的和
i:有i個(gè)樣本,每個(gè)人就是一個(gè)樣本
j:葉子節(jié)點(diǎn)j
結(jié)構(gòu)分?jǐn)?shù)
1、對(duì)于單變量二次函數(shù)情況下,使式子最小的x值,已經(jīng)將x帶入求得的最小值
2、整理目標(biāo)函數(shù)
3、按照上面的推導(dǎo),也可以計(jì)算目標(biāo)函數(shù)的最小值,以及使目標(biāo)函數(shù)最小的w值
PS:此時(shí)Obj具有通用性,可用于自定義損失函數(shù)
結(jié)構(gòu)分?jǐn)?shù)的計(jì)算舉例
單棵樹的搜索算法
1、列舉可能的樹結(jié)構(gòu)
2、運(yùn)用下面計(jì)算分?jǐn)?shù)的式子來計(jì)算結(jié)構(gòu)分?jǐn)?shù)
3.選擇obj最小的作為最佳樹結(jié)構(gòu),并且運(yùn)用最優(yōu)的權(quán)重
4.但是,樹結(jié)構(gòu)有很多很多可能
優(yōu)化過程理解:假設(shè)我們有3個(gè)葉子節(jié)點(diǎn),那么把這5個(gè)樣本分到這3個(gè)葉子節(jié)點(diǎn),有非常多的分法,我們需要一個(gè)一個(gè)的嘗試,找到obj最小的,再求出最優(yōu)的w,這樣做很麻煩,計(jì)算量很大,需要很多嘗試,還必須保證不能漏掉任何可能的結(jié)構(gòu)。所以有下面的優(yōu)化。
樹貪婪學(xué)習(xí)
實(shí)踐中,我們貪婪的增加樹的數(shù)目:
(1)從深度為0的樹開始
(2)對(duì)于這個(gè)樹的每一個(gè)葉子節(jié)點(diǎn),嘗試去增加一個(gè)分割點(diǎn),加入分隔點(diǎn)后的目標(biāo)函數(shù)可見上圖
(3)那么怎么找到最優(yōu)的分裂點(diǎn)呢
高效的找出最優(yōu)的分裂點(diǎn)
(1)首先我們選取一個(gè)特征,假如說:年齡,選取a為分裂點(diǎn)
(2)我們要做的就是左邊和右邊g和h的和,然后帶入增益公式計(jì)算
(3)首先對(duì)實(shí)例點(diǎn)排序,對(duì)于不同的特征,從左到右線性掃描,最終決定最優(yōu)的分裂點(diǎn)。
分裂點(diǎn)尋找的算法
1、對(duì)于每一個(gè)結(jié)點(diǎn),對(duì)所有的特征窮舉
(1)對(duì)于每個(gè)特征,通過特征值將實(shí)例進(jìn)行排序
(2)沿著特征,運(yùn)用線性掃描來找到最優(yōu)的分裂點(diǎn)
(3)再遍歷下一個(gè)特征,仍然用這種找分裂點(diǎn)的方法
2、深度為k的樹的時(shí)間復(fù)雜度
(1)對(duì)于一層排序,需要時(shí)間nlog(n),由于有d個(gè)特征,k層,所以為ndklog(n)
(2)進(jìn)一步優(yōu)化(例如:運(yùn)用近似或者將排序特征進(jìn)行緩存)
對(duì)于離散變量呢
上面我們主要討論的是連續(xù)變量,那么對(duì)于離散變量呢?
1、一些樹的學(xué)習(xí)算法,是將連續(xù)變量和離散變量分開處理的,其實(shí)我們也可以用上面基于連續(xù)變量推導(dǎo)出來的分?jǐn)?shù)計(jì)算方法
2、事實(shí)上,這里沒有必要去單獨(dú)的處理離散變量
(1)我們可以把離散的變量編碼成數(shù)值向量,這里用的是one-hot編碼。
(2)如果有很多很多類,這個(gè)向量是稀疏的,處理稀疏數(shù)據(jù)的算法優(yōu)先
剪枝和正則化
1.分裂的增益,可能是負(fù)的。什么時(shí)候呢?當(dāng)訓(xùn)練loss的減少比正則化力度還要小的時(shí)候。我們要找的是簡單性和可預(yù)測性之間的平衡。
2、提前停止:
(1)如果最佳分裂點(diǎn)是負(fù)的,那么提前停止分裂
(2)但是也可能是一個(gè)分裂有益于后面的分裂
3、后剪枝
將一個(gè)樹生長到它的最大深度,遞歸的剪枝,剪去葉子節(jié)點(diǎn)分裂是負(fù)增益的。
回顧
1、每個(gè)迭代過程增加一個(gè)樹
2、每個(gè)迭代都需要計(jì)算一階導(dǎo)和二階導(dǎo)
3、對(duì)增長樹f(x)進(jìn)行貪婪統(tǒng)計(jì)
4、將f(x)加到模型:
(1)通常我們會(huì)加一個(gè)衰減因子,在0.1左右
(2)這就意味著我們并不是每一步都是做充分的優(yōu)化,我們要為以后的迭代保留可能性,這有助于防止過擬合。