筆記:ML-LHY-22: Ensemble

zzig發表於2020-10-25

Framework of Ensemble

在這裡插入圖片描述
簡單來說,Ensemble就是組合多種不同的模型進行學習的方式。

Bagging

在這裡插入圖片描述
簡單的model:大的Bias,小的Variance
複雜的model:小的Bias,大的Variance
組合的情況下,Error rate隨著model的複雜度下降然後又升高。
在這裡插入圖片描述

有多個複雜的model進行平均,就能達到小的bias和小的variance。bagging要做的就是這個事情。

步驟:
在這裡插入圖片描述
對原來訓練資料進行放回採用,比如上面取樣4次,有可能一筆資料在多個子集合用到。
在這裡插入圖片描述
regression用average
classifier用voting

注意:只有再模型很複雜,很容易overfitting時候,為了減輕variance,才選用bagging方法。一般NN不是很容易overfitting的方法,而decision tree是個很容易overfitting的方法

Decision Tree

Decision Tree做bagging的版本就是隨機森林(random forest)
在這裡插入圖片描述
Decision Tree可以在training data上達到100%準確度是很容易的,就是沒筆data都作為樹的葉子。但是,這也就是明顯的overfitting,不見得在validation上有很好的performance。

Experiment: Function of Miku

在這裡插入圖片描述
對這樣的資料進行分類實驗。

在這裡插入圖片描述
深度為5可以想象Decision Tree的每個節點範圍都是比較大的,比如level1: 100 < x < 200 100<x<200 100<x<200 level2: 300 < y < 400 300<y<400 300<y<400 是1
。所以分的不是很精確,然後隨著深度提升,精度越來越高。

Random Forest

實現Random Forest可以用傳統sample的方法,但是performance是和沒用差不多的。
一般Random Forest是隨機限制那些分支或者問題。

如果使用bagging,是不用把labeled data分成training data和validation data的。但是有 一樣的validation,具體做:
在這裡插入圖片描述

分成4個子集個,比如訓練f1的時候只用了第3,4筆資料。
在這裡插入圖片描述
Random Forest結果:
在這裡插入圖片描述
可以看到更加平滑。

Boosting

Bagging使用在很複雜的model上,而Boosting是用在比較簡單的model上

Guarantee

在這裡插入圖片描述

Framework of boosting

在這裡插入圖片描述
需要注意的是:The classifiers are learned sequentially,先找f1後才知道怎麼找f2.

How to obtain different classifiers?

當有不同的訓練資料時,就獲得了不同的classifier
問題變成怎麼找不同的訓練資料:

  • Re-sampling :和Bagging一樣使用放回取樣得到新的訓練集
  • Re-weighting:對資料加上不同的weight得到的訓練集,在Re-sampling中如果一筆data用了2次,那麼weight就是2,Re-weighting可以用小數罷了
    在這裡插入圖片描述
    事實上,Re-weighting只是改變不同資料對loss的側重。

Adaboost

找會在f1上爛掉的新的訓練資料(reweight training example),作為f1的訓練資料
問題變成怎麼找會在f1上爛掉的新的訓練資料:
先來看一下在f1上的錯誤率 ε 1 \varepsilon_{1} ε1怎麼算:
ε 1 = ∑ n u 1 n δ ( f 1 ( x n ) ≠ y ^ n ) ∑ n u 1 n \varepsilon_{1}=\frac{\sum_{n} u_{1}^{n} \delta\left(f_{1}\left(x^{n}\right) \neq \hat{y}^{n}\right)}{\sum_{n} u_{1}^{n}} ε1=nu1nnu1nδ(f1(xn)=y^n)
一筆來說,初始的f1,除非是隨機,再差也會小於0.5,即 ε 1 < 0.5 \varepsilon_{1}<0.5 ε1<0.5

u 1 n u_{1}^{n} u1n變成 u 2 n u_{2}^{n} u2n,還是在這些資料上,用了 u 2 n u_{2}^{n} u2n後,使得:
∑ n u 2 n δ ( f 1 ( x n ) ≠ y ^ n ) ∑ n u 2 n = 0.5 \frac{\sum_{n} u_{2}^{n} \delta\left(f_{1}\left(x^{n}\right) \neq \hat{y}^{n}\right)}{\sum_{n} u_{2}^{n}}=0.5 nu2nnu2nδ(f1(xn)=y^n)=0.5
然後用 u 2 n u_{2}^{n} u2n作為weight的資料,去訓練f2。那麼f2就是和f1互補的。

下面是這麼找 u 2 n u_{2}^{n} u2n步驟:
在這裡插入圖片描述
比如上面的f1,錯誤率是0.25
u 2 n u_{2}^{n} u2n要做的就是分類正確的examp對應的u變小,分類錯誤的examp對應的u變大。這樣錯誤率就變為0.5了。然後就得到 u 2 n u_{2}^{n} u2n了,然後用 u 2 n u_{2}^{n} u2n作為weight的資料訓練f2,錯誤率又會小於0.5。並且f2和f1是互補的。

在這裡插入圖片描述
怎麼求 d 1 d_{1} d1呢?

在這裡插入圖片描述
最後分子分母倒了一下,本來是 = 0.5的。
在這裡插入圖片描述
嘿嘿,最後就推導了 d 1 = ( 1 − ε 1 ) / ε 1 > 1 d_{1}=\sqrt{\left(1-\varepsilon_{1}\right) / \varepsilon_{1}}>1 d1=(1ε1)/ε1 >1,比如上面的 ε 1 = 0.25 \varepsilon_{1} = 0.25 ε1=0.25,帶進去求得的的 d 1 = ( 1 − 0.25 ) / 0.25 = 3 d_{1}=\sqrt{\left(1-0.25\right) / 0.25} = \sqrt{3} d1=(10.25)/0.25 =3


AdaBoost演算法:

  • 給定訓練資料
    { ( x 1 , y ^ 1 , u 1 1 ) , ⋯   , ( x n , y ^ n , u 1 n ) , ⋯   , ( x N , y ^ N , u 1 N ) } y ^ = ± 1  (Binary classification),  u 1 n = 1  (equal weights)  \left\{\left(x^{1}, \hat{y}^{1}, u_{1}^{1}\right), \cdots,\left(x^{n}, \hat{y}^{n}, u_{1}^{n}\right), \cdots,\left(x^{N}, \hat{y}^{N}, u_{1}^{N}\right)\right\} \\ \hat{y}=\pm 1 \text { (Binary classification), } u_{1}^{n}=1 \text { (equal weights) } {(x1,y^1,u11),,(xn,y^n,u1n),,(xN,y^N,u1N)}y^=±1 (Binary classification), u1n=1 (equal weights) 

  • 迭代 t = 1 , … , T \mathrm{t}=1, \ldots, \mathrm{T} t=1,,T:

    • 使用 { u t 1 , ⋯   , u t N } \left\{u_{t}^{1}, \cdots, u_{t}^{N}\right\} {ut1,,utN}作為weight的資料來訓練比較弱的的 f t ( x ) f_t(x) ft(x)分類器
    • 計算訓練得到的錯誤率 ε t \varepsilon_{t} εt
    • 迭代 n = 1 , … , N n=1, \ldots, N n=1,,N
      • 如果 x n x^{n} xn f t ( x ) f_t(x) ft(x)分類器分錯:
      • u t + 1 n = u t n × d t = u t n × exp ⁡ ( α t ) u_{t+1}^{n}=u_{t}^{n} \times d_{t}=u_{t}^{n} \times \exp \left(\alpha_{t}\right) ut+1n=utn×dt=utn×exp(αt)
      • 否則:
      • u t + 1 n = u t n / d t = u t n × exp ⁡ ( − α t ) u_{t+1}^{n}=u_{t}^{n} / d_{t}=u_{t}^{n} \times \exp \left(-\alpha_{t}\right) ut+1n=utn/dt=utn×exp(αt)
      • 也可寫成一步: u t + 1 n ← u t n × exp ⁡ ( − y ^ n f t ( x n ) α t ) u_{t+1}^{n} \leftarrow u_{t}^{n} \times \exp \left(-\hat{y}^{n} f_{t}\left(x^{n}\right) \alpha_{t}\right) ut+1nutn×exp(y^nft(xn)αt)

其中, d t = ( 1 − ε t ) / ε t d_{t}=\sqrt{\left(1-\varepsilon_{t}\right) / \varepsilon_{t}} dt=(1εt)/εt α t = ln ⁡ ( 1 − ε t ) / ε t \alpha_{t}=\ln \sqrt{\left(1-\varepsilon_{t}\right) / \varepsilon_{t}} αt=ln(1εt)/εt


得到了 f 1 ( x ) , … , f t ( x ) . . , f T ( x ) f_{1}(x), \ldots, f_{t}(x). ., f_{T}(x) f1(x),,ft(x)..,fT(x),怎麼疊加起來,得到測試的輸出結果?
在這裡插入圖片描述
使用不一樣的權重,表示錯誤率的分類器 α t \alpha_{t} αt會更大。

Toy Example

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
對於右下角:f1和f2都認為藍色,權重之和為1.08,f3認為是紅色,權重為0.95.所以最終右下角是藍色。類似的其他塊。3個weak的classifier組合起來就可以得到好的結果。

Warning of Math

H ( x ) = sign ⁡ ( ∑ t = 1 T α t f t ( x ) ) α t = ln ⁡ ( 1 − ε t ) / ε t H(x)=\operatorname{sign}\left(\sum_{t=1}^{T} \alpha_{t} f_{t}(x)\right) \quad \alpha_{t}=\ln \sqrt{\left(1-\varepsilon_{t}\right) / \varepsilon_{t}} H(x)=sign(t=1Tαtft(x))αt=ln(1εt)/εt
證明:更多的classifier: f t f_{t} ft,即迭代更多次, H ( x ) H(x) H(x)在訓練資料上會有更小的錯誤率。

在這裡插入圖片描述
這裡提出 1 N ∑ n exp ⁡ ( − y ^ n g ( x n ) ) \frac{1}{N} \sum_{n} \exp \left(-\hat{y}^{n} g\left(x^{n}\right)\right) N1nexp(y^ng(xn))作為 H ( x ) H(x) H(x)的上界。所以我們要證明 H ( x ) H(x) H(x)隨著迭代次數增加這個上界會越來越小。
注意: g ( x n ) = ∑ t = 1 T α t f t ( x ) g\left(x^{n}\right) = \sum_{t=1}^{T} \alpha_{t} f_{t}(x) g(xn)=t=1Tαtft(x),所以上界是會隨著迭代次數t變換的。

先定義 Z t Z_{t} Zt f t f_{t} ft這個classifier對應的訓練資料的權重和。

在這裡插入圖片描述
所以就有:
1 N ∑ exp ⁡ ( − y ^ n g ( x n ) ) = 1 N Z T + 1 \frac{1}{N} \sum \exp \left(-\hat{y}^{n} g\left(x^{n}\right)\right)=\frac{1}{N} Z_{T+1} N1exp(y^ng(xn))=N1ZT+1
那麼證明 Z t Z_{t} Zt隨著 t t t遞減就行了。
在這裡插入圖片描述
其中, Z t = Z t − 1 ε t exp ⁡ ( α t ) + Z t − 1 ( 1 − ε t ) exp ⁡ ( − α t ) Z_{t}=Z_{t-1} \varepsilon_{t} \exp \left(\alpha_{t}\right)+Z_{t-1}\left(1-\varepsilon_{t}\right) \exp \left(-\alpha_{t}\right) Zt=Zt1εtexp(αt)+Zt1(1εt)exp(αt)
是比較直觀的一種做法, Z t Z_{t} Zt f t f_{t} ft對應的訓練資料的權重和。 Z t − 1 ε t Z_{t-1} \varepsilon_{t} Zt1εt表示分類錯誤的部分,乘上 exp ⁡ ( α t ) = d t \exp \left(\alpha_{t}\right) = d_{t} exp(αt)=dt,正確部分同理。

最終推導錯誤率的上界形式:
∏ t = 1 T 2 ε t ( 1 − ε t ) \prod_{t=1}^{T} 2 \sqrt{\varepsilon_{t}\left(1-\varepsilon_{t}\right)} t=1T2εt(1εt)
由於: 2 ϵ t ( 1 − ϵ t ) < 1 2 \sqrt{\epsilon_{t}\left(1-\epsilon_{t}\right)} < 1 2ϵt(1ϵt) <1,累乘會越來越小。所以上界越來越小,也就可以證明:迭代更多次, H ( x ) H(x) H(x)在訓練資料上會有更小的錯誤率。


發現Adaboost在train時在迭代5次時已經達到0了,但繼續迭代,test時還會繼續下降。
在這裡插入圖片描述

Margin的定義
在這裡插入圖片描述
我們希望 y ^ \hat{y} y^ g ( x ) g(x) g(x)不只是同號,還希望它們相乘越大越好。

在這裡插入圖片描述
迭代5次的時候,從CDF來看,在margin為0.7附近時,不會再有資料可以使得margin提升。說明迭代5次時training data上 y ^ n g ( x n ) \hat{y}^{n} g\left(x^{n}\right) y^ng(xn)都大於0。而迭代100次就一直會有資料使得margin提升(CDF的導數為概率密度不為0)。

為什麼Adaboost可以讓margin增加?
在這裡插入圖片描述
之前已經說了,Adaboost的上界是圖上標記的那條。我們期望減小上界來減少錯誤率。目標函式也就變成 ∏ t = 1 T 2 ε t ( 1 − ε t ) \prod_{t=1}^{T} 2 \sqrt{\varepsilon_{t}\left(1-\varepsilon_{t}\right)} t=1T2εt(1εt) ,它是隨著t減少的。


在這裡插入圖片描述

Gradient Boosting

從梯度下降方法來看Adaboost
在這裡插入圖片描述

H ( x ) H(x) H(x)和上面一樣,迭代T次對 f t f_{t} ft加權累加,期望輸出和真實值越大越好(也同號)。
我們從梯度下降角度出發,有這麼一個損失函式:
L ( g ) = ∑ n l ( y ^ n , g ( x n ) ) L(g)=\sum_{n} l\left(\hat{y}^{n}, g\left(x^{n}\right)\right) L(g)=nl(y^n,g(xn))
函式l可以是cross entropy或者mse。這裡我們假設是: ∑ n exp ⁡ ( − y ^ n g ( x n ) ) \sum_{n} \exp \left(-\hat{y}^{n} g\left(x^{n}\right)\right) nexp(y^ng(xn))在這裡插入圖片描述
g t ( x ) g_{t}(x) gt(x)怎麼看做是引數?可以這麼理解:
輸入 g t ( x 1 ) g_{t}(x_1) gt(x1),得到一個引數 g t ( x 1 ) g_{t}(x_1) gt(x1)
輸入 g t ( x 2 ) g_{t}(x_2) gt(x2),得到一個引數 g t ( x 2 ) g_{t}(x_2) gt(x2)
無窮多個點,就是輸入 g t ( x ) g_{t}(x) gt(x),得到一個引數 g t ( x ) g_{t}(x) gt(x)
然後做GD,我們希望下降的方向和Adaboost優化的方向一樣:
在這裡插入圖片描述
就是找 f t f_{t} ft使得乘積最大。發現這個式子的weight就是Adaboost的weight : u t n u_{t}^{n} utn,也就是說GD每次更新和Adaboost是一樣,那麼最後得到的 f t f_{t} ft也是一樣。

在這裡插入圖片描述
α t \alpha_{t} αt要是的loss最小,也就是對 α t \alpha_{t} αt求導要為0,最後求得的 α t \alpha_{t} αt和Adaboost一樣。
要注意的是:Gradient Boosting可以改Objective Function,不一定非要是 ∑ n exp ⁡ ( − y ^ n g ( x n ) ) \sum_{n} \exp \left(-\hat{y}^{n} g\left(x^{n}\right)\right) nexp(y^ng(xn))

Stacking

在這裡插入圖片描述
投票方式可能會存在個別非常差的model影響整個model輸出。

在這裡插入圖片描述
Final Classifier不需要太複雜,只需要Logistic Regression就行了。注意訓練資料要分2份,防止有故意擬合Training data的model。

以上參考李宏毅老師視訊和ppt,僅作為學習筆記交流使用