机智的ensemble
1 引言
本文主要結合了李宏毅的機器學習課程之Ensemble和周志華的《機器學習》西瓜書兩者的說法,對ensemble這一競賽利器做了總結。
Ensemble主要可以分為bagging和boosting兩種方法。其中,bagging適用于基模型復雜度比較高的情況(如樹模型),其目的是為了減小variance,即阻止過擬合的情況。而boosting則是適用于基模型是弱學習器的情況,其目的是減小biases,基本上多弱模型都可以用(如果分類正確率低于50%,取個反就可以了)~
2 Bagging
個人覺得bagging其實和神經網絡中的drop-out非常相似。我們只給每個模型看數據的一部分,不給它們看全貌,然后希望它們在這一部分上有比較好的學習結果,最后綜合各個模型的結果,做一個blending,得到最終的結果。
Bagging在選取數據時,采用的是bootstrap的方法,即有放回的抽樣。假設我們有 mm 個樣本的數據集 DD 。我們希望利用有放回的抽樣方法構造一個新的數據集 D′D′,其樣本個數仍舊是m。顯然 DD 中的一些數據會在 D′D′ 中重復出現,這也就意味著有一部分數據在 D′D′ 中是不會出現的。
我們可以做一個簡單的估計。樣本在m次采樣中,始終沒有被采到的概率為 (1?1m)m(1?1m)m ,取極限的話為
limm→∞(1?1m)m→1e≈0.368limm→∞(1?1m)m→1e≈0.368
這一部分沒有被采樣到的數據可以作為驗證集來使用,這個方法被稱“包外估計”(out-of-bag estimate)。
根據該方法訓練得到多個模型之后,可以取平均或者投票得到最終結果。
其中,隨機森林便是一個典型的利用bagging方法的模型,只不過在隨機森林當中,數據的特征也是隨機選取的。
3 Boosting
Boosting的主要想法是在已有模型的基礎上,重視被錯分的樣本,再訓練一個模型來融合到原模型中,以此來提高模型的準確率,如此不斷反復。那么如何重視被錯分的樣本呢?這就是boosting的一個有意思的地方了。它給每個樣本賦予了一個權重,每次boosting之后,樣本的權重就會被更新,而這里的權重直接影響了訓練時的Loss function。
式中, unun 即為每個樣本的權重。也就是說,現在我們的樣本變成了這個樣子
{(x1,y1,u1),(x2,y2,u2),?,(xn,yn,un)}{(x1,y1,u1),(x2,y2,u2),?,(xn,yn,un)}
Boosting的方法有很多,我們這里主要講一下其中比較流行的AdaBoost算法。
假設我們在第一個基模型 f1(x)f1(x) 上訓練得到的錯誤率為(此時所有樣本權重均相同)
?1=∑nun1δ(f1(xn)≠yn)Z1?1=∑nu1nδ(f1(xn)≠yn)Z1
其中
Z1=∑nun1Z1=∑nu1n
我們希望學習器的錯誤率 ?1?1 是大于0.5的,否則我們取個反,或者不要這個學習器,換一個。
知道了哪些訓練錯了,哪些訓練對了之后,我們就要進行最重要的重新分配權重了。所謂的重新分配權重就是給正確的權重除以一個 d1d1 ,錯誤的權重乘以一個 d1d1, d1>1d1>1。
那么這個 d1d1 怎么來?我們希望再更新權重之后,新的權重滿足下式
∑f1(xn)≠ynun2=∑f1(xn)=ynun2∑f1(xn)≠ynu2n=∑f1(xn)=ynu2n
也就是說,從權重上來看要錯的對的各占一半,即
∑f1(xn)≠ynun1d1=∑f1(xn)=ynun1/d1∑f1(xn)≠ynu1nd1=∑f1(xn)=ynu1n/d1
其中, Z1?1=∑f1(xn)≠ynun1d1Z1?1=∑f1(xn)≠ynu1nd1, Z1(1??1)=∑f1(xn)=ynun1d1Z1(1??1)=∑f1(xn)=ynu1nd1,代入上式可得
d1=(1??1)/?1?????????√d1=(1??1)/?1
再用此時的權重去訓練出第二個模型 f2(xn)f2(xn) 。之后,繼續如此操作,直到達到弱分類器個數限制。
為了方便表示,我們通常把 dd 表示成 eαeα 的形式,那么,權重的更新可以直接寫成
unt+1=unt?e?ynft(xn)αt=∏i=1te?ynαifi(xn)ut+1n=utn?e?ynft(xn)αt=∏i=1te?ynαifi(xn)
其中, αt=ln(dt)αt=ln(dt)。
得到所有的模型之后,我們希望把訓練的 TT 個模型融合起來,這個融合的過程就叫做blending。
一種簡單的做法就是直接取結果的平均
H(x)=sign(∑t=1Tft(x))H(x)=sign(∑t=1Tft(x))
但這樣的做法不夠機智。我們每個模型的可信度是不同的,我們需要給每個模型一個權重,得到一個加權平均的結果
H(x)=sign(∑t=1Tαtft(x))H(x)=sign(∑t=1Tαtft(x))
這里的 αtαt 就是我們前面的 αt=ln((1??1)/?1?????????√)αt=ln((1??1)/?1)。可以證明隨著模型數量的增加,模型在訓練集上的表現會越來越好,詳細證明可參見李宏毅的視頻。
4 Gradient Boosting
顧名思義,這是用Gradient的方法來進行boosting。上文中的Adaboost其實就是一種特殊的Gradient Boosting。Gradient Boosting的總體流程為
既然是要做Gradient,當然要有目標函數啊。這里的目標函數就是
L(g)=∑nl(yn,g(xn))L(g)=∑nl(yn,g(xn))
于是,就有
gt(x)=gt?1?η?L(g)?g(x)|g(x)=gt?1(x)gt(x)=gt?1?η?L(g)?g(x)|g(x)=gt?1(x)
又由于
gt(x)=gt?1(x)+αtft(x)gt(x)=gt?1(x)+αtft(x)
所以我們希望 ?η?L(g)?g(x)|g(x)=gt?1(x)?η?L(g)?g(x)|g(x)=gt?1(x) 和 αtft(x)αtft(x) 是方向相同的。即找到一個 ft(x)ft(x) 使得
maxft(x)?ηft(x)?L(g)?g(x)|g(x)=gt?1(x)maxft(x)?ηft(x)?L(g)?g(x)|g(x)=gt?1(x)
然后找一個 αtαt 使得 L(g)L(g) 最小。
當 L(g)=∑ne?yng(xn)L(g)=∑ne?yng(xn) 的時候,可以推出這就是我們的Adaboosting。
詳細推導過程偷下懶,參見李宏毅的視頻即可。
總結
以上是生活随笔為你收集整理的机智的ensemble的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 879. 盈利计划(动
- 下一篇: Chapter2-2_Voice Con