聲明:本文用到的代碼均來自於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的使用說明。spa
其中:A是訓練數據集,其類型是dataset。code
CLASSF是基學習器的訓練算法,該工具箱中涵蓋多種分類器的算法,比較經常使用的有nmc(最近鄰)、treec(決策樹)等等。blog
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/d。
二、for i=1:k
從D中進行有放回的抽樣,組成大小爲d的訓練集Di,同一個元組能夠被屢次選擇,而每一個元組被選中的概率由權重決定。利用Di訓練獲得分類器Mi,而後使用Di做爲測試集計算Mi的偏差。而後根據偏差調整權重。
當元組沒有被正確分類時,則權重增長;反之權重減小。而後利用新的權重爲下一輪訓練分類器產生訓練樣本。使其更「關注」上一輪中錯分的元組。
三、進行加權投票集成
一個例子:
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反倒會退化。
本文沒有對兩種集成方法的背景知識作過多的介紹,主要是結合模式識別工具箱的應用來簡單做爲了解使用,若有不許確的地方,還望多加指正。