集成學習-Boosting,Bagging與Stacking

集成學習-Boosting,Bagging與Stacking

來自專欄 Eureka機器學習讀書筆記8 人贊了文章

專欄文章匯總

文章結構如下:

1: 集成學習概述

2: 集成學習之個體學習器

3: 集成學習之boosting

4: 集成學習之bagging

5: Bagging與Boosting對比

6: 集成學習之結合策略

  • 6.1 平均法
  • 6.2 投票法
  • 6.3 學習法

7: 集成學習之Stacking

8: 參考文獻


集成學習(ensemble learning)本身不是一個單獨的機器學習演算法,而是通過構建並結合多個機器學習器來完成學習任務。也就是我們常說的「博採眾長」。集成學習可以用於分類問題集成,回歸問題集成,特徵選取集成,異常點檢測集成等等,可以說所有的機器學習領域都可以看到集成學習的身影。


1: 集成學習概述

從下圖,我們可以對集成學習的思想做一個概括。對於訓練集數據,我們通過訓練若干個個體學習器(individual learner),通過一定的結合策略,就可以最終形成一個強學習器,以達到博採眾長的目的。

也就是說,集成學習有兩個主要的問題需要解決,第一是如何得到若干個個體學習器,第二是如何選擇一種結合策略,將這些個體學習器集合成一個強學習器。


2: 集成學習之個體學習器

集成學習的第一個問題就是如何得到若干個個體學習器。這裡有兩種選擇。第一種就是所有的個體學習器都是一個種類的,或者說是同質的(homogeneous),同質集成中的個體學習器也稱為「基學習器」(base learner),相應的學習演算法稱為「基學習演算法」(base learning algorithm)。比如都是決策樹個體學習器,或者都是神經網路個體學習器。第二種是所有的個體學習器不全是一個種類的,或者說是異質的(heterogeneous)。比如我們有一個分類問題,對訓練集採用支持向量機個體學習器,邏輯回歸個體學習器和樸素貝葉斯個體學習器來學習,再通過某種結合策略來確定最終的分類強學習器。這時個體學習器一般不稱為基學習器,而稱作「組件學習器」(component leaner)或直接稱為個體學習器。

弱學習器(weak learner):指泛化性能略優於隨機猜測的學習器:例如在二分類問題桑精度略高於50%的分類器。

前面提到,集成學習的直覺是結合多個個體的能力,獲得遠超個體的集體能力優勢。這種直覺在實際上對於「弱學習器」是非常符合的。故很多集成學習的研究也都是針對弱學習器,而基學習器有時也被直接稱為弱學習器。

一般經驗中,如果把好壞不一的東西摻雜在一起,那麼最終結果很可能是整體效果比最壞的東西要好一些,但又比最好的那個要壞一些,那麼這種情況下不如就讓最好的單獨去工作,而不要參與混合。但是集成學習還是對多個學習器進行了結合,那它怎麼保證整體的效果會比最好的那個單一學習器的效果更好呢。

用一個簡單的例子來進行說明:在一個二分類任務中,假設三個分類器在三個測試樣本上的表現如下圖所示。假設集成學習的結果通過三個個體學習器用投票發(voting)產生,即「少數服從多數」,那麼當三個個體學習器分別對三個測試例有不同的判別優勢時,集成的效果也會不一樣。

在(a)中,每個分類器原本只有66.6%的精度,集成學習卻達到了100%;(b)中,每個分類器都是一樣的,集成之後性能沒有任何提高;在(c)中,每個分類器的精度只有33.3%,集成之後結果反而變得更糟。

這個例子表明:要獲得好的集成,個體學習器應「好而不同」,即個體學習器要有一定的準確性,即學習器不能太壞,並且要有「多樣性」(diversity),即學習器間具有差異。

根據個體學習器生成方式的不同,目前集成學習方法大致可分為兩大類,第一個是個體學習器之間存在強依賴關係,一系列個體學習器基本都需要串列生成的序列化方法,代表演算法是boosting系列演算法,第二個是個體學習器之間不存在強依賴關係,一系列個體學習器可以並行生成,代表演算法是bagging和隨機森林(Random Forest)系列演算法。


3: 集成學習之boosting

Boosting演算法的工作機制是首先從訓練集用初始權重訓練出一個弱學習器1,根據弱學習的學習誤差率表現來更新訓練樣本的權重,使得之前弱學習器1學習誤差率高的訓練樣本點的權重變高,使得這些誤差率高的點在後面的弱學習器2中得到更多的重視。然後基於調整權重後的訓練集來訓練弱學習器2.,如此重複進行,直到弱學習器數達到事先指定的數目T,最終將這T個弱學習器通過集合策略進行整合,得到最終的強學習器。

Boosting系列演算法里最著名演算法主要有AdaBoost演算法和提升樹(boosting tree)系列演算法。提升樹系列演算法裡面應用最廣泛的是梯度提升樹(Gradient Boosting Tree)。AdaBoost和提升樹演算法的原理下一篇來講。


4: 集成學習之bagging

Bagging的演算法原理和 boosting不同,它的弱學習器之間沒有依賴關係,可以並行生成。

從上圖可以看出,bagging的個體弱學習器的訓練集是通過隨機採樣得到的。通過3次的隨機採樣,我們就可以得到3個採樣集,對於這3個採樣集,我們可以分別獨立的訓練出3個弱學習器,再對這3個弱學習器通過集合策略來得到最終的強學習器。

對於這裡的隨機採樣有必要做進一步的介紹,這裡一般採用的是自助採樣法(Bootstap sampling),即對於 m 個樣本的原始訓練集,我們每次先隨機採集一個樣本放入採樣集,接著把該樣本放回,也就是說下次採樣時該樣本仍有可能被採集到,這樣採集 m 次,最終可以得到 m 個樣本的採樣集,由於是隨機採樣,這樣每次的採樣集是和原始訓練集不同的,和其他採樣集也是不同的,這樣得到多個不同的弱學習器。

註:Bootstrap方法是非常有用的一種統計學上的估計方法。 Bootstrap是一類非參Monte Carlo方法,其實質是對觀測信息進行再抽樣,進而對總體的分布特性進行統計推斷。首先,Bootstrap通過重抽樣,避免了Cross-Validation造成的樣本減少問題,其次,Bootstrap也可以創造數據的隨機性。Bootstrap是一種有放回的重複抽樣方法,抽樣策略就是簡單的隨機抽樣。

隨機森林(Random Forest,簡稱RF)是Bagging的一個擴展變體。其在以決策樹作為基學習器構建Bagging集成的基礎上,進一步在決策樹的訓練過程中引入了隨機屬性選擇。

具體來說,傳統決策樹在選擇劃分屬性時是在當前結點的屬性集合(假定有 d 個屬性)中選擇一個最優屬性;而在RF中,對基決策樹的每個結點,先從該結點的屬性集合中隨機選擇一個包含 k 個屬性的子集,然後再從這個子集中選擇一個最優屬性用於劃分。這裡的參數 k 控制了隨機性的引入程度:若令 k=d ,則基決策樹的構建與傳統決策樹相同;若令 k=1 ,則是隨機選擇一個屬性用於劃分;一般情況下,推薦值 k=log_2d 。bagging和隨機森林演算法的原理以後也會講解。


5: Bagging與Boosting對比

為什麼bagging是減少variance,而boosting是減少bias?

本小節轉自:為什麼說bagging是減少variance,而boosting是減少bias?

作者:過擬合的回答。

Bagging對樣本重採樣,對每一重採樣得到的子樣本集訓練一個模型,最後取平均。由於子樣本集的相似性以及使用的是同種模型,因此各模型有近似相等的bias和variance(事實上,各模型的分布也近似相同,但不獨立)。由於 E[frac{sum X_i}{n}]=E[X_i] ,所以bagging後的bias和單個子模型的接近,一般來說不能顯著降低bias。另一方面,若各子模型獨立,則有 Var(frac{sum X_i}{n})=frac{Var(X_i)}{n} ,此時可以顯著降低variance。若各子模型完全相同,則 Var(frac{sum X_i}{n})=Var(X_i) ,此時不會降低variance。bagging方法得到的各子模型是有一定相關性的,屬於上面兩個極端狀況的中間態,因此可以一定程度降低variance。為了進一步降低variance,Random forest通過隨機選取變數子集做擬合的方式de-correlated了各子模型(樹),使得variance進一步降低。

boosting從優化角度來看,是用forward-stagewise這種貪心法去最小化損失函數 L(y_i,sum_ia_if_i(x)) 。例如,常見的AdaBoost即等價於用這種方法最小化exponential loss: L(y,f(x))=exp(-yf(x)) 。所謂forward-stagewise,就是在迭代的第 n 步,求解新的子模型 f(x) 及步長 a (或者叫組合係數),來最小化 L(y,f_{n-1}(x)+alpha f(x)) ,這裡 f_{n-1}(x) 是前 n-1 步得到的子模型的和。因此boosting是在sequential地最小化損失函數,其bias自然逐步下降。但由於是採取這種sequential、adaptive的策略,各子模型之間是強相關的,於是子模型之和並不能顯著降低variance。所以說boosting主要還是靠降低bias來提升預測精度。


6: 集成學習之結合策略

假設集成中包含 T 個基學習器 h_1,h_2,...,h_T ,其中 h_i 在示例 x 上的輸出為 h_i(x) 。那麼對 h_i 進行結合的常見策略有以下幾種:

6.1 平均法

對於數值類的回歸預測問題,通常使用的結合策略是平均法,也就是說,對於若干個弱學習器的輸出進行平均得到最終的預測輸出。

最簡單的平均是算術平均,也就是說最終預測是:

H(x)=frac{1}{T}sum_1^Th_i(x)

如果每個個體學習器有一個權重 w ,則最終預測是:

H(x)=sum_1^Tw_ih_i(x)

其中 w_i 是個體學習器 h_i 的權重, w_ige 0, sum_1^Tw_i=1

一般而言,在個體學習器的性能相差較大時宜使用加權平均法,而在個體學習器性能相近時宜使用簡單平均法。

6.2 投票法

對於分類問題的預測,我們通常使用的是投票法。假設我們的預測類別是 {c_1,c_2,...,c_K} ,對於任意一個預測樣本 x ,我們的 T 個弱學習器的預測結果分別是 (h_1(x),h_2(x),...,h_T(x))

最簡單的投票法是相對多數投票法(plurality voting),也就是我們常說的少數服從多數,也就是 T 個弱學習器的對樣本 x 的預測結果中,數量最多的類別 c_i 為最終的分類類別。如果不止一個類別獲得最高票,則隨機選擇一個做最終類別。

稍微複雜的投票法是絕對多數投票法(majority voting),也就是我們常說的要票過半數。在相對多數投票法的基礎上,不光要求獲得最高票,還要求票過半數。否則會拒絕預測。

更加複雜的是加權投票法(weighted voting),和加權平均法一樣,每個弱學習器的分類票數要乘以一個權重,最終將各個類別的加權票數求和,最大的值對應的類別為最終類別。

6.3 學習法

上兩節的方法都是對弱學習器的結果做平均或者投票,相對比較簡單,但是可能學習誤差較大,於是就有了學習法這種方法,對於學習法,代表方法是stacking,當使用stacking的結合策略時, 我們不是對弱學習器的結果做簡單的邏輯處理,而是再加上一層學習器,也就是說,我們將訓練集弱學習器的學習結果作為輸入,將訓練集的輸出作為輸出,重新訓練一個學習器來得到最終結果。

在這種情況下,我們將弱學習器稱為初級學習器,將用於結合的學習器稱為次級學習器。對於測試集,我們首先用初級學習器預測一次,得到次級學習器的輸入樣本,再用次級學習器預測一次,得到最終的預測結果。


7: 集成學習之Stacking

將訓練好的所有基模型對訓練基進行預測,第j個基模型對第i個訓練樣本的預測值將作為新的訓練集中第i個樣本的第j個特徵值,最後基於新的訓練集進行訓練。同理,預測的過程也要先經過所有基模型的預測形成新的測試集,最後再對測試集進行預測:

Stacking演算法分為2層,第一層是用不同的演算法形成T個弱分類器,同時產生一個與原數據集大小相同的新數據集,利用這個新數據集和一個新演算法構成第二層的分類器。

Stacking 就像是 Bagging的升級版,Bagging中的融合各個基礎分類器是相同權重,而Stacking中則不同,Stacking中第二層學習的過程就是為了尋找合適的權重或者合適的組合方式。


7: 參考文獻

集成學習原理小結 - 劉建平Pinard - 博客園

Xtecher | 一文讀懂集成學習(附學習資源)

集成學習(Ensemble Learning)

一文讀懂集成學習 - CSDN博客

推薦閱讀:

集成學習之Boosting —— AdaBoost原理
集成學習之Boosting —— AdaBoost實現
台灣大學機器學習:Ensemble 隨堂筆記
<EYD與機器學習>七:Ensemble Learning and Random Forests

TAG:機器學習 | 集成學習 |