聲明:本文用到的代碼均來自於PRTools(http://www.prtools.org)模式識別工具箱,並以matlab軟件進行實驗。
(1)在介紹Bagging和Boosting算法之前,首先要簡單了解什么是集成學習?
集成學習(Ensemble Learning)是目前模式識別與機器學習中常用的一種學習算法,是使用一系列的學習器(分類器)通過某種規則(投票法、加權投票等)將各分類器的學習結果進行融合,達到比單學習器識別效果更好地目的。
可以打一個簡單的比喻,如果我們將“學習器”看做是一個“人”,現在我們需要進行的任務是識別漢字。一個人的識別內容終歸是有限的,但是如果我們現在利用三個人來識別,同一個字當A識別錯誤時,B、C識別正確,最終以少數服從多數的原則取BC的識別結果,那么相比較只用A一個人來識別漢字的情況,我們的准確率會大大提升。當然也許這里有人會存在疑問:萬一A本身是一個很有文化的人,B是一個不識字的人,那么叫他們兩個一起識別漢字豈不是會拉低整體識別率么?這里也就牽扯到了學習器與學習器之間差異性度量的話題,這個話題在本文中不詳細講述,有興趣的朋友可以自己查詢了解,最白話的解釋就是:參與集成學習的學習器們需要具有一定的差異值,既不能完全相同,也不能差異的太大。
在淺顯的理解何為集成學習之后,我們來講Bagging和Boosting,事實上這是兩種非常重要的集成方法。
(2)Bagging
該算法在模式識別工具箱中的使用方法為:
W = baggingc (A,CLASSF,N,ACLASSF,T) INPUT A Training dataset. CLASSF The base classifier (default: nmc) N Number of base classifiers to train (default: 100) ACLASSF Aggregating classifier (default: meanc), [] for no aggregation. T Tuning set on which ACLASSF is trained (default: [], meaning use A) OUTPUT W A combined classifier (if ACLASSF was given) or a stacked classifier (if ACLASSF was []).
以上是PRtools工具箱中bagging的使用說明。
其中:A是訓練數據集,其類型是dataset。
CLASSF是基學習器的訓練算法,該工具箱中涵蓋多種分類器的算法,比較常用的有nmc(最近鄰)、treec(決策樹)等等。
N是學習器數目,即要訓練多少個分類器做最終的集成,默認值100.
ACLASSF是指集成規則,可選的參數有meanc\prodc\medianc\maxc\minc\votec\,其中默認參數為meanc,但是比較常用的規則還是votec投票法
T是指訓練集成規則的參數,像投票法是不需要訓練的,因為默認該值為[]。
以上內容是直接從工具箱中bagging方法的應用角度來介紹,接下來要從原理方面講述。
Bagging算法的全稱應該是Bootstrap aggregating。
它有兩個步驟組成:Bootstrap和aggregating。
所謂基分類器,指的是參與集成的個體分類器,某一種分類算法加以實現后(可以理解為一個函數,輸入是特征數據,輸出是判斷的類別)就是一個分類器。
Boostrap方法是有放回的抽樣,即從初始訓練集中有放回可重復的隨機取出N條數據(這個值需要事先設定,可以是初始數據集的80%、70%都隨意)組成新的數據集,假如我們現在要訓練100個分類器,那么就取出100組數據集分別進行訓練,即要訓練100輪。因為每次訓練的數據集是不同的,所以訓練出的分類器也存在差異。這樣我們就得到了100個預測函數序列h1,…,h100。
另一個步驟就是集成,通常用的是投票法。
因此這里主要記住的就是Bagging中分類器的生成方式,當然訓練分類器的算法往往有穩定和不穩定兩類,通常是使用不穩定的學習算法,因為不穩定的學習算法可以因為數據集微小的變化而導致結果的改變,因此有助於我們生成若干具有一定差異性的分類器集合。
一個例子:
在二維數據中,使用不同的訓練算法時的集成效果
clc,clear; A=gendath([50 50]); [C,D]=gendat(A,[20 20]); W1=baggingc(C,qdc); %quadratic W2=baggingc(C,ldc); %linear W3=baggingc(C,knnc); W4=baggingc(C,treec); disp([testc(D*W1), testc(D*W2), testc(D*W3), testc(D*W4)]); scatterd(A); plotc({W1,W2,W3,W4 });
(3)Boosting
該算法在模式識別工具箱中的使用方法為:
[W,V,ALF] = adaboostc(A,CLASSF,N,RULE,VERBOSE); INPUT A Dataset CLASSF Untrained weak classifier N Number of classifiers to be trained RULE Combining rule (default: weighted voting) VERBOSE Suppress progress report if 0 (default) OUTPUT W Combined trained classifier V Cell array of all classifiers Use VC = stacked(V) for combining ALF Weights
其參數多數和baggingc很像:
A是訓練數據集,其類型是dataset。
CLASSF是基學習器的訓練算法。
N是學習器數目。
ACLASSF是指集成規則,其中默認參數為加權投票法。
Boosting主要是Adaboost(Adaptive Boosting),它與Bagging的不同在於他將權重賦予每個訓練元組,生成基分類器的過程為迭代生成。每當訓練生成一個分類器M(i)時要進行權重更新,使得M(i+1)更關注被M(i)分類錯誤的訓練元組。最終提升整體集合的分類准確率,集成規則是加權投票,每個分類器投票的權重是其准確率的函數。
繼續詳細介紹的話,假設數據集D,共有d類。(X1,Y1)…(Xd,Yd),Yi是Xi的類標號,假設需要生成k的分類器。其步驟為:
1、對每個訓練元組賦予相等的權重1/d。
2、for i=1:k
從D中進行有放回的抽樣,組成大小為d的訓練集Di,同一個元組可以被多次選擇,而每個元組被選中的幾率由權重決定。利用Di訓練得到分類器Mi,然后使用Di作為測試集計算Mi的誤差。然后根據誤差調整權重。
當元組沒有被正確分類時,則權重增加;反之權重減少。然后利用新的權重為下一輪訓練分類器產生訓練樣本。使其更“關注”上一輪中錯分的元組。
3、進行加權投票集成
一個例子:
clc,clear; A=gendath([50 50]); [C,D]=gendat(A,[20 20]); [W1,V1,ALF1]=adaboostc(C,qdc,100); %quadratic [W2,V2,ALF2]= adaboostc (C,ldc,100); %linear disp([testc(D*W1), testc(D*W2)]); scatterd(A); plotc({W1,W2});
(3)Bagging與Boosting的差異
通過上述簡單的介紹,可以看出這兩種集成算法主要區別在於“加沒加權”。Bagging的訓練集是隨機生成,分類器相互獨立;而Boosting的分類器是迭代生成,更關注上一輪的錯分元組。因此Bagging的各個預測函數可以並行生成;而Boosting只能順序生成。因此對於像一些比較耗時的分類器訓練算法(如神經網絡等)如果使用Bagging可以極大地解約時間開銷。
但是通過在大多數數據集的實驗,Boosting的准確率多數會高於Bagging,但是也有極個別數據集使用Boosting反倒會退化。
本文沒有對兩種集成方法的背景知識做過多的介紹,主要是結合模式識別工具箱的應用來簡單作為了解使用,如有不准確的地方,還望多加指正。