三、决策树
- 一、從LR到決策樹
- 二、分類樹
- 2.1 決策樹的關鍵因素
- 2.2 如何選擇最優的劃分屬性
- 三、回歸樹
- 3.1 回歸樹生成方法
- 3.2 回歸樹剪枝
- 四、集成學習
- 4.1 Bagging
- 4.1.1 Bagging之隨機森林
- 4.2 Boosting
- 4.2.1 Adaboost
- 4.2.2 Gradient Boosting
- 4.2.3 GBDT原理深入解析
- 4.2.4 GBDT和Adaboost的區別
- 4.2.5 XGBoost
- 4.2.6 XGBoost的整體回顧
- 4.2.7 XGBoost和GBDT的區別
- 4.3 stacking(堆疊)
- 4.1 Bagging
一、從LR到決策樹
LR模型是利用線性回歸的預測值,通過sigmoid映射為概率,來對數據做預測,有非常友好的數據預處理特性,工業界應用很豐富。
決策樹的處理方式:
二、分類樹
決策樹學習的算法通常是一個遞歸地選擇最優特征,并根據該特征對訓練數據進行分割,使得各個子數據集有一個最好的分類的過程。這一過程對應著對特征空間的劃分,也對應著決策樹的構建。
1) 開始:構建根節點,將所有訓練數據都放在根節點,選擇一個最優特征,按著這一特征將訓練數據集分割成子集,使得各個子集有一個在當前條件下最好的分類。
2) 如果這些子集已經能夠被基本正確分類,那么構建葉節點,并將這些子集分到所對應的葉節點去。
3)如果還有子集不能夠被正確的分類,那么就對這些子集選擇新的最優特征,繼續對其進行分割,構建相應的節點,如果遞歸進行,直至所有訓練數據子集被基本正確的分類,或者沒有合適的特征為止。
4)每個子集都被分到葉節點上,即都有了明確的類,這樣就生成了一顆決策樹。
2.1 決策樹的關鍵因素
決策樹的構造方式:基于樹的結構進行決策
內部節點:對應對屬性的測試
分支:對應屬性可能的結果
葉節點:對應一個預測結果
決策樹的學習過程(訓練):通過對訓練樣本的分析,來確定劃分的屬性
決策樹的預測過程:將示例從根節點開始,沿著劃分屬性進行劃分,直到葉節點
決策樹通常有三個步驟:特征選擇、決策樹的生成、決策樹的修剪。
決策樹學習的目標:根據給定的訓練數據集構建一個決策樹模型,使它能夠對實例進行正確的分類。
決策樹學習的本質:從訓練集中歸納出一組分類規則,或者說是由訓練數據集估計條件概率模型。
決策樹學習的損失函數:正則化的極大似然函數
決策樹學習的測試:最小化損失函數
決策樹學習的目標:在損失函數的意義下,選擇最優決策樹的問題。
決策樹原理和問答猜測結果游戲相似,根據一系列數據,然后給出游戲的答案。
1、總體流程
- 自根至葉的遞歸過程
- 在每個中間節點尋找一個劃分屬性
2、停止條件
當前結點包含的樣本全部屬于同一類,無需劃分
當前屬性集合為空,或是所有樣本在所有屬性上取值相同(所有條件都一樣,但還是無法判斷類別)
當前結點包含的樣本集合為空,無法劃分(沒有對應的樣本了)
決策樹算法的核心:從屬性集中選擇最優的劃分屬性
2.2 如何選擇最優的劃分屬性
1、熵
熵是度量樣本不純度的指標,樣本不純度越大,熵越大,越無序。
熵是度量信息的期望值
信息:
l(xi)=?log2p(xi)l(xi)=?log2p(xi)熵:
H=?∑i=1np(xi)log2p(xi)H=?∑i=1np(xi)log2p(xi)熵的公式:
Ent(D)=?∑k=1|y|pklog2pkEnt(D)=?∑k=1|y|pklog2pk熵越小,樣本的純度越高,所以決策樹的生長過程也是不斷的將數據的不純度降低的過程,希望最后得到的分類結果純的很高,也就是準確性很高。
2、信息增益:ID3
機器學習的過程是希望將樣本的不純度往下降的過程,那么最優屬性的劃分可以參考那個屬性對當前樣本的熵降低的最多。
信息增益計算示例:
紋理的信息增益最大,將其選為當前劃分屬性。
3、信息增益率:C4.5
信息增益存在的問題:假如我們用“學號”作為特征,也就是每個人一個學號,將45個人分到45個桶里,此時的純度最高,但是對新來的特征沒有任何意義,即分叉越多,越肯定,純度越高,所帶來的增益很大,所以我們選用相對值來衡量信息的增益,也就是信息增益率。
邏輯回歸是一個平滑的過程,決策樹是跳變的過程,每次只有兩個結果。
4、基尼指數:CART樹(二叉樹)
假如現在有一個袋中有黑、白兩種球:
① 摸出一個球顏色為C1,放回之后再摸出一個球C2,如果C1=C2C1=C2,則說明兩種顏色個數差比較大,即樣本的純度較高,熵越小。
② 如果C1≠C2C1≠C2,則說明兩種球顏色數量比較接近,袋子中樣本的熵比較大。
總結:C1=C2C1=C2概率越大,說明熵越小,不純度越小,所以我們希望樹朝著C1=C2C1=C2概率增大的方向發展。
基尼指數的意義:1-(兩次摸出球顏色相同的概率)=兩次摸出顏色不同的概率
顏色不同,表示熵越小,則gini指數表示了往熵減小的方向發展。
5、基尼指數和熵的關系
熵=基尼指數
6、對比
這三個是非常著名的決策樹算法。簡單粗暴來說,ID3 使用信息增益作為選擇特征的準則;C4.5 使用信息增益比作為選擇特征的準則;CART 使用 Gini 指數作為選擇特征的準則。
一、ID3
熵表示的是數據中包含的信息量大小。熵越小,數據的純度越高,也就是說數據越趨于一致,這是我們希望的劃分之后每個子節點的樣子。
信息增益 = 劃分前熵 - 劃分后熵。信息增益越大,則意味著使用屬性 a 來進行劃分所獲得的 “純度提升” 越大 **。也就是說,用屬性 a 來劃分訓練集,得到的結果中純度比較高。
ID3 僅僅適用于二分類問題。ID3 僅僅能夠處理離散屬性。
二、C4.5
C4.5 克服了 ID3 僅僅能夠處理離散屬性的問題,以及信息增益偏向選擇取值較多特征的問題,使用信息增益比來選擇特征。信息增益比 = 信息增益 / 劃分前熵 選擇信息增益比最大的作為最優特征。
C4.5 處理連續特征是先將特征取值排序,以連續兩個值中間值作為劃分標準。嘗試每一種劃分,并計算修正后的信息增益,選擇信息增益最大的分裂點作為該屬性的分裂點。但是,對連續屬性值需要掃描排序,會使C4.5性能下降。
ID3和C4.5都是分類樹,CART(Classification and regression tree)可以是分類/回歸樹。
如何處理連續值:
因為連續屬性的可取值數目不再有限,因此不能像前面處理離散屬性枚舉離散屬性取值來對結點進行劃分。因此需要連續屬性離散化,常用的離散化策略是二分法,這個技術也是C4.5中采用的策略。
對于數據集中的屬性“密度”,決策樹開始學習時,根節點包含的17個訓練樣本在該屬性上取值均不同。我們先把“密度”這些值從小到大排序:
取t為不同值時,得到增益值:
總結:將連續值由小到大排序,取一個值作為劃分點進行二分,計算增益值。
三、CART
CART 與 ID3,C4.5 不同之處在于 CART 生成的樹必須是二叉樹。也就是說,無論是回歸還是分類問題,無論特征是離散的還是連續的,無論屬性取值有多個還是兩個,內部節點只能根據屬性值進行二分。
CART 的全稱是分類與回歸樹。從這個名字中就應該知道,CART 既可以用于分類問題,也可以用于回歸問題。
回歸樹中,使用平方誤差最小化準則來選擇特征并進行劃分。每一個葉子節點給出的預測值,是劃分到該葉子節點的所有樣本目標值的均值,這樣只是在給定劃分的情況下最小化了平方誤差。
要確定最優化分,還需要遍歷所有屬性,以及其所有的取值來分別嘗試劃分并計算在此種劃分情況下的最小平方誤差,選取最小的作為此次劃分的依據。由于回歸樹生成使用平方誤差最小化準則,所以又叫做最小二乘回歸樹。
分類樹種,使用 Gini 指數最小化準則來選擇特征并進行劃分;
Gini 指數表示集合的不確定性,或者是不純度。基尼指數越大,集合不確定性越高,不純度也越大。這一點和熵類似。另一種理解基尼指數的思路是,基尼指數是為了最小化誤分類的概率。
信息增益 vs 信息增益比
之所以引入了信息增益比,是由于信息增益的一個缺點。那就是:信息增益總是偏向于選擇取值較多的屬性。信息增益比在此基礎上增加了一個罰項,解決了這個問題。
Gini 指數 vs 熵
既然這兩個都可以表示數據的不確定性,不純度。那么這兩個有什么區別那?
?Gini 指數的計算不需要對數運算,更加高效;
?Gini 指數更偏向于連續屬性,熵更偏向于離散屬性。
三、回歸樹
分類樹:
分類樹,我們知道ID3和C4.5在每次分支的時候,是窮舉每個特征屬性的一個閾值,得到使得按照feature<閾值和feature>閾值分成的兩個分支的熵最大的feature和閾值,按照該標準分支得到兩個新結點,用同樣的方法繼續分支,直到所有的樣本都被分入唯一的葉子節點,或者達到預設的終止條件。若葉子節點中性別不唯一,則以多數人的性別作為該葉子節點的性別。
回歸樹:
回歸樹整體流程類似,不過在每個結點(不一定是葉子結點)都會得到一個預測值,該預測值等于屬于該節點的所有人年齡的平均值,分支時窮舉每一個feature的每個閾值作為最好的分割點,但衡量最好的標準不再是最大熵,而是最小化均方誤差(真實年齡-預測年齡)^2的和/N,被預測出錯的人數越多,錯的越離譜,均方差就越大,通過最小化均方差能夠找到最靠譜的分枝依據。分枝直到每個葉子節點上人的年齡都唯一(這太難了)或者達到預設的終止條件(如葉子個數上限),若最終葉子節點上人的年齡不唯一,則以該節點上所有人的平均年齡做為該葉子節點的預測年齡。
3.1 回歸樹生成方法
LR:產生一條決策邊界來進行分類
決策樹:將空間分成一堆小的矩形
用刀垂直于坐標軸砍,每次只能從新產生的空間砍,不能走回頭路。
3.2 回歸樹剪枝
四、集成學習
集成方法(ensemble method)通過組合多個基分類器(base classifier)來完成學習任務,基分類器一般采用的是弱可學習(weakly learnable)分類器,通過集成方法,組合成一個強可學習(strongly learnable)分類器。所謂弱可學習,是指學習的正確率僅略優于隨機猜測的多項式學習算法;強可學習指正確率較高的多項式學習算法。集成學習的泛化能力一般比單一的基分類器要好,這是因為大部分基分類器都分類錯誤的概率遠低于單一基分類器的。
集成方法主要包括Bagging和Boosting兩種方法,Bagging和Boosting都是將已有的分類或回歸算法通過一定方式組合起來,形成一個性能更加強大的分類器,更準確的說這是一種分類算法的組裝方法,即將弱分類器組裝成強分類器的方法。
4.1 Bagging
Bagging思想:每次從m個樣本中抽取n個樣本作為訓練集,學習出T個弱學習器,之后得到一個集成的學習器,通過投票/ 平均的方法得到預測結果。
T個學習器之間沒有聯系
4.1.1 Bagging之隨機森林
隨機森林樣例
基學習器:CART決策樹
構成方法:由多個決策樹構成森林
生成方法:
隨機性體現在兩點:
隨機森林的特性:
優點:
缺點:
隨機森林是一種集成學習+決策樹的分類模型,它可以利用集成的思想(投票選擇的策略)來提升單顆決策樹的分類性能(通俗來講就是“三個臭皮匠,頂一個諸葛亮”)。
集集成學習和決策樹于一身,隨機森林算法具有眾多的優點,其中最為重要的就是在隨機森林算法中每棵樹都盡最大程度的生長,并且沒有剪枝過程。
隨機森林引入了兩個隨機性——隨機選擇樣本(bootstrap sample)和隨機選擇特征進行訓練。兩個隨機性的引入對隨機森林的分類性能至關重要。由于它們的引入,使得隨機森林不容易陷入過擬合,并且具有很好得抗噪能力(比如:對缺省值不敏感)。
不均衡樣本點處理方法
4.2 Boosting
Boosting的思路則是采用重賦權(re-weighting)法迭代地訓練基分類器,主要思想:
每一輪的訓練數據樣本賦予一個權重,并且每一輪樣本的權值分布依賴上一輪的分類結果。
基分類器之間采用序列式的線性加權方式進行組合。
分類問題中,它通過改變訓練樣本的權重,學習多個分類器,并將這些分類器進行線性組合,提高分類性能。
從上到下,從左到右進行
通過模型訓練之后,對正負樣本進行分類
第一步左下:將一個正的分為負的,兩個負的分為了正的
每個樣本初始化的時候都會賦予一個權值,將分錯的樣本的權重增大,分對的樣本的權重進行減小,對權值進行均衡,中上的圖就是權值改變程度
第二步中下:將三個負的分錯了
增大這三個負樣本的權值
迭代完成直到分類準確
每個學習器都有依賴于上一個學習器的結果進行權重的更新,也是boosting和bagging的最大的不同。
bagging和boosting區別
樣本選擇上:
- Bagging:訓練集是在原始集中有放回選取的,從原始集中選出的各輪訓練集之間是獨立的。
- Boosting:每一輪的訓練集不變,只是訓練集中每個樣例在分類器中的權重發生變化。而權值是根據上一輪的分類結果進行調整。
樣例權重:
Bagging:使用均勻取樣,每個樣例的權重相等。
Boosting:根據錯誤率不斷調整樣例的權值,錯誤率越大則權重越大。
預測函數:
Bagging:所有預測函數的權重相等。
Boosting:每個弱分類器都有相應的權重,對于分類誤差小的分類器會有更大的權重。
并行計算:
Bagging:各個預測函數可以并行生成。
Boosting:各個預測函數只能順序生成,因為后一個模型參數需要前一輪模型的結果。
Boosting和Bagging:
這兩種方法都是把若干個分類器整合為一個分類器的方法,只是整合的方式不一樣,最終得到不一樣的效果,將不同的分類算法套入到此類算法框架中一定程度上會提高了原單一分類器的分類效果,但是也增大了計算量。
下面是將決策樹與這些算法框架進行結合所得到的新的算法:
Bagging + 決策樹 = 隨機森林
AdaBoost + 決策樹 = 提升樹
Gradient Boosting + 決策樹 = GBDT
4.2.1 Adaboost
AdaBoost是adaptive和boosting的縮寫,訓練過程:
對訓練數據中的每個樣本,都賦予一個相同的權重,構成權重向量D
在訓練數據上訓練出一個弱分類器,并計算該分類器的錯誤率
為了從所有的樣本中得到最終的分類結果,為每個分類器都分配一個權值αα,權值是根據每個弱分類器的分類錯誤率計算的。
分類錯誤率:ξ=未正確分類的樣本數目所有樣本數目ξ=未正確分類的樣本數目所有樣本數目
每個分類器的權值:α=12ln(1?ξξ)α=12ln(1?ξξ)
計算得到當前的弱分類前的αα之后,對樣本的權重向量D進行更新,將第一次預測錯誤的樣本的權重增大,預測正確的樣本權重減小
如果某個樣本被正確分類,則其權值更改為:D(i+1)i=D(i)i?e?αSum(D)Di(i+1)=Di(i)?e?αSum(D)
如果某個樣本被錯誤分類,則其權值更改為:D(i+1)i=D(i)i?eαSum(D)Di(i+1)=Di(i)?eαSum(D)
計算出新的D之后,進入下一輪迭代迭代訓練分類器直到所有的樣本分類均正確
重復經過T輪學習之后:
| 獲得T個弱分類器 | h1,h2,...,hTh1,h2,...,hT |
| T個弱分類器的權值 | α1,α2,...,αTα1,α2,...,αT |
| 弱分類器分別的輸出 | h1(X),h2(X),...,hT(X)h1(X),h2(X),...,hT(X), |
| Adaboost的的輸出 | H(X)=sign(∑Ti=1αihi(X))H(X)=sign(∑i=1Tαihi(X)) |
Adaboost:
利用不同的權重去學習決策函數,再由決策函數去更新權值,反復迭代,得到一系列的弱學習器g(x),這些弱學習器的效果都很弱,但是比隨機猜的結果1/2要好一點,這些學習器有很大的不同,都有不同的參數。
g(x):
- 效果比隨機猜要好
- 都有不同的權重,可以組合
4.2.2 Gradient Boosting
決策樹是一種基本的分類與回歸方法。決策樹模型具有分類速度快,模型容易可視化的解釋,但是同時是也有容易發生過擬合,雖然有剪枝,但也是差強人意。
提升方法(boosting)在分類問題中,它通過改變訓練樣本的權重(增加分錯樣本的權重,減小分對樣本的的權重),學習多個分類器,并將這些分類器線性組合,提高分類器性能。boosting數學表示為:
f(x)=w0+∑m=1Mwm?m(x)f(x)=w0+∑m=1Mwm?m(x)其中:wmwm為每個弱分類器的權重,??為弱分類器的集合,最終的強分類器其實就是弱分類器的線性組合。
Gradient Boosting(梯度提升)的思想:Gradient Boosting是一種Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型損失函數的梯度下降方向。損失函數是評價模型性能(一般為擬合程度+正則項),認為損失函數越小,性能越好。而讓損失函數持續下降,就能使得模型不斷改性提升性能,其最好的方法就是使損失函數沿著梯度方向下降(講道理梯度方向上下降最快)。
Gradient Boost是一個框架,里面可以套入很多不同的算法。GBDT是GB的一種情況
GBDT=Gradient Boost+Decision Tree 也就是梯度提升+決策樹
為什么梯度提升方法選擇決策樹作為基學習器?
決策樹是if-then的規則集合,易于理解,可解釋性強,預測速度快,同時相比其他算法所更少的特征工程,可以很好的處理字段缺失的數據,也可以不用關心特征間是否相互依賴,決策樹能夠自動組合多個特征。
單獨使用決策樹算法時,有容易過擬合缺點。所幸的是,通過各種方法,抑制決策樹的復雜性,降低單顆決策樹的擬合能力,再通過梯度提升的方法集成多個決策樹,最終能夠很好的解決過擬合的問題。由此可見,梯度提升方法和決策樹學習算法可以互相取長補短,是一對完美的搭檔。
如何抑制單顆決策樹的過擬合:
- 限制樹的深度、葉子節點最少樣本數量、結點分裂時的最少樣本數量等
- 對訓練樣本進行采樣、只使用部分特征來選擇最優分類特征
- 目標函數添加正則化項
4.2.3 GBDT原理深入解析
gbdt 是通過采用加法模型(即基函數的線性組合),以及不斷減小訓練過程產生的殘差來達到將數據分類或者回歸的算法。
GBDT中的樹是回歸樹(不是分類樹),GBDT用來做回歸預測,調整后也可以用于分類。
回歸樹總體流程類似于分類樹,區別在于,回歸樹的每一個節點都會得一個預測值,以年齡為例,該預測值等于屬于這個節點的所有人年齡的平均值。
分枝時窮舉每一個feature的每個閾值找最好的分割點,但衡量最好的標準不再是最大熵,而是最小化平方誤差。也就是被預測出錯的人數越多,錯的越離譜,平方誤差就越大,通過最小化平方誤差能夠找到最可靠的分枝依據。分枝直到每個葉子節點上人的年齡都唯一或者達到預設的終止條件(如葉子個數上限),若最終葉子節點上人的年齡不唯一,則以該節點上所有人的平均年齡做為該葉子節點的預測年齡。
訓練集只有4個人,A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學生;C,D分別是應屆畢業生和工作兩年的員工。現在我們使用GBDT來做這件事,由于數據太少,我們限定葉子節點做多有兩個,即每棵樹都只有一個分枝,并且限定只學兩棵樹。我們會得到如下圖2所示結果:
在第一棵樹分枝和圖1一樣,由于A,B年齡較為相近,C,D年齡較為相近,他們被分為兩撥,每撥用平均年齡作為預測值。此時計算殘差(殘差的意思就是: A的預測值 + A的殘差 = A的實際值),所以A的殘差就是15-16=-1(注意,A的預測值是指前面所有樹累加的和,這里前面只有一棵樹所以直接是15,如果還有樹則需要都累加起來作為A的預測值)。進而得到A,B,C,D的殘差分別為-1,1,-1,1。然后我們拿殘差替代A,B,C,D的原值,到第二棵樹去學習,如果我們的預測值和它們的殘差相等,則只需把第二棵樹的結論累加到第一棵樹上就能得到真實年齡了。這里的數據顯然是我可以做的,第二棵樹只有兩個值1和-1,直接分成兩個節點。此時所有人的殘差都是0,即每個人都得到了真實的預測值。
那么哪里體現了Gradient呢?其實回到第一棵樹結束時想一想,無論此時的cost function是什么,是均方差還是均差,只要它以誤差作為衡量標準,殘差向量(-1, 1, -1, 1)都是它的全局最優方向,這就是Gradient。
GBDT:
gbdt通過多輪迭代,每輪迭代產生一個弱分類器,每個分類器在上一輪分類器的殘差基礎上進行訓練。對弱分類器的要求一般是足夠簡單,并且是低方差和高偏差的。因為訓練的過程是通過降低偏差來不斷提高最終分類器的精度。
弱分類器一般會選擇為CART TREE(也就是分類回歸樹)。由于上述高偏差和簡單的要求 每個分類回歸樹的深度不會很深。最終的總分類器 是將每輪訓練得到的弱分類器加權求和得到的(也就是加法模型)。
gbdt 通過經驗風險極小化來確定下一個弱分類器的參數。具體到損失函數本身的選擇也就是L的選擇,有平方損失函數,0-1損失函數,對數損失函數等等。如果我們選擇平方損失函數,那么這個差值其實就是我們平常所說的殘差。
但是其實我們真正關注的,1.是希望損失函數能夠不斷的減小,2.是希望損失函數能夠盡可能快的減小。所以如何盡可能快的減小呢?
讓損失函數沿著梯度方向的下降。這個就是gbdt 的 gb的核心了。 利用損失函數的負梯度在當前模型的值作為回歸問題提升樹算法中的殘差的近似值去擬合一個回歸樹。gbdt 每輪迭代的時候,都去擬合損失函數在當前模型下的負梯度。
這樣每輪訓練的時候都能夠讓損失函數盡可能快的減小,盡快的收斂達到局部最優解或者全局最優解。
GBDT基函數為回歸樹,回歸問題可以用平方損失函數,二分類問題可以用對數損失函數(邏輯回歸的損失函數)。
1、GBDT概述
GBDT也是集成學習Boosting家族的成員,但是卻和傳統的Adaboost有很大的不同。回顧下Adaboost,我們是利用前一輪迭代弱學習器的誤差率來更新訓練集的權重,這樣一輪輪的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱學習器限定了只能使用CART回歸樹模型,同時迭代思路和Adaboost也有所不同。
在GBDT的迭代中,假設我們前一輪迭代得到的強學習器是ft?1(x)ft?1(x), 損失函數是L(y,ft?1(x))L(y,ft?1(x)), 我們本輪迭代的目標是找到一個CART回歸樹模型的弱學習器ht(x)ht(x),讓本輪的損失損失L(y,ft(x)=L(y,ft?1(x)+ht(x))L(y,ft(x)=L(y,ft?1(x)+ht(x)) 最小。也就是說,本輪迭代找到決策樹,要讓樣本的損失盡量變得更小。
GBDT的思想可以用一個通俗的例子解釋,假如有個人30歲,我們首先用20歲去擬合,發現損失有10歲,這時我們用6歲去擬合剩下的損失,發現差距還有4歲,第三輪我們用3歲擬合剩下的差距,差距就只有一歲了。如果我們的迭代輪數還沒有完,可以繼續迭代下面,每一輪迭代,擬合的歲數誤差都會減小。
2、GBDT的負梯度擬合
上一節中,我們介紹了GBDT的基本思路,但是沒有解決損失函數擬合方法的問題。針對這個問題,大牛Freidman提出了用損失函數的負梯度來擬合本輪損失的近似值,進而擬合一個CART回歸樹。第t輪的第i個樣本的損失函數的負梯度表示為:
rti=?[?L(yi,f(xi)))?f(xi)]f(x)=ft?1(x)rti=?[?L(yi,f(xi)))?f(xi)]f(x)=ft?1(x)
利用(xi,rti)(i=1,2,..m)(xi,rti)(i=1,2,..m),我們可以擬合一顆CART回歸樹,得到了第t顆回歸樹,其對應的葉節點區域Rtj,j=1,2,...,JRtj,j=1,2,...,J。其中J為葉子節點的個數。
針對每一個葉子節點里的樣本,我們求出使損失函數最小,也就是擬合葉子節點最好的的輸出值ctjctj如下:
ctj=argminc∑xi∈RtjL(yi,ft?1(xi)+c)ctj=argminc∑xi∈RtjL(yi,ft?1(xi)+c)
這樣我們就得到了本輪的決策樹擬合函數如下:
ht(x)=∑Jj=1ctjI(x∈Rtj)ht(x)=∑j=1JctjI(x∈Rtj)
從而本輪最終得到的強學習器的表達式如下:
ft(x)=ft?1(x)+∑Jj=1ctjI(x∈Rtj)ft(x)=ft?1(x)+∑j=1JctjI(x∈Rtj)
通過損失函數的負梯度來擬合,我們找到了一種通用的擬合損失誤差的辦法,這樣無輪是分類問題還是回歸問題,我們通過其損失函數的負梯度的擬合,就可以用GBDT來解決我們的分類回歸問題。區別僅僅在于損失函數不同導致的負梯度不同而已。
GBDT回歸算法:
GBDT詳述
GBDT分類算法:
GBDT的分類算法從思想上和GBDT的回歸算法沒有區別,但是由于樣本輸出不是連續的值,而是離散的類別,導致我們無法直接從輸出類別去擬合類別輸出的誤差。
為了解決這個問題,主要有兩個方法,一個是用指數損失函數,此時GBDT退化為Adaboost算法。另一種方法是用類似于邏輯回歸的對數似然損失函數的方法。也就是說,我們用的是類別的預測概率值和真實概率值的差來擬合損失。
GBDT正則化:
和Adaboost一樣,我們也需要對GBDT進行正則化,防止過擬合。GBDT的正則化主要有三種方式。
第一種是和Adaboost類似的正則化項,即步長(learning rate)。
第二種正則化的方式是通過子采樣比例(subsample)。取值為(0,1]。注意這里的子采樣和隨機森林不一樣,隨機森林使用的是放回抽樣,而這里是不放回抽樣。如果取值為1,則全部樣本都使用,等于沒有使用子采樣。如果取值小于1,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小于1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低。推薦在[0.5, 0.8]之間。
第三種是對于弱學習器即CART回歸樹進行正則化剪枝
優缺點:
GBDT主要的優點有:
1) 可以靈活處理各種類型的數據,包括連續值和離散值。
2) 在相對少的調參時間情況下,預測的準備率也可以比較高。這個是相對SVM來說的。
3)使用一些健壯的損失函數,對異常值的魯棒性非常強。比如 Huber損失函數和Quantile損失函數。
GBDT的主要缺點有:
1)由于弱學習器之間存在依賴關系,難以并行訓練數據。不過可以通過自采樣的SGBT來達到部分并行。
4.2.4 GBDT和Adaboost的區別
與AdaBoost算法不同,梯度提升方法在迭代的每一步構建一個能夠沿著梯度最陡的方向降低損失(steepest-descent)的學習器來彌補已有模型的不足。
經典的AdaBoost算法只能處理采用指數損失函數的二分類學習任務2,而梯度提升方法通過設置不同的可微損失函數可以處理各類學習任務(多分類、回歸、Ranking等),應用范圍大大擴展。
另一方面,AdaBoost算法對異常點(outlier)比較敏感,而梯度提升算法通過引入bagging思想、加入正則項等方法能夠有效地抵御訓練數據中的噪音,具有更好的健壯性。
這也是為什么梯度提升算法(尤其是采用決策樹作為弱學習器的GBDT算法)如此流行的原因,有種觀點認為GBDT是性能最好的機器學習算法,這當然有點過于激進又固步自封的味道,但通常各類機器學習算法比賽的贏家們都非常青睞GBDT算法,由此可見該算法的實力不可小覷。
GBDT每一輪訓練時所關注的重點是本輪產生結果的殘差,下一輪以本輪殘差作為輸入,盡量去擬合這個殘差,使下一輪輸出的殘差不斷變小。所以GBDT可以做到每一輪一定向損失函數減小的梯度方向變化,而傳統的boosting算法只能是盡量向梯度方向減小,這是GBDT與傳統boosting算法最大的區別,這也是為什么GBDT相比傳統boosting算法可以用更少的樹個數與深度達到更好的效果。
和AdaBoost一樣,Gradient Boosting也是重復選擇一個表現一般的模型并且每次基于先前模型的表現進行調整。不同的是,AdaBoost是通過提升錯分數據點的權重來定位模型的不足,而GBDT是通過算梯度來定位模型的不足。因此相比AdaBoost,GBDT可以使用更多種類的目標函數。
抽象地說,模型的訓練過程是對一任意可導目標函數的優化過程,通過反復地選擇一個指向負梯度方向的函數,該算法可被看作在函數空間里對目標函數進行優化。
回歸問題
1) 用回歸樹去擬合殘差,其實就是用回歸樹去擬合目標方程關于f(x)的梯度。
2) 回歸的目標函數并不一定會用square loss。square loss的優點是便于理解和實現,缺點在于對于異常值它的魯棒性較差,一個異常值造成的損失由于二次冪而被過分放大,會影響到最后得到模型在測試集上的表現。可以算則Absolute loss或者Huber loss代替。
分類問題
1) 此時的目標函數常用log loss,如KL-散度或者交叉熵。
2) 除了損失函數的區別外,分類問題和回歸問題的區別還在于當多分類問題時,每輪可能會訓練多個分類器。
由于決策樹是非線性的,并且隨著深度的加深,非線性越來越強,所以基于決策樹的GBDT也是非線性的。
4.2.5 XGBoost
Xgboost是GB算法的高效實現,xgboost中的基學習器除了可以是CART(gbtree)也可以是線性分類器(gblinear)。下面所有的內容來自原始paper,包括公式。
Xgboost的分裂節點:
1、枚舉所有不同樹結構的貪心法
確定最優分裂屬性,最簡單的就是枚舉法,選擇loss function 最好的那個屬性。
如何求得最小的損失函數,即二次函數的求導來解決,選擇當前損失最小的屬性進行分裂,分裂之后再選擇損失函數最小的屬性,直到把屬性用完。
不斷地枚舉不同樹的結構,利用這個打分函數Obj來尋找出一個最優結構的樹,加入到我們的模型中,再重復這樣的操作。不過枚舉所有樹結構這個操作不太可行,所以常用的方法是貪心法,每一次嘗試去對已有的葉子加入一個分割。對于一個具體的分割方案,我們可以獲得的增益可以由如下公式計算。
在分裂的時候,你可以注意到,每次節點分裂,loss function被影響的只有這個節點的樣本,因而每次分裂,計算分裂的增益(loss function的降低量)只需要關注打算分裂的那個節點的樣本。
2、近似算法
主要針對數據太大,不能直接計算,算出近似的最大得分函數
Shrinkage:
Shrinkage(縮減)的思想認為,每次走一小步逐漸逼近結果的效果,要比每次邁一大步很快逼近結果的方式更容易避免過擬合。即它不完全信任每一個棵殘差樹,它認為每棵樹只學到了真理的一小部分,累加的時候只累加一小部分,通過多學幾棵樹彌補不足。本質上,Shrinkage為每棵樹設置了一個weight,累加時要乘以這個weight,但和Gradient并沒有關系。
4.2.6 XGBoost的整體回顧
如果某個樣本label數值為4,那么第一個回歸樹預測3,第二個預測為1; 另外一組回歸樹,一個預測2,一個預測2,那么傾向后一種,為什么呢?前一種情況,第一棵樹學的太多,太接近4,也就意味著有較大的過擬合的風險。
1、回歸樹的參數:
- 劃分屬性的選取
- 節點值的預測
2、優化策略=貪心+最優化
貪心策略:決策時刻按照當前目標最優化決定,說白了就是眼前利益最大化,最小化損失函數
二次優化問題:但是損失函數不是二次函數怎么辦?——利益泰勒二次展開,不是二次的想辦法近似為二次的
3、屬性的選擇
確定最優分裂屬性,最簡單的就是枚舉法,選擇loss function 最好的那個屬性。
- 如何求得最小的損失函數,即二次函數的求導來解決,選擇當前損失最小的屬性進行分裂,分裂之后再選擇損失函數最小的屬性,直到把屬性用完。
每次節點分裂,損失函數被影響的只有這個節點的樣本,因而每次分裂之后,計算分裂的增益只需要關注打算分裂的那個節點的樣本即可。
4、繼續分裂
按照上述的方式,形成一棵樹,再形成一棵樹,每次在上一次的預測基礎上取最優進一步分裂/建樹,是不是貪心策略?
5、循環迭代的停止條件
當引入的分裂帶來的增益小于一個閥值的時候,我們可以剪掉這個分裂,所以并不是每一次分裂loss function整體都會增加的,有點預剪枝的意思,閾值參數為(即正則項里葉子節點數T的系數);
當樹達到最大深度時則停止建立決策樹,設置一個超參數max_depth,避免樹太深導致學習局部樣本,從而過擬合;
當樣本權重和小于設定閾值時則停止建樹,這個解釋一下,涉及到一個超參數-最小的樣本權重和min_child_weight,和GBM的 min_child_leaf 參數類似,但不完全一樣,大意就是一個葉子節點樣本太少了,也終止同樣是過擬合;
樹的最大數量達到之后停止迭代
4.2.7 XGBoost和GBDT的區別
1)GBDT特指梯度提升決策樹算法,以CART為基學習器,而XGBoost中的基學習器也可以是線性分類器,此時的XGBoost相當于帶有L1和L2正則項的Logistic回歸(分類問題)或者線性回歸(回歸問題);
2)GBDT在迭代優化中只使用了一階導數信息,而XGBoost對損失函數進行泰勒展開的二階近似,既用到了一階導信息,也用到了二階導信息;并且XGBoost還支持自定的可一階導和二階導的損失函數;
3)XGBoost顯式地將樹模型的復雜度(即,夜間點的個數和每個葉節點上的權值平方和)作為正則項加入目標函數,以降低模型的方差(variance),使其學習出來的模型更加簡單,防止過擬合;
4)XGBoost尋找最佳分割點時,考慮到傳統的貪心法效率較低,實現了一種分裂節點近似算法,用于加速和減小內存消耗,除此之外還考慮了稀疏數據集、缺失值的處理(對于特征的值有缺失的樣本,XGBoost可以自動學習出它的分裂方向),大大提升算法的效率;
5)XGBoost借用了隨機森林的思想,允許使用列抽樣(column sampling)來防止過擬合,并且可以減少計算量
6)XGBoost支持分布式并行計算。XGBoost的并行不是tree粒度的并行,而是在特征粒度上的并行。決策樹的學習因為要尋找最佳分裂點,最耗時的一步是對特征的值進行排序,XGBoost在訓練之前,預先對數據進行了排序,然后保存為block結構,在后面的迭代中重復使用這個結構,大大減小計算量。這個block結構也使得并行成為了可能,在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行。 可并行的近似直方圖算法,樹節點在進行分裂時,我們需要計算每個特征的每個分割點對應的增益,即用貪心法枚舉所有可能的分割點。當數據無法一次載入內存或者在分布式情況下,貪心算法效率就會變得很低,所以xgboost還提出了一種可并行的近似直方圖算法,用于高效地生成候選的分割點。
4.3 stacking(堆疊)
根據原始的數據訓練m個分類器,未進行抽取,訓練都用的是原始的數據集,加上一些新的數據進行預測,最終達到一個較好的分類結果。
總結
- 上一篇: ChatGPT 创作福尔摩斯侦探小说,3
- 下一篇: 显示面板价格持续下降,京东方 2022