機器學習深版04:提升

fafagege11520發表於2020-12-07

機器學習深版04:提升(Boosting)


參考文章:

  1. https://www.cnblogs.com/jiangxinyang/p/9236385.html
  2. https://www.cnblogs.com/jiangxinyang/p/9248154.html

1. 分析隨機森林的特點

問題思考:
在這裡插入圖片描述

2. 提升

1. 概念

提升是一個機器學習技術,可以用於迴歸和分類問題,它每一步產生一個弱預測模型(如決策樹),並加權累加到總模型中;如果每一步的弱預測模型生成都是依據損失函式的梯度方向,則稱之為梯度提升
如果存在弱分類器,則可以通過提升的辦法得到強分類器。

相比於Bagging對樣本進行處理,我們想通過另一個方法Boost。

3. GBDT 梯度提升決策樹

GBDT是梯度提升決策樹(Gradient Boosting Decision Tree)的簡稱,GBDT可以說是最好的機器學習演算法之一。GBDT分類和迴歸時的基學習器都是CART迴歸樹,因為是擬合殘差的。
用於一個簡單的例子來說明GBDT,假如某人的年齡為30歲,第一次用20歲去擬合,發現損失還有10歲,第二次用6歲去擬合10歲,發現損失還有4歲,第三次用3歲去擬合4歲,依次下去直到損失在我們可接受範圍內。
以平方誤差損失函式的迴歸問題為例,來看看以損失來擬合是個什麼樣子,採用前向分佈演算法:
在這裡插入圖片描述

4. XGBoost演算法推導

事實上對於樹模型為基學習器的整合方法在建模過程中可以分為兩個步驟:一是確定樹模型的結構,二是確定樹模型的葉子節點中的輸出值。

1. 定義樹的複雜度

首先把樹拆分成結構部分q和葉子節點輸出值w,在這裡w是一個向量,表示各葉子節點中的輸出值。在這裡就囊括了上面提到的兩點,確定樹結構q和葉子結點的輸出值w。從下圖中可以看出,q(x)實際上是確定輸入值最終會落到哪個葉子節點上,而w將會給出相應的輸出值。
在這裡插入圖片描述
具體表現示例如下,引入正則化項 Ω(ft)來控制樹的複雜度,從而實現有效的控制模型的過擬合,這是xgboost中的第一個重要點。式子中的T為葉子節點數
在這裡插入圖片描述

2. XGBoost中的Boosting Tree模型

在這裡插入圖片描述
和GBDT方法一樣,XGBoost的提升模型也是採用殘差,不同的是分裂結點選取的時候不一定是最小平方損失,其損失函式如下,較GBDT其根據樹模型的複雜度加入了一項正則化項:
在這裡插入圖片描述

3. 對目標函式進行改寫

在這裡插入圖片描述
上面的式子是通過泰勒展開式將損失函式展開為具有二階導的平方函式。
在GBDT中我們通過求損失函式的負梯度(一階導數),利用負梯度替代殘差來擬合樹模型。在XGBoost中直接用泰勒展開式將損失函式展開成二項式函式(前提是損失函式一階、二階都連續可導,而且在這裡計算一階導和二階導時可以平行計算),假設此時我們定義好了樹的結構(在後面介紹,和GBDT中直接用殘差擬合不同),假設我們的葉節點區域為:
在這裡插入圖片描述
上面式子中i代表樣本i,j代表葉子節點j。
 則我們的目標優化函式可以轉換成(因為l(yi,yt−1i)是個已經確定的常數,可以捨去):
在這裡插入圖片描述

4. 樹結構的打分函式

上面的Obj值代表當指定一個樹結構時,在目標上面最多減少多少我們可以把它稱為結構分數。可以認為這是一個類似與基尼指數一樣更一般的對樹結構進行打分的函式。如下面的例子所示。
在這裡插入圖片描述
對於求得Obj分數最小的樹結構,我們可以列舉所有的可能性,然後對比結構分數來獲得最優的樹結構,然而這種方法計算消耗太大,更常用的是貪心法(事實上絕大多數樹模型都是這樣的,只考慮當前節點的劃分最優),每次嘗試對已經存在的葉節點(最開始的葉節點是根節點)進行分割,然後獲得分割後的增益為
在這裡插入圖片描述
在這裡以Gain作為判斷是否分割的條件,這裡的Gain可以看作是未分割前的Obj減去分割後的左右Obj,因此如果Gain<0,則此葉節點不做分割,然而這樣對於每次分割還是需要列出所有的分割方案(對於特徵的值的個數為n時,總共有2^n - 2 種劃分)。而實際中是採用近似貪心方法,我們先將所有樣本按照gi從小到大排序,然後進行遍歷,檢視每個節點是否需要分割(對於特徵的值的個數為n時,總共有n−1種劃分),具體示例如下:
在這裡插入圖片描述
最簡單的樹結構就是一個節點的樹。我們可以算出這棵單節點的樹的好壞程度obj*。假設我們現在想按照年齡將這棵單節點樹進行分叉,我們需要知道:

1)按照年齡分是否有效,也就是是否減少了obj的值

2)如果可分,那麼以哪個年齡值來分。

此時我們就是先將年齡特徵從小到大排好序,然後再從左到右遍歷分割

這樣的分割方式,我們就只要對樣本掃描一遍,就可以分割出GL,GR,然後根據Gain的分數進行分割,極大地節省了時間。所以從這裡看,XGBoost中從新定義了一個劃分屬性,也就是這裡的Gain,而這個劃分屬性的計算是由其目標損失決定obj的。

5. Adaboost演算法

1. 公式推導

樣本加權值。
初始權值分佈如下:

在這裡插入圖片描述
引入分類誤差率:
在這裡插入圖片描述
分類誤差率一般大於0,做錯的話exp後面的地方將會大於一,從而實現預測錯誤,權值增大。
在這裡插入圖片描述

2.舉例:

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
這時,f3(x)已經在訓練集上正確率達到百分百了。

3. 為什麼結果會收斂

只要能證明他的誤差上限是0,即可證明。

4. 一種理解方式

在這裡插入圖片描述

6. 方差與偏差

當我們的模型表現不佳時,通常是出現兩種問題,一種是 高偏差 問題,另一種是 高方差 問題。識別它們有助於選擇正確的優化方式,所以我們先來看下 偏差 與 方差 的意義。

  • 偏差: 描述模型輸出結果的期望與樣本真實結果的差距。
  • 方差: 描述模型對於給定值的輸出穩定性。
    在這裡插入圖片描述

7.補充:目標函式的組成

目標函式是最終需要優化的函式,其中包括經驗損失和結構損失
obj=loss+Ω
經驗損失(loss)就是傳說中的損失函式或者代價函式。結構損失(Ω)就是正則項之類的來控制模型複雜程度的函式。

相關文章