1. 程式人生 > >Boost和AdaBoost演算法原理簡介

Boost和AdaBoost演算法原理簡介

本文主要參考:

2): Adaboost 演算法及原理

1.名詞解釋

Boost(推進),adaboost(adapt boost)自適應推進演算法:Adaboost演算法是機器學習中一種比較重要的特徵分類演算法,已被廣泛應用人臉表情識別、影象檢索等應用中。就目前而言,對Adaboost演算法的研究以及應用大多集中於分類問題,在一些迴歸問題上也有所應用。Adaboost主要解決的問題有: 兩類問題、多類單標籤問題、多類多標籤問題、迴歸問題。

2.演算法發展簡介

2.1 強學習演算法和弱學習演算法

在機器學習領域,Boosting演算法是一種通用的學習演算法,這一演算法可以提升任意給定的學習演算法的效能。其思想源於1984年Valiant提出的”可能近似正確”-PAC(Probably Approximately Correct)學習模型,在PAC模型中定義了兩個概念-強學習演算法和弱學習演算法。其概念是: 如果一個學習演算法通過學習一組樣本,識別率很高,則稱其為強學習演算法;如果識別率僅比隨機猜測略高,其猜測準確率大於50,則稱其為弱學習演算法。

2.2boost模型發展

1989年Kearns and Valiant研究了PAC學習模型中弱學習演算法和強學習演算法兩者間的等價問題;

即任意給定僅僅比隨機猜測稍好(準確率大於0.5)的弱學習演算法,是否可以被提升為強學習演算法?若兩者等價,則我們只需尋找一個比隨機猜測稍好的若學習演算法,然後將其提升為強學習演算法,從而不必費很大力氣去直接尋找強學習演算法。

就此問題,Schapire於1990年首次給出了肯定的答案。他主持這樣一個觀點:

任一弱學習演算法可以通過加強提升到一個任意正確率的強學習演算法,並通過構造一種多項式級的演算法來實現這一加強過程,這就是最初的Boosting演算法的原型。

Boosting是一種將弱分類器通過某種方式結合起來得到一個分類效能大大提高的強分類器的分類方法。該方法可以把一些粗略的經驗規則轉變為高度準確的預測法則。強分類器對資料進行分類,是通過弱分類器的多數投票機制進行的。該演算法是一個簡單的弱分類演算法提升過程,這個過程通過不斷的訓練,以提高對資料的分類能力。

Freund於1991年提出了另外一種效率更高的Boosting演算法。但此演算法需要要提前知道弱學習演算法正確率的下限,因而應用範圍十分有限。

2.3adaboost出現

1995年,Freund and Schapire改進了Boosting演算法,取名為Adaboost演算法,該演算法不需要提前知道所有關於弱學習演算法的先驗知識,同時運算效率與Freund在1991年提出的Boosting演算法幾乎相同。Adaboost即Adaptive Boosting,它能

1):自適應的調整弱學習演算法的錯誤率,經過若干次迭代後錯誤率能達到預期的效果。

2):它不需要精確知道樣本空間分佈,在每次弱學習後調整樣本空間分佈,更新所有訓練樣本的權重,把樣本空間中被正確分類的樣本權重降低,被錯誤分類的樣本權重將會提高,這樣下次弱學習時就更能更關注這些被錯誤分類的樣本。該演算法可以很容易地應用到實際問題中,因此,已成為目前最流行的Boosting演算法。

AdaBoost演算法的核心思想是針對同一個訓練集訓練出不同的分類器(弱分類器),然後把這些弱分類器集合起來,構成一個性能更加強大的分類器(強分類器)。

2.4 Boosting與AdaBoost演算法的訓練

Boosting分類方法,其過程如下所示:

1)先通過對N個訓練資料的學習得到第一個弱分類器h1;

2)將h1分錯的資料和其他的新資料一起構成一個新的有N個訓練資料的樣本,通過對這個樣本的學習得到第二個弱分類器h2;

3)將h1和h2都分錯了的資料加上其他的新資料構成另一個新的有N個訓練資料的樣本,通過對這個樣本的學習得到第三個弱分類器h3;

4)最終經過提升的強分類器h_final=Majority Vote(h1,h2,h3)。即某個資料被分為哪一類要通過h1,h2,h3的多數表決。

上述Boosting演算法,存在兩個問題:

①如何調整訓練集,使得在訓練集上訓練弱分類器得以進行。

②如何將訓練得到的各個弱分類器聯合起來形成強分類器。

針對以上兩個問題,AdaBoost演算法進行了調整:

①使用加權後選取的訓練資料代替隨機選取的訓練資料,這樣將訓練的焦點集中在比較難分的訓練資料上。

②將弱分類器聯合起來時,使用加權的投票機制代替平均投票機制。讓分類效果好的弱分類器具有較大的權重,而分類效果差的分類器具有較小的權重。

AdaBoost演算法的具體描述如下:

假定X表示樣本空間,Y表示樣本類別標識集合,假設是二值分類問題,這裡限定Y={-1,+1}。令S={(Xi,yi)|i=1,2,…,m}為樣本訓練集,其中Xi∈X,yi∈Y。

①:始化m個樣本的權值,假設樣本分佈Dt為均勻分佈:Dt(i)=1/m,Dt(i)表示在第t輪迭代中賦給樣本(xi,yi)的權值。

②:令T表示迭代的次數。


四 Adaboost 舉例

也許你看了上面的介紹或許還是對adaboost算法雲裡霧裡的,沒關係,百度大牛舉了一個很簡單的例子,你看了就會對這個演算法整體上很清晰了。

  下面我們舉一個簡單的例子來看看adaboost的實現過程:

  圖中,“+”和“-”分別表示兩種類別,在這個過程中,我們使用水平或者垂直的直線作為分類器,來進行分類。

  第一步:

  根據分類的正確率,得到一個新的樣本分佈D,一個子分類器h1

  其中劃圈的樣本表示被分錯的。在右邊的途中,比較大的“+”表示對該樣本做了加權。

也許你對上面的ɛ1,ɑ1怎麼算的也不是很理解。下面我們算一下,不要嫌我囉嗦,我最開始就是這樣思考的,只有自己把演算法演算一遍,你才會真正的懂這個演算法的核心,後面我會再次提到這個。

演算法最開始給了一個均勻分佈 D 。所以h1 裡的每個點的值是0.1。ok,當劃分後,有三個點劃分錯了,根據演算法誤差表示式得到 誤差為分錯了的三個點的值之和,所以ɛ1=(0.1+0.1+0.1)=0.3,而ɑ1 根據表示式 的可以算出來為0.42. 然後就根據演算法 把分錯的點權值變大。如此迭代,最終完成adaboost演算法。

  第二步:

  根據分類的正確率,得到一個新的樣本分佈D3,一個子分類器h2

  第三步:

  得到一個子分類器h3

  整合所有子分類器:

  因此可以得到整合的結果,從結果中看,及時簡單的分類器,組合起來也能獲得很好的分類效果,在例子中所有的。

五 Adaboost 疑惑和思考

  到這裡,也許你已經對adaboost演算法有了大致的理解。但是也許你會有個問題,為什麼每次迭代都要把分錯的點的權值變大呢?這樣有什麼好處呢?不這樣不行嗎? 這就是我當時的想法,為什麼呢?我看了好幾篇介紹adaboost 的部落格,都沒有解答我的疑惑,也許大牛認為太簡單了,不值一提,或者他們並沒有意識到這個問題而一筆帶過了。然後我仔細一想,也許提高錯誤點可以讓後面的分類器權值更高。然後看了adaboost演算法,和我最初的想法很接近,但不全是。 注意到演算法最後的表到式為,這裡面的a 表示的權值,是由得到的。而a是關於誤差的表示式,到這裡就可以得到比較清晰的答案了,所有的一切都指向了誤差。提高錯誤點的權值,當下一次分類器再次分錯了這些點之後,會提高整體的錯誤率,這樣就導致 a 變的很小,最終導致這個分類器在整個混合分類器的權值變低。也就是說,這個演算法讓優秀的分類器佔整體的權值更高,而挫的分類器權值更低。這個就很符合常理了。到此,我認為對adaboost已經有了一個透徹的理解了。

六 總結

  最後,我們可以總結下adaboost演算法的一些實際可以使用的場景:

  1)用於二分類或多分類的應用場景

  2)用於做分類任務的baseline

  無腦化,簡單,不會overfitting,不用調分類器

  3)用於特徵選擇(feature selection)

  4)Boosting框架用於對badcase的修正

  只需要增加新的分類器,不需要變動原有分類器

  由於adaboost演算法是一種實現簡單,應用也很簡單的演算法。Adaboost演算法通過組合弱分類器而得到強分類器,同時具有分類錯誤率上界隨著訓練增加而穩定下降,不會過擬合等的性質,應該說是一種很適合於在各種分類場景下應用的演算法。