集成學習(ensemble learning)基礎知識

集成學習(ensemble learning)基礎知識

寫在前面:
這是一篇只大體梳理集成學習(ensemble learning)基礎知識的博客,如果你已經對集成學習很熟悉了,完全可以跳過了。本博客爲周志華《機器學習》第8章集成學習的讀書筆記,雖有自己微小的理解補充,但大部分內容依然來自西瓜書。

集成學習系列博客:

  1. 集成學習(ensemble learning)基礎知識
  2. 隨機森林(random forest)

本科時粗淺的搞過一段時間的集成學習,當然正如前面所說,就真的是很粗淺的,今日再次溫故從而知新。集成學習以其強大的性能幾乎成爲各大數據挖掘比賽的必備之物了,集成學習用最簡答的話來描述,即:“三個臭皮匠,賽過諸葛亮”。這篇博客主要從以下幾個方面介紹集成學習:

  1. 什麼是集成學習
  2. 集成學習方法的分類
  3. 多樣性增強的幾種方法

一、什麼是集成學習

集成學習是通過構建並結合多個學習器來完成學習任務,如下圖所示,其過程是:先產生一組“個體學習器”,再用某種策略將它們結合起來。個體學習器一般就是我們常見的機器學習算法,比如:決策樹,神經網絡等。這裏集成一般有兩種:同質和異質。同質是指個體學習器全是同一類型,這種同質集成中的個體學習器又稱“基學習器”。異質是指個體學習器包含不同類型得學習算法,比如同時包含決策樹和神經網絡。一般我們常用的都是同質的,即個體學習器都是同一類型的。

集成學習通過將多個基學習器結合,通常都會獲得比單一學習器顯著優越的泛化性能。下面看個例子(例子來自周志華《機器學習》),來看看集成學習是如何獲得比最好的單一學習器更好的性能的。假定在一個二分類任務中,三個分類器在三個測試樣本上的表現如下圖所示,其中,hih_i表示第ii個分類器, 表示分類正確,××表示分類錯誤,集成的結果通過投票法產生(少數服從多數原則)。

在圖(a)中,能夠看出,每個基分類器都只有66%的準確率,但是集成後精讀達到了100%。而在圖(b)中,三個分類器沒有差別,集成後性能沒有提升,依然是66%。在圖(c)中,每個基分類器的準確率只有33%,集成後性能反而變得更糟,0%。從這個簡單的例子中,我們能夠得出:
要想獲得較好的集成性能,基分類器需要滿足兩個基本條件:

  • 基分類器要有一定的性能,至少不差於隨機猜測的性能,即基分類器準確率不低於50%。
  • 基學習器要具有多樣性,即基學習器間要有差異性,不能像上圖(b)中那樣,三個基分類器都一樣。提升集成學習性能主要通過這一條“多樣性”來做,因爲第一條很容易滿足。

以下內容爲可選,有興趣的看下即可,對公式頭大的直接略過也沒關係,證明參考:南瓜書PumpkinBook,我只是對其中每一步做了解釋。


西瓜書上還有一段證明,證明在基學習器誤差相互獨立的情況下,集成學習的錯誤率隨着基分類器數目的增大,呈指數下降,最終趨向於0。我們這裏順手證明下吧,對公式頭大的同學可以跳過了,只需記住結論即可。這也只是在理想情況下,即基學習器誤差相互獨立的情況下,在實際情況中顯然是不可能的。

證明:

證明之前先來看下 hoeffding inequality(懶得打公式了,直接放圖片,圖片來自:CS229 Supplemental Lecture notes Hoeffding’s inequality

下面開始證明,考慮二分類問題 y{1,+1}y \in \{-1, +1\}和真實函數ff,假定基分類器的錯誤率爲ϵ\epsilon,即對每個基分類器hih_i有:
P(hi(x)≠ f(x))=ϵ P(h_i(x) =\not\ f(x)) = \epsilon
假設通過簡單投票法結合TT個分類器,若有超過半數的基分類器正確,則集成分類就正確:
H(x)=sign(i=1Thi(x)) H(x) = sign(\sum_{i=1}^{T}h_i(x))
假設基分類器的錯誤率相互獨立,我們有:
P(H(x)≠ f(x))=k=0T/2(Tk)(1ϵ)kϵTk P(H(x) =\not\ f(x)) = \sum_{k=0}^{\left \lfloor T/2 \right \rfloor}\binom{T}{k}(1-\epsilon )^{k}\epsilon ^{T-k}
解釋下這個公式,ϵ\epsilon表示基分類器的錯誤率,則1ϵ1-\epsilon爲正確率。所以,集成學習分類錯誤的情況就是分錯的基分類器數量超過一半,也就是分對的基分類器數量少於一半,所以是T/2\left \lfloor T/2 \right \rfloor。假設 XXTT 個基分類器分類正確的次數,因爲是個二分類問題,又因爲做了多次(T個基分類器,每個看做拋一次硬幣),則隨機變量顯然服從二項分佈的(n重伯努利試驗),所以XB(T,1ϵ)X\sim B(T, 1-\epsilon),因此:

這裏來解釋下上面的公式,(1)(2)(1)\rightarrow (2)這一步無需多言了,就做了個縮放,目的是爲了把下取整去掉。(2)(3)(2)\rightarrow (3)要想用 hoeffding inequality,肯定還是要想往這個公式的形式上湊,從 hoeffding inequality 公式定義看,
P(1ni=0n(ZiE[Zi])t)P(\frac{1}{n}\sum_{i=0}^{n}(Z_i - \mathbb{E}[Z_i]) \leq -t),我們來做個變形(用ZZ表示Z1+Z2+...+ZnZ_1 + Z_2 +... + Z_n),P(ZE[Z])nt)P(Z - \mathbb{E}[Z]) \leq -nt),所以這一步纔會兩邊同時減去(1ϵ)T(1-\epsilon)T,這個就是正確次數的數學期望(概率乘總次數),這樣當t=(12ϵ)2t=\frac{(1-2\epsilon)}{2},就變成了 hoeffding inequality 的左邊,那麼直接用 hoeffding inequality ,則有:
P[X(1ϵ)TT2(12ϵ)]exp(12T(12ϵ)2) P[X - (1-\epsilon )T \leq -\frac{T}{2}(1-2\epsilon )] \leq exp(-\frac{1}{2}T(1-2\epsilon)^2)
也即:
P(H(x)≠ f(x))exp(12T(12ϵ)2) P(H(x) =\not\ f(x)) \leq exp(-\frac{1}{2}T(1-2\epsilon)^2)
因此,從上式能夠看出,當基分類器數量 T+T \rightarrow +\infty,則集成模型的錯誤率趨向於0。


二、集成學習方法的分類

關於集成學習常見的結合方法,目前大多數的資料(如 周志華《機器學習》,Pang-Ning Tan(陳封能)introduction to data mining等)把其分爲兩大類,第一類爲Boosting,這一類個體之間學習器之間存在強依賴關係,必須使用串行的方法去學習。另外一類爲Bagging,這一類方法個體學習器之間不存在強依賴關係,因此可用並行的方式去學習。關於Stacking方法要不要單獨分爲一類,我個人覺得可以把其分爲一類。大家要是用於學術論文等比較嚴謹的場合還是以西瓜書爲準,即分爲兩大類(boost和bagging),周老師把stacking方法歸到了結合策略中。我這裏把其分爲三類(依據見wiki:Ensemble learning),
即Boosting、Bagging和Stacking。

2.1 Bagging

Bagging的主要思想如下圖所示,首先從數據集中採樣出T個數據集,然後基於這T個數據集,每個訓練出一個基分類器,再講這些基分類器進行組合做出預測。Bagging在做預測時,對於分類任務,使用簡單的投票法。對於迴歸任務使用簡單平均法。若分類預測時出現兩個類票數一樣時,則隨機選擇一個。

從上面的圖中也能夠看出,Bagging非常適合並行處理,這對於大數據量下非常有好處。關於從原始數據集裏採樣出m個數據集,這裏要說下,我們希望能夠產生m個不同的子集,因爲這樣訓練出來的基分類器具有比較大的差異,滿足開頭所說的“多樣性”,有助於提高集成算法最終的性能。但是呢,又不能讓基分類器性能太差,比如我們採樣時,採樣出來的子集每個都完全不相同,這樣訓練出來的基分類器性能就比較差,因爲每個基分類器相當於只用了一小部分數據去訓練。因此,Bagging中採樣自助採樣法(bootstrap sampling)。

自助採樣法(bootstrap sampling)
這個其實就是有放回的採樣,每個採樣出來的樣本集都和原始數據集一樣大。假如給定包含m個樣本的數據集,我們先隨機取出一個樣本放入採樣集中,然後再把該樣本放回去,使得下次這個樣本還有可能被選中,這樣經過m次隨機採樣,我們得到包含m個樣本的採樣集,原始數據集中有的樣本在採樣集多次出現,有的則未出現。採樣集中大約包含63.2%的原始數據,因爲每個樣本被抽到的概率爲1m\frac{1}{m},則樣本在m次採樣中始終沒被採到的概率爲(11m)m(1-\frac{1}{m})^m,當mm \rightarrow \infty時,其極限爲1e0.368\frac{1}{e}\approx 0.368

從偏差-方差分解的角度看,Bagging主要關注降低方差

2.2 Boosting

與Bagging能夠並行處理不同,Boosting由於各基學習器之間存在強依賴關係,因此只能串行處理,也就是說Boosting實際上是個迭代學習的過程。Boosting的工作機制爲:先從初始訓練集中訓練出一個基學習器,再根據基學習器的表現對訓練樣本分佈進行調整(比如增大被誤分樣本的權重,減小被正確分類樣本的權重),使得先前基學習器做錯的樣本在後續的訓練過程中受到更多關注,然後基於調整後的樣本分佈來訓練下一個基學習器,如此重複,直到基學習器數目達到事先自定的值TT,然後將這TT個基學習器進行加權結合(比如錯誤率小的基學習器權重大,錯誤率大的基學習器權重小,這樣做決策時,錯誤率小的基本學習器影響更大)。Boosting算法的典型代表有AdaBoost和XGBoost。Boosting算法可以用下圖簡略形象的描述下:

從偏差-方差分解的角度看,Boosting主要關注降低偏差

2.3 Stacking

Stacking方法是先從初始數據集訓練出初級學習器,然後“生成”一個新的數據集用於訓練次級學習器。在這個新的數據集中,初級學習器的輸出被當做樣例輸入特徵,而初始樣本的標記仍然被當做樣例標記。其學習過程如下圖所示:

其算法僞代碼如下所示(截自周志華《機器學習》):

這裏有個需要注意的是,如果直接用初級學習器的訓練集來產生次級訓練集,則過擬合風險比較大。一般的處理辦法是使用交叉驗證來做,以k折交叉驗證爲例,初始訓練集DD被隨機劃分爲kk個大小相等的數據集D={D1,D2,...,Dk}D = \{D_1,D_2,...,D_k\},假設DjD_j表示第jj折的測試集,則Dj=DDj\overline{D_j}=D \setminus D_j表示第jj折的訓練集。給定TT個初級學習算法,初級學習器ht(j)h_t^{(j)}是第tt個學習器在Dj\overline{D_j}上學習而得。對DjD_j中每個樣本xix_i,令zit=ht(j)(xi)z_{it} = h_t^{(j)}(x_i),則由xix_i所產生的次級訓練樣本特徵爲zi=(zi1,zi2,...,ziT)z_{i} = (z_{i1},z_{i2},...,z_{iT}),label爲yiy_i。因此,在整個交叉驗證過程結束後,從這TT個初級學習器產生的次級訓練集是D={(zi,yi)}i=1mD' = \{(z_i,y_i)\}_{i=1}^m,然後將DD'用於訓練次級學習器。

stacking這個基本上在kaggle比賽裏是神器。。。

二、多樣性增強的幾種方法

在博客開頭也說過,想要提高集成算法的性能,基學習器多樣性是個很重要的。那麼到底該如何增強多樣性呢?一般的做法主要是對數據樣本,輸入屬性,輸出表示,算法參數進行擾動。

  • 數據樣本擾動
    這個其實主要就是採樣,比如在bagging中的自助採樣法,數據樣本擾動對決策樹,神經網絡這樣對數據樣本變化非常敏感的學習算法非常有效,但是對支持向量機,樸素貝葉斯,k近鄰這些對樣本擾動不敏感的算法沒用。對此類算法作爲基學習器進行集成時往往需要使用輸入屬性擾動等機制。

  • 輸入屬性擾動
    這個就是從樣本的特徵空間中產生不同的特徵子集。這樣訓練出來的基學習器必然是不同的。在包含大量冗餘屬性的數據,在特徵子集中訓練基學習器不僅能產生多樣性大的個體,還會因屬性數的減少而大幅節省時間開銷,同時,由於冗餘屬性多,減少一些冗餘屬性後訓練出來的基學習器性能也不會差。若數據只包含少量屬性,或者冗餘屬性少,則不適宜使用輸入屬性擾動法。

  • 輸出表示擾動
    這類做法的基本思路是對輸出表示進行操縱以增強多樣性。比如可對訓練樣本的label稍作變動,比如“翻轉法”隨機改變一些訓練樣本的標記;也可以對輸出表示進行轉化,如“輸出調製法”將分類輸出轉化爲迴歸輸出後構建基學習器。這一類貌似用的不多。

  • 算法參數擾動
    這個在現在深度學習比賽中很常見,主要是神經網絡有很多參數可以設置,不同的參數往往可以產生差別比較大的基學習器。

關於集成學習(ensemble learning)的基礎知識就介紹到,後面博客會相繼介紹隨機森林,AdaBoost,GBDT等具體的集成學習算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章