筆記:ML-LHY-22: Ensemble
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=∑nu1n∑nu1nδ(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
∑nu2n∑nu2nδ(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=(1−0.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+1n←utn×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=1∑Tα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)
N1∑nexp(−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}
N1∑exp(−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=Zt−1εtexp(αt)+Zt−1(1−εt)exp(−αt)
是比較直觀的一種做法,
Z
t
Z_{t}
Zt是
f
t
f_{t}
ft對應的訓練資料的權重和。
Z
t
−
1
ε
t
Z_{t-1} \varepsilon_{t}
Zt−1ε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=1∏T2ε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)=n∑l(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,僅作為學習筆記交流使用
相關文章
- Ensemble distillation for robust model fusion in federated learning論文筆記筆記
- [Triton課程筆記] 1.2.4 程式設計實戰-配置ensemble model筆記程式設計
- 整合學習總結(Ensemble Learning)
- 整合學習演算法(Ensemble Method)淺析演算法
- 印象筆記 --- 方法分享筆記筆記
- Paper Reading: Imbalanced ensemble learning leveraging a novel data-level diversity metric
- 筆記筆記
- QinQ 筆記筆記
- python筆記Python筆記
- Vim筆記筆記
- Mysql 筆記MySql筆記
- HTML筆記HTML筆記
- EMC 筆記筆記
- SpringBoot筆記Spring Boot筆記
- 2024.10.5 筆記筆記
- [筆記]皮囊筆記
- docker 筆記Docker筆記
- 0826 筆記筆記
- sql筆記SQL筆記
- redis筆記Redis筆記
- Typora筆記筆記
- Labview筆記View筆記
- SCRUM筆記Scrum筆記
- MarkDown筆記筆記
- PySimpleGUI筆記GUI筆記
- Maven 筆記Maven筆記
- cython 筆記筆記
- MySQL筆記MySql筆記
- 2024.3.9 筆記筆記
- Fiber筆記筆記
- Minitorch筆記筆記
- 2024.3.16 筆記筆記
- vue筆記Vue筆記
- jQuery 筆記jQuery筆記
- PostgreSQL筆記SQL筆記
- Mattermost 筆記筆記
- nginx筆記Nginx筆記
- sqlsugar筆記SqlSugar筆記