1. 程式人生 > >Machine Learning學習筆記(十四)整合學習(Boosting,Bagging,組合策略)

Machine Learning學習筆記(十四)整合學習(Boosting,Bagging,組合策略)

整合學習

在一些資料探勘競賽中,後期我們需要對多個模型進行融合以提高效果時,常常會用到Bagging,Boosting,Stacking等這幾個框架演算法。

整合學習在機器學習演算法中具有較高的準確率,不足之處就是模型的訓練過程可能比較複雜,效率不是很高。目前接觸較多的整合學習主要有2種:基於Boosting的和基於Bagging,前者的代表演算法有Adaboost、GBDT、XGBOOST、後者的代表演算法主要是隨機森林。


整合學習主要思想:利用一定的手段學習出多個分類器,而且這多個分類器要求是弱分類器,然後將多個分類器進行組合公共預測。核心思想就是如何訓練處多個弱分類器以及如何將這些弱分類器進行組合,個體分類器應該“好而不同”。

弱分類器如何選擇:一般採用弱分類器的原因在於將誤差進行均衡,因為一旦某個分類器太強了就會造成後面的結果受其影響太大,嚴重的會導致後面的分類器無法進行分類,常用的弱分類器可以採用誤差小於0.5的,比如邏輯斯蒂迴歸,SVM,神經網路等。

如何生成個體學習器:

(1)個體學習器間存在強依賴關係,必須序列生成的序列化方法,例如基於Boosting;

(2)個體學習器間不存在強依賴關係,可同時生成的並行化方法,例如基於Bagging和隨機森林。


Boosting演算法:

基本思想:先從初始訓練集上訓練一個基學習器,再根據基學習器的表現對訓練樣本分佈進行調整,使得先前基學習器做錯的訓練樣本在後續受到更多關注,然後基於調整後的樣本分佈來訓練下一個基學習器,如此反覆進行,直至基學習器數目達到實現指定的值T,最終將這T個基學習器進行加權結合。Boosting也是集合了多個決策樹,但是Boosting的每棵樹是順序生成的,每一棵樹都依賴於前一顆樹。順序執行會導致執行速度慢

Boosting有很多種,比如AdaBoost(Adaptive Boosting), Gradient Boosting等,這裡以AdaBoost,Gradient Boosting為典型講下。

(1)Adaboost演算法

基本思想:AdaBoost,運用了迭代的思想。每一輪都加入一個新訓練一個預測函式,直到達到一個設定的足夠小的誤差率,或者達到最大的樹的數目。

演算法流程:

①開始的時候每一個訓練樣本都被賦予一個初始權重,用*所有樣本*訓練第一個預測函式。計算該預測函式的誤差,然後利用該誤差計算訓練的預測函式的權重係數(該預測函式在最終的預測函式中的權重,此處忽略公式)。接著利用誤差更新樣本權重(此處忽略公式)。如果樣本被錯誤預測,權重會增加;如果樣本被正確預測,權重會減少

。通過權重的變化,使下輪的訓練器對錯誤樣本的判斷效果更好。

②以後每輪訓練一個預測函式。根據最後得出的預測函式的誤差計算新訓練的預測函式在最終預測中的權重,然後更新樣本的權重。權重更新之後,所有樣本用於下輪的訓練。

③如此迭代,直到誤差小於某個值或者達到最大樹數。

這裡涉及到兩個權重,每輪新訓練的預測函式在最終預測函式中所佔的權重和樣本下一輪訓練中的權重。這兩個權重都是關於 每輪訓練的預測函式產生的誤差 的函式。

Adaboost的演算法: 
假設訓練資料集為T={(X1,Y1),(X2,Y2),(X3,Y3),(X4,Y4),(X5,Y5)} 其中Yi={-1,1}

1、初始化訓練資料的分佈  
訓練資料的權重分佈為D={W11,W12,W13,W14,W15},其中W1i=1/N。即平均分配。

2、選擇基本分類器  
這裡選擇最簡單的線性分類器y=aX+b ,分類器選定之後,最小化分類誤差可以求得引數。

3、計算分類器的係數和更新資料權重  
誤差率也可以求出來為e1.同時可以求出這個分類器的係數。基本的Adaboost給出的係數計算公式為 
這裡寫圖片描述 
上面求出的am就是這個分類器在最終的分類器中的權重。然後更新訓練資料的權重分佈。如果樣本被錯誤預測,權重會增加;如果樣本被正確預測,權重會減少。 
總而言之:Boosting每次迭代迴圈都是利用所有的訓練樣本,每次迭代都會訓練出一個分類器,根據這個分類器的誤差率計算出該分類器的在最終的分類器中的權重,並且更新訓練樣本的權重。這就使得每次迭代訓練出的分類器都依賴上一次的分類器,序列速度慢。 
Boosting最終的組合弱分類器方式: 
通過加法模型將弱分類器進行線性組合,比如AdaBoost通過加權多數表決的方式,即增大錯誤率小的分類器的權值,同時減小錯誤率較大的分類器的權值。 
這裡寫圖片描述

(2)

 

這裡寫圖片描述

 

簡單理解上面流程,其中N為樣本個數,M為樹的數目。其中(a),(b),(c)步驟表示根據梯度計算出下一棵樹以及下一棵樹在組合中的權重。 
注意:這裡寫圖片描述是損失函式對f(x)求偏導,並不是對x求偏導。

Gradient Boost與傳統的Boost的區別是,Gradient Boost會定義一個loassFunction,每一次的計算是為了減少上一次的loss,而為了消除loss,我們可以在loss減少的梯度(Gradient)方向上建立一個新的模型。所以說,在Gradient Boost中,每個新的模型的建立是為了使得之前模型的loss往梯度方向減少,與傳統Boost對正確、錯誤的樣本進行加權有著很大的區別。


Bagging演算法

(1)基本思想:自助取樣法,給定包含m個樣本的資料集,隨機取出一個樣本放入取樣集中,再把該樣本放回初始資料集,這樣經過m次隨機取樣操作,可以得到含m個樣本的取樣集。照這樣,可以取樣出T個含m個訓練樣本的取樣集,然後基於每個取樣集訓練出一個基學習器,再將這些基學習器進行結合。結合時對多分類任務使用簡單投票法,對迴歸任務使用簡單平均法。

(2)優點: a.訓練一個Bagging整合與直接使用基學習演算法訓練一個學習器的複雜度同階,高效;b.標準的AdaBoost只適用於二分類,Bagging能直接用於多分類,迴歸等任務;c.因為自助取樣,每個基學習器只使用了出事訓練集中約63.2%的樣本,剩下的樣本可以用作驗證集等等。

(3) 特點:關注降低方差,在易受樣本擾動的學習器上效用更為明顯。

(4)隨機森林演算法(RandomForest,簡稱RF)

基本思想:RF在以決策樹為基學習器構建Bagging整合的基礎上,進一步在決策樹的訓練過程中引入了隨機屬性選擇。(即先從節點的屬性集合M中隨機選擇一個包含k個屬性的子集,然後再從這個子集中選擇一個最優屬性用於劃分,一般k遠小於M,取k= )

特點:兩個隨機過程避免了過擬合現象的出現(一是輸入資料是隨機的從整體的訓練資料中選取一部分作為一棵決策樹的構建,而且是有放回的選取,第二個是隨即特徵的選取)。

過程:a. 從訓練資料中選取n個數據作為訓練資料輸入,有放回的選取,這樣會造成一部分資料無法被取到,這部分資料被稱為袋外資料,可以使用其做誤差估計;b.選取了輸入的訓練資料之後,需要構建決策樹,隨機選取k個特徵;c.構造決策時,按照選取最小的基尼指數進行分裂節點的選取進行決策樹的構建,直到該節點所有訓練樣例都屬於同一類或達到樹的最大深度;d,重複b、c,得到隨機森林;e. 多數投票進行決策。

注意點:不需要剪枝,構建決策樹時分裂點的選擇是依據最小基尼係數的。

基尼係數:

優點:1.兩個隨機性的引入使得隨機森林不容易陷入過擬合還具有很好的抗噪聲能力;2.容易做成並行化方法;3.實現簡單;4.能夠處理高緯度的資料,並且不需要做特徵選擇。

缺點:對噪聲敏感。

如何在隨機森林中避免出現過擬合?1.對樹的深度進行控制;2.把模型訓練比較複雜,看合併節點後的子樹能否降低泛化誤差。

對於Bagging需要注意的是,每次訓練集可以取全部的特徵進行訓練,也可以隨機選取部分特徵訓練,例如隨機森林就是每次隨機選取部分特徵

講完Boosting,Bagging,我們來總結下這兩種框架演算法的異同點: 

1)樣本選擇上: 
Bagging:訓練集是在原始集中有放回選取的,從原始集中選出的各輪訓練集之間是獨立的。

Boosting:每一輪的訓練集不變,只是訓練集中每個樣例在分類器中的權重發生變化。而權值是根據上一輪的分類結果進行調整。

2)樣例權重:

Bagging:使用均勻取樣,每個樣例的權重相等

Boosting:根據錯誤率不斷調整樣例的權值,錯誤率越大則權重越大。

3)預測函式:

Bagging:所有預測函式的權重相等。

Boosting:每個弱分類器都有相應的權重,對於分類誤差小的分類器會有更大的權重。

4)平行計算:

Bagging:各個預測函式可以並行生成

Boosting:理論上各個預測函式只能順序生成,因為後一個模型引數需要前一輪模型的結果。計算角度來看,兩種方法都可以並行。bagging, random forest並行化方法顯而意見。boosting有強力工具stochastic gradient boosting

5)bagging是減少variance,而boosting是減少bias 
在機器學習中,我們用訓練資料集去訓練(學習)一個model(模型),通常的做法是定義一個Loss function(誤差函式),通過將這個Loss(或者叫error)的最小化過程,來提高模型的效能(performance)。然而我們學習一個模型的目的是為了解決實際的問題(或者說是訓練資料集這個領域(field)中的一般化問題),單純地將訓練資料集的loss最小化,並不能保證在解決更一般的問題時模型仍然是最優,甚至不能保證模型是可用的。這個訓練資料集的loss與一般化的資料集的loss之間的差異就叫做generalization error。而generalization error又可以細分為Bias和Variance兩個部分。 

error=Bias+Variance 
這裡寫圖片描述 
可以通過降低Bias或者降低Variance來減小error

Bagging對樣本重取樣,對每一重取樣得到的子樣本集訓練一個模型,最後取平均。由於子樣本集的相似性以及使用的是同種模型,因此各模型有近似相等的bias和variance(事實上,各模型的分佈也近似相同,但不獨立)。由於這裡寫圖片描述,所以bagging後的bias和單個子模型的接近,一般來說不能顯著降低bias。另一方面,若各子模型獨立,則有這裡寫圖片描述,此時可以顯著降低variance。若各子模型完全相同,則這裡寫圖片描述,此時不會降低variance。bagging方法得到的各子模型是有一定相關性的,屬於上面兩個極端狀況的中間態,因此可以一定程度降低variance。為了進一步降低variance,Random forest通過隨機選取變數子集做擬合的方式de-correlated了各子模型(樹),使得variance進一步降低。boosting從優化角度來看,是用forward-stagewise這種貪心法去最小化損失函式這裡寫圖片描述。例如,常見的AdaBoost即等價於用這種方法最小化exponential loss:這裡寫圖片描述。所謂forward-stagewise,就是在迭代的第n步,求解新的子模型f(x)及步長a(或者叫組合係數),來最小化這裡寫圖片描述,這裡這裡寫圖片描述是前n-1步得到的子模型的和。因此boosting是在sequential地最小化損失函式,其bias自然逐步下降。但由於是採取這種sequential、adaptive的策略,各子模型之間是強相關的,於是子模型之和並不能顯著降低variance。所以說boosting主要還是靠降低bias來提升預測精度。  
6)Bagging裡面每個分類器是強分類器,因為他降低的是方差,方差過高需要降低是過擬合。

      boosting裡面每個分類器是弱分類器,因為他降低的是偏差,偏差過高是欠擬合。

組合策略

為什麼要結合學習器:(1)統計方面,由於假設空間往往很大,可能有多個假設在訓練集上達到同等效能。此時若使用單學習器可能因誤選導致泛化效能不佳;(2)計算方面,單個學習演算法容易陷入區域性極小;(3)表示方面,某些學習任務的真實假設可能不在當前學習演算法的假設空間,此時使用多個學習器擴大假設空間。

 

演算法:平均法(加權(個體學習器效能相差較大),簡單(效能相近)),投票法(絕對多數(超過半數標記。否則拒絕預測),相對多數,加權投票),學習法(通過另一個學習器來進行結合,Stacking演算法

Stacking演算法:

基本思想:先從初始資料集訓練出初級學習器,然後生成一個新資料集用於訓練次級學習器。在這個新資料集中,初級學習器的輸出被當作樣例輸入特徵,而出事樣本的標記仍被當作樣例標記。

注意點:若直接用初級學習器的訓練集來產生次級訓練集,則過擬合風險會比較大;一般會通過交叉驗證等方式,用訓練初級學習器未使用的樣本來產生次級學習器的訓練樣本。

 

 

如何增強整合學習的多樣性?

(1)     資料樣本擾動(基於取樣法,給定初始資料集,可以產生不同的資料子集,例如Bagging的自助取樣,AdaBoost的序列取樣),適合不穩定的基學習器(決策樹,神經網路等)。

(2)     輸入屬性擾動(不同的屬性子集提供了觀察資料的不同視角),適合於冗餘屬性多的資料集。

(3)     輸出表示擾動(對訓練樣本的類標記稍作變動或者對輸出表示進行轉化)

(4)     演算法引數擾動(修改基學習器的引數,如神經網路層數等等)。

參考連結

[1]:https://blog.csdn.net/cppjava_/article/details/68485565