集成學習—Boosting、Bagging

集成學習

集成學習(ensemble learning)通過構建並結合多個學習器來完成學習任務,有時也被稱爲多分類器系統(multi-classifier system).
如下圖,集成學習的一般結構是:先產生一組“個體學習器”(individual learner),再用某種策略將它們結合起來。
        

個體學習器通常是用一個現有的學習算法從訓練數據產生,例如C4.5決策樹算法、BP神經網絡算法等。此時集成中只包含同種類型的個體學習器,例如“決策樹集成”中的個體學習器全是決策樹,“神經網絡集成”中就全是神經網絡,這樣的集成是“同質”(homogeneous)的,同質集成中的個體學習器也稱爲“基學習器”(base learner),相應的學習算法稱爲“基學習算法”(base learning algorithm)。有同質就有異質(heterogeneous),若集成包含不同類型的個體學習器,例如同時包含決策樹和神經網絡,那麼這時個體學習器一般不稱爲基學習器,而稱作“組件學習器”(component leaner)或直接稱爲個體學習器。

而根據個體學習器生成方式的不同,目前集成學習方法大致可分爲兩大類,即個體學習器間存在強依賴關係、必須串行生成的序列化方法,以及個體學習器間不存在強依賴關係、可同時生成的並行化方法;前者的代表是Boosting,後者的代表是和Bagging和“隨機森林”(Random Forest)。

1、Boosting

Boosting, 也稱爲增強學習或提升法,是一種重要的集成學習技術, 能夠將預測精度僅比隨機猜度略高的弱學習器增強爲預測精度高的強學習器,

Boosting是一族可將弱學習器提升爲強學習器的算法。這族算法的工作機制類似:先從初始訓練集訓練出一個基學習器,再根據基學習器的表現對訓練樣本分佈進行調整,使得先前基學習器做錯的訓練樣本在後續受到更多的關注,(通過改變訓練樣本的概率分佈,提高前一輪弱分類器的分類錯誤的樣本權重,降低正確分類的樣本權重)然後基於調整後的樣本分佈來訓練下一個基學習器;如此重複進行,直至基學習器數目達到預先指定的值T,最終將這T個基學習器進行加權結合。在產生單個的基分類器時可用相同的分類算法,也可用不同的分類算法,這些算法一般是不穩定的弱分類算法,如神經網絡(BP) ,決策樹(C4.5)等。

Boosting算法要求基學習器對特定的數據分佈進行學習,這一點是通過“重賦權法”(re-weighting)實現的,即在訓練過程的每一輪中,根據樣本分佈爲每個訓練樣本重新賦予一個權重,對無法接受代全樣本的基學習算法,則可通過“重採樣法”(re-sampling)來處理,即在每一輪學習中,根據樣本分佈對訓練集重新進行採樣,再用重採樣而得到的樣本集對基學習器進行訓練。一般而言,這兩種做法沒有顯著的優劣差別。不過由於Boosting算法在訓練的每一輪都會檢查當前生成的基學習器的是否滿足基本條件,若不符合則拋棄當前基學習器,並停止學習過程。在此種情況下,初始設置的學習輪數T也許還遠未達到,這會導致最後的集成中只包含很少的基學習器而性能不佳。而若採用“重採樣法”,則可以獲得“重啓動”機會以避免訓練過程的過早停止,即在拋棄不滿足條件的當前基學習器之後,再根據當前分佈重新對訓練樣本進行重採樣,再基於新的採樣結果重新訓練出基學習器,從而使得學習過程可以持續到預設的T輪完成。

而從偏差-方差分解的角度看,Boosting主要關注降低偏差(避免欠擬合),仔細想想便可理解,因爲boosting算法每個分類器都是弱分類器,而弱分類器的特性就是high-bias & low variance(高偏差-低方差),其與生俱來的優點就是泛化性能好。因此,將多個算法組合起來之後,可以達到降偏差的效果,進而得到一個偏差小、方差小的泛化能力好的模型。因此Boosting能基於泛化性能相當弱的學習器構建出很強的集成。

Boosting也是集合了多個決策樹,但是Boosting的每棵樹是順序生成的,每一棵樹都依賴於前一顆樹。順序運行會導致運行速度慢

1.1、AdaBoost

AdaBoost算法是模型爲加法模型、損失函數爲指數函數、學習算法爲前向分步算法時的二類分類學習方法。

AdaBoost是adaptive boosting( 自適應增強 )的縮寫,其運行過程如下:

  訓練數據中的每個樣本,並賦予其一個權重,這些權重構成了向量D,一開始,這些權重都初始化成相等值。首先在訓練數據上訓練出一個若分類器並計算該分類器的錯誤率,然後在同一數據集上再次訓練弱分類器。在分類器的第二次訓練中,將會重新調整每個樣本的權重,其中第一次分對的樣本的權重將會降低,而第一次分錯的樣本的權重將會提高。爲了從所有弱分類器中得到最終的分類結果,AdaBoost爲每個分類器都分配了一個權重值alpha,這些alpha值是基於每個弱分類器的錯誤率進行計算的。 計算出alpha值之後,可以對權重向量D進行更新,以使得那些正確分類的樣本的權重降低而錯分樣本的權重升高。AdaBoost算法會不斷地重複訓練和調整權重的過程,直到訓練錯誤率爲0或弱分類器的數目達到指定值爲止。

算法思想:

關於Adaboost,它是boosting算法,從bias-variance(偏差-方差)的角度來看,boosting算法主要關注的是降低偏差。仔細想想便可理解,因爲boosting算法每個分類器都是弱分類器,而弱分類器的特性就是high-bias & low variance(高偏差-低方差),其與生俱來的優點就是泛化性能好。因此,將多個算法組合起來之後,可以達到降偏差的效果,進而得到一個偏差小、方差小的泛化能力好的模型。另外,Adaboost的損失函數是指數損失L(y,f(x))=e^{-yf(x)} 。

具體說來,整個Adaboost 迭代算法就3步:

  • 第一步:初始化訓練數據的權值分佈。如果有N個樣本,則每一個訓練樣本最開始時都被賦予相同的權值:1/N。
  • 第二步:訓練弱分類器。迭代M次,每次都根據錯誤率e m 不斷修改訓練數據的權值分佈(此處需要確保弱學習器的錯誤率e小於0.5,因爲二分類問題隨機猜測的概率是0.5),樣本權值更新規則爲增加分類錯誤樣本的權重,減少分類正確樣本的權重;
  • 第三步:根據每個弱分類器器的係數α m ,將M個弱分類器組合成強分類器。各個弱分類器的訓練過程結束後,加大分類誤差率小的弱分類器的權重,使其在最終的分類函數中起着較大的決定作用,而降低分類誤差率大的弱分類器的權重,使其在最終的分類函數中起着較小的決定作用。換言之,誤差率低的弱分類器在最終分類器中佔的權重較大,否則較小。

AdaBoost算法流程:

(1)初始化訓練數據的權值分佈,每一個訓練樣本最開始時都被賦予相同的權值:1/N。

                                     D_1 = (w_{11},w_{12},...w_{1N}),w_{1i} = \frac{1}{N},i=1,2,...,N   

(2)對m=1,2,...,M

  (a)使用具有權值分佈D m的訓練數據集學習,得到基本分類器(選取讓誤差率最低的閾值來設計基本分類器):

                                     G_m(x):\chi \rightarrow \begin{Bmatrix} -1,+1 \end{Bmatrix}

  (b)計算第m次分類器G m (x)在訓練數據集上的分類誤差率

                                     e_m = P(G_m(X_i) \neq y_i ) = \sum_{i=1}^{N} w_{mi}I(G_m(x_i) \neq y_i)
    e m = 未正確分類的樣本數目/所有樣本數目

  (c)計算第m次分類器G m (x)的係數

                                    \alpha_m = \frac{1}{2}log \frac{1-e_m}{e_m}
由上式可知,a m 隨着e m 的減小而增大,意味着分類誤差率越小的基本分類器在最終分類器中的作用越大。

  (d)更新訓練數據集的權值分佈(目的:得到樣本的新的權值分佈),用於下一輪迭代,使得被基本分類器Gm(x)誤分類樣本的權值增大,而被正確分類樣本的權值減小。就這樣,通過這樣的方式,AdaBoost方法能“重點關注”或“聚焦於”那些較難分的樣本上。
                                     D_{m+1}= (w_{m+1},w_{m+1,2},...w_{m+1,N})

                                    w_{m+1,i} = \frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i)),i=1,2,...,N           
    其中,Z m 是規範化因子,使得D m +1成爲一個概率分佈:

                                          Z_m = \sum_{i=1}^{N}w_{mi}exp(- \alpha_my_iG_m(x_i))
  ;通過簡化,可把上述的更新權值公式簡化爲:
    * 正確分類時:  w_{2i} = \frac{w_{1i}}{2(1-e_m)} 
    * 錯誤分類時:w_{2i} = \frac{w_{1i}}{2e_m} 

(3)構建基本分類器的線性組合

                                    f(x) = \sum_{m=1}^{M}\alpha_mG_m(x)
     得到最終分類器:

                                    G(x) = sign(f(x)) = sign(\sum_{m=1}^M \alpha_mG_m(x))

公式推導過程詳見鏈接

AdaBoost最基本的性質是能在學習過程中不斷減少訓練誤差(訓練誤差以指數速率下降),即在訓練數據集上的分類誤差率。

AdaBoost的優點和缺點:

優點:

  •  (1)Adaboost提供一種框架,在框架內可以使用各種方法構建子分類器。可以使用簡單的弱分類器,不用對特徵進行篩選,也不存在過擬合的現象。
  •  (2)Adaboost算法不需要弱分類器的先驗知識,最後得到的強分類器的分類精度依賴於所有弱分類器。無論是應用於人造數據還是真實數據,Adaboost都能顯著的提高學習精度。
  •  (3)Adaboost算法不需要預先知道弱分類器的錯誤率上限,且最後得到的強分類器的分類精度依賴於所有弱分類器的分類精度,可以深挖分類器的能力。Adaboost可以根據弱分類器的反饋,自適應地調整假定的錯誤率,執行的效率高。
  •  (4)Adaboost對同一個訓練樣本集訓練不同的弱分類器,按照一定的方法把這些弱分類器集合起來,構造一個分類能力很強的強分類器,即“三個臭皮匠賽過一個諸葛亮”。
     

缺點:

  •  在Adaboost訓練過程中,Adaboost會使得難於分類樣本的權值呈指數增長,訓練將會過於偏向這類困難的樣本,導致Adaboost算法易受噪聲干擾。此外,Adaboost依賴於弱分類器,而弱分類器的訓練時間往往很長。

1.2、GBDT

原理

GBDT與傳統的Boosting區別較大,它的每一次計算都是爲了減少上一次的殘差,而爲了消除殘差,我們可以在殘差減小的梯度方向上建立模型,所以說,在GradientBoost中,每個新的模型的建立是爲了使得之前的模型的殘差往梯度下降的方法,與傳統的Boosting中關注正確錯誤的樣本加權有着很大的區別。

在GradientBoosting算法中,關鍵就是利用損失函數的負梯度方向在當前模型的值作爲殘差的近似值,進而擬合一棵CART迴歸樹。

GBDT的會累加所有樹的結果,而這種累加是無法通過分類完成的,因此GBDT的樹都是CART迴歸樹,而不是分類樹。

優缺點:

GBDT的性能在RF的基礎上又有一步提升,因此其優點也很明顯,1、它能靈活的處理各種類型的數據;2、在相對較少的調參時間下,預測的準確度較高。

當然由於它是Boosting,因此基學習器之前存在串行關係,難以並行訓練數據。

1.3、XGBoost

原理

XGBoost的性能在GBDT上又有一步提升,而其性能也能通過各種比賽管窺一二。坊間對XGBoost最大的認知在於其能夠自動地運用CPU的多線程進行並行計算,同時在算法精度上也進行了精度的提高。

由於GBDT在合理的參數設置下,往往要生成一定數量的樹才能達到令人滿意的準確率,在數據集較複雜時,模型可能需要幾千次迭代運算。但是XGBoost利用並行的CPU更好的解決了這個問題。

其實XGBoost和GBDT的差別也較大,這一點也同樣體現在其性能表現上,詳見XGBoost與GBDT的區別。

GBDT和XGBoost區別:

  • 傳統的GBDT以CART樹作爲基學習器,XGBoost還支持線性分類器,這個時候XGBoost相當於L1和L2正則化的邏輯斯蒂迴歸(分類)或者線性迴歸(迴歸);
  • 傳統的GBDT在優化的時候只用到一階導數信息,XGBoost則對代價函數進行了二階泰勒展開,得到一階和二階導數;
  • XGBoost在代價函數中加入了正則項,用於控制模型的複雜度。從權衡方差偏差來看,它降低了模型的方差,使學習出來的模型更加簡單,放置過擬合,這也是XGBoost優於傳統GBDT的一個特性;
  • shrinkage(縮減),相當於學習速率(XGBoost中的eta)。XGBoost在進行完一次迭代時,會將葉子節點的權值乘上該係數,主要是爲了削弱每棵樹的影響,讓後面有更大的學習空間。(GBDT也有學習速率);
  • 列抽樣。XGBoost借鑑了隨機森林的做法,支持列抽樣,不僅防止過 擬合,還能減少計算;
  • 對缺失值的處理。對於特徵的值有缺失的樣本,XGBoost還可以自動 學習出它的分裂方向;
  • XGBoost工具支持並行。Boosting不是一種串行的結構嗎?怎麼並行 的?注意XGBoost的並行不是tree粒度的並行,XGBoost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數裏包含了前面t-1次迭代的預測值)。XGBoost的並行是在特徵粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(因爲要確定最佳分割點),XGBoost在訓練之前,預先對數據進行了排序,然後保存爲block結構,後面的迭代 中重複地使用這個結構,大大減小計算量。這個block結構也使得並行成爲了可能,在進行節點的分裂時,需要計算每個特徵的增益,最終選增益最大的那個特徵去做分裂,那麼各個特徵的增益計算就可以開多線程進行。

 

2、Bagging 

由Boosting內容可知,要想獲得泛化性能強的集成,集成中的個體學習器應儘可能相互獨立。而“獨立”在現實任務中比較難以做到,不過我們可以設法使基學習器儘可能具有較大的差異。給定一個訓練集,一種可能的做法是對訓練樣本進行採樣,產生出若干個不同的子集,再從每個數據子集中訓練出一個基學習器,這樣,由於訓練數據不同,我們獲得的基學習器可望具有比較大的差異。然而,爲獲得好的集成,我們同時希望個體學習器不能太差。如果採樣出的每個子集都完全不同,則每個基學習器只用到了一小部分訓練數據,那甚至不能進行有效的學習,更不談確保產生比較好的基學習器了。於是,爲了解決這個問題,我們使用相互有交疊的採樣子集

Bagging是 並行式集成學習 方法最著名的代表,它基於前面提到過的自助採樣法(bootstrap sampling)。給定包含m個樣本的數據集,我們先隨機取出一個樣本放入採樣集中,再把該樣本放回初始數據集,使得下次採樣時該樣本仍有可能被選中,這樣,經過m此隨機採樣操作,我們得到含m個樣本的採樣集,初始訓練集中有的樣本在採樣集裏多次出現,有的則從未出現。初始訓練集中越有63.2%的樣本出現在採樣集中。(有放回的隨機採樣)

於是,我們可以採樣出T個含m個訓練樣本的採樣集,然後基於每個採樣集訓練出一個基學習器,再集成,這就是Bagging的基本流程。在對預測輸出進行結合時,Bagging通常對分類任務採用簡單投票法,對迴歸任務使用簡單平均法。若分類預測時出現兩個類收到同樣票數的情形,則最簡單的做法是隨機選擇一個,也可進一步考察學習器投票的置信度來確定最終勝者。

  • 包外估計(out-of-bag estimate):
      Bagging的自助採樣做法爲Bagging帶來一個優點是:由於每個基學習器只使用了初始訓練集中大約63.2%的樣本,剩下的約36.8%的樣本則可用作驗證集來對泛化性能進行“包外估計”。
    從偏差-方差分解的角度看,Bagging主要關注降低方差(防止過擬合),因此它在不剪枝決策樹、神經網絡等容易受樣本擾動的學習器上效用更爲明顯。

與標準AdaBoost只適用於二分類任務不同(爲處理多分類或迴歸任務,AdaBoost需進行修改),Bagging能不經修改的用於多分類、迴歸等任務。

2.1、隨機森林

隨機森林(Random Forest,簡稱RF)是Bagging的一個擴展變體。其在以決策樹作爲基學習器構建Bagging集成的基礎上,進一步在決策樹的訓練過程中引入了隨機特徵選擇。 因此可以概括RF包括四個部分:1、隨機選擇樣本(放回抽樣);2、隨機選擇特徵;3、構建決策樹;4、隨機森林投票(平均)。

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

在構建決策樹的時候,RF的每棵決策樹都最大可能的進行生長而不進行剪枝;在對預測輸出進行結合時,RF通常對分類問題使用簡單投票法,迴歸任務使用簡單平均法。

RF的重要特性是不用對其進行交叉驗證或者使用一個獨立的測試集獲得無偏估計,它可以在內部進行評估,也就是說在生成的過程中可以對誤差進行無偏估計,由於每個基學習器只使用了訓練集中約63.2%的樣本,剩下約36.8%的樣本可用做驗證集來對其泛化性能進行“包外估計”。

RF和Bagging對比:  

RF的收斂性與Bagging相似。隨機森林的起始性能往往相對較差,特別是在集成中只包含一個基學習器時,這很容易理解,因爲通過引入屬性擾動,隨機森林中個體學習器的性能往往有所降低。然而,隨着個體學習器數目的增加,隨機森林通常會收斂到更低的泛化誤差。值得一提的是,隨機森林的訓練效率常優於Bagging,因爲在個體決策樹的構建過程中,Bagging使用的是“確定型”決策樹,在選擇劃分屬性時要對結點的所有屬性進行考察,而隨機森林使用的“隨機型”決策樹則只需考察一個屬性子集。

優缺點:

隨機森林的優點較多,簡單總結:

  • 1、在數據集上表現良好,相對於其他算法有較大的優勢(訓練速度、預測準確度);
  • 2、能夠處理很高維的數據,並且不用特徵選擇,而且在訓練完後,給出特徵的重要性(可用於特徵選擇);
  • 3、容易做成並行化方法。

RF的缺點:在噪聲較大的分類或者回歸問題上會過擬合。

 

3、Boosting與Bagging對比

bagging算法只能改善模型高方差(high variance)情況,Boosting算法對同時控制偏差(bias)和方差都有非常好的效果,而且更加高效

 

 

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