1. 程式人生 > >人臉檢測(五)--adaboost總結,整理

人臉檢測(五)--adaboost總結,整理

20170706新增:

各種Adaboost variants的比較以及不均衡問題

1.這邊有個淺顯的解釋。

2.簡單解釋到程式碼實現。

3.相對來說,這個看起來不是個人總結。

4.手動C程式碼Adaboost + stump弱分類器

<iframe name="google_esf" id="google_esf" src="https://googleads.g.doubleclick.net/pagead/html/r20160128/r20151006/zrt_lookup.html" style="display: none;" data-ad-client="ca-pub-9317413389774415"></iframe>

0 引言

1 Adaboost的原理

1.1 Adaboost是什麼

AdaBoost,是英文"Adaptive Boosting"(自適應增強)的縮寫,由Yoav Freund和Robert Schapire在1995年提出。它的自適應在於:前一個基本分類器分錯的樣本會得到加強,加權後的全體樣本再次被用來訓練下一個基本分類器。
AdaBoost是一種迭代演算法,在每一輪中加入一個新的弱分類器,直到達到某個預定的足夠小的錯誤率。每一個訓練樣本都被賦予一個權重,表明它被某個分類器選入訓練集的概率。如果某個樣本點已經被準確地分類,那麼在構造下一個訓練集中,它被選中的概率就被降低;相反,如果某個樣本點沒有被準確地分類,那麼它的權重就得到提高。

在具體實現上,最初令每個樣本的權重都相等,對於第k次迭代操作,我們就根據這些權重來選取樣本點,進而訓練分類器。然後就根據這個分類器,來提高被它分錯的的樣本的權重,並降低被正確分類的樣本權重。然後,權重更新過的樣本集被用於訓練下一個分類器。整個訓練過程如此迭代地進行下去。

1.2 Adaboost演算法流程

給定一個訓練資料集T={(x1,y1), (x2,y2)…(xN,yN)},其中例項x in mathcal{X},而例項空間mathcal{X} subset mathbb{R}^n,yi屬於標記集合{-1,+1},Adaboost的目的就是從訓練資料中學習一系列弱分類器或基本分類器,然後將這些弱分類器組合成一個強分類器。

Adaboost的演算法流程如下:

  • 1.
    首先,初始化訓練資料的權值分佈。每一個訓練樣本最開始時都被賦予相同的權重:1/N。

接下來,如果某個樣本點已經被準確地分類,那麼在構造下一個訓練集中,它被選中的概率就被降低;相反,如果某個樣本點沒有被準確地分類,那麼它的權重就得到提高。具體說來,則是:

  • 2.對於m = 1,2, ..., M

a.使用具有權值分佈Dm的訓練資料集學習,得到基本二元分類器:

b.計算Gm(x)在訓練資料集上的分類誤差率

c. 計算Gm(x)的係數,am表示Gm(x)在最終分類器中的重要程度:

由上述式子可知,em <= 1/2時,am >= 0,且am隨著em的減小而增大,意味著分類誤差率越小的基本分類器在最終分類器中的作用越大。

d. 更新訓練資料集的權值分佈

使得被基本分類器Gm(x)誤分類樣本的權值增大,而被正確分類樣本的權值減小。就這樣,通過這樣的方式,AdaBoost方法能“聚焦於”那些較難分的樣本上。

其中,Zm是規範化因子,使得Dm+1成為一個概率分佈:

  • 3.構建基本分類器的線性組合

從而得到最終分類器,如下:

1.3 Adaboost的一個例子

下面,給定下列訓練樣本,請用AdaBoost演算法學習一個強分類器。

求解過程:初始化訓練資料的權值分佈,令每個權值W1i = 1/N = 0.1,其中,N = 10,i = 1,2, ..., 10,然後分別對於m = 1,2,3, ...等值進行迭代。

迭代過程1:對於m=1,在權值分佈為D1的訓練資料上,閾值v取2.5時誤差率最低,故基本分類器為:

從而可得G1(x)在訓練資料集上的誤差率e1=P(G1(xi)≠yi) = 0.3
然後計算G1的係數:

接著更新訓練資料的權值分佈:

最後得到各個資料的權值分佈D2=(0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.1666, 0.1666, 0.1666, 0.0715),分類函式f1(x)=0.4236G1(x),故最終得到的分類器sign(f1(x))在訓練資料集上有3個誤分類點。

迭代過程2:對於m=2,在權值分佈為D2的訓練資料上,閾值v取8.5時誤差率最低,故基本分類器為:

G2(x)在訓練資料集上的誤差率e2=P(G2(xi)≠yi) = 0.2143

計算G2的係數:

更新訓練資料的權值分佈:

D3=(0.0455, 0.0455, 0.0455, 0.1667, 0.1667, 0.01667, 0.1060, 0.1060, 0.1060, 0.0455)
f2(x)=0.4236G1(x) + 0.6496G2(x)

分類器sign(f2(x))在訓練資料集上有3個誤分類點。

迭代過程3:對於m=3,在權值分佈為D3的訓練資料上,閾值v取5.5時誤差率最低,故基本分類器為:

G3(x)在訓練資料集上的誤差率e3=P(G3(xi)≠yi) = 0.1820
計算G3的係數:

更新訓練資料的權值分佈:

D4=(0.125, 0.125, 0.125, 0.102, 0.102, 0.102, 0.065, 0.065, 0.065, 0.125),f3(x)=0.4236G1(x) + 0.6496G2(x)+0.7514G3(x),分類器sign(f3(x))在訓練資料集上有0個誤分類點。

2 Adaboost的誤差界

通過上面的例子可知,Adaboost在學習的過程中不斷減少訓練誤差e,那這個誤差界到底是多少呢?

事實上,adaboost 的訓練誤差的上界為:

下面,咱們來通過推導來證明下上述式子。

當G(xi)≠yi時,yi*f(xi)<0,因而exp(-yi*f(xi))≥1,因此前半部分得證。

關於後半部分,別忘了:

整個的推導過程如下:

這個結果說明,可以在每一輪選取適當的Gm使得Zm最小,從而使訓練誤差下降最快。接著,咱們來繼續求上述結果的上界。

對於二分類而言,有如下結果:

其中,

繼續證明下這個結論。

由之前Zm的定義式跟本節最開始得到的結論可知:

而這個不等式可先由e^x和1-x的開根號,在點x的泰勒展開式推出。

值得一提的是,如果取γ1, γ2… 的最大值,記做γ(顯然,γ≥γi>0,i=1,2,...m),則對於所有m,有:

這個結論表明,AdaBoost的訓練誤差是以指數速率下降的。另外,AdaBoost演算法不需要事先知道下界γ,AdaBoost具有自適應性,它能適應弱分類器各自的訓練誤差率 。

最後,Adaboost 還有另外一種理解,即可以認為其模型是加法模型、損失函式為指數函式、學習演算法為前向分步演算法的二類分類學習方法,有機會再推導下,然後更新此文。而在此之前,有興趣的可以參看《統計學習方法》第8.3節或其它相關資料。

3 參考文獻與推薦閱讀

補充:

建立Gm(x)

4. Decision Trees 決策樹模型

(1) Dicision Tree
decision tree
就是一個簡單的 流程圖 ,它從 root node開始,自頂向下,根據每個decision node對當前輸入的決策選擇不同的分枝,重複迭代,一直到leaf node.
總體來說,決策樹學習著眼於從一組無次序、無規則的事例中推理出決策樹形式的分類規則 — 從根結點到葉結點的一條路徑就對應一條合取規則;整棵決策樹就對應一組析取表示式規則.
看我們的gender classifier的決策樹:

decision stump 是一棵單點的decision tree, 它基於單個feature對輸入進行分類,對每個可能的feature, 它都包含一個leaf,用來指明該feature的class label.
為了建立一個decision stump, 我們必須首先決定用哪一個feature:

最簡單的方法是為每個可能的feature都建一個decision stump, 看哪個feature在training set上的accuracy分數高就用哪個(當然還有很多其他方法);一旦我們選定了feature, 就可以將每個leaf都標為頻率最高的label.

Decision Stump的選擇演算法如下:

    首先為分類任務選擇全域性最好的decision stump
    然後在training set上檢測每個leaf node的accuracy
         對於accuracy不好的leaf nodes,在該葉結點路徑的訓練語料庫子集上重新訓練獲得新的decision stump替換原有decision stump

(2) Entropy and Information Gain 熵與資訊獲取

  • information gain : measures how much more organized the input values become when we divide them up using a given feature
  • entopy : to measure how disorganized the original set of input values are

熵的定義如下:
    H = Σ l |in| labelsP(l) ×log2P(l) .
熵是資訊不確定性的度量,information gain是原熵與重新組織decision stump後的熵的差,其越大,表明我們獲得的資訊越多

decision tree構建效率也是一個很重要的問題,上面講的演算法可以用動態規劃的技術來提升效率

decision tree的優點:易於理解與表達,非常適合多層級的分類結構(如族譜、進化譜)
decision tree的缺點:
    (1) 每個分枝都要分一部分training data出去,最後可能導致到葉結點的時候訓練集已經很小了 — 這就非常容易導致overfit問題 — 一種解決方案是當訓練集小到一定程度時,就停止分裂;還有一種解決方案是依舊生成整棵決策樹,但是對dev-test set上不能提高效能的部分進行剪枝(prune)
    (2) decision tree認為feature的檢測之間是有自頂向下的層級關係,而實際情況中不一定是這樣,下面的也可能影響上面的,這種情況用decision tree就不好處理
    (3) 另外,某分枝的概率非常低的時候,需要非常大量的資料才能把這個分枝訓練好 



完整的Adaboost M1,M2, MH等綜述

一、Boosting演算法的發展歷史

  Boosting演算法是一種把若干個分類器整合為一個分類器的方法,在boosting演算法產生之前,還出現過兩種比較重要的將多個分類器整合為一個分類器的方法,即boostrapping方法和bagging方法。我們先簡要介紹一下bootstrapping方法和bagging方法。

  1)bootstrapping方法的主要過程

  主要步驟:

  i)重複地從一個樣本集合D中取樣n個樣本

  ii)針對每次取樣的子樣本集,進行統計學習,獲得假設Hi

  iii)將若干個假設進行組合,形成最終的假設Hfinal

  iv)將最終的假設用於具體的分類任務

  2)bagging方法的主要過程

  主要思路:

  i)訓練分類器

  從整體樣本集合中,抽樣n* <<em> N個樣本 針對抽樣的集合訓練分類器Ci

  ii)分類器進行投票,最終的結果是分類器投票的優勝結果

  但是,上述這兩種方法,都只是將分類器進行簡單的組合,實際上,並沒有發揮出分類器組合的威力來。直到1989年,Yoav Freund與 Robert Schapire提出了一種可行的將弱分類器組合為強分類器的方法。並由此而獲得了2003年的哥德爾獎(Godel price)。

  Schapire還提出了一種早期的boosting演算法,其主要過程如下:

  i)從樣本整體集合D中,不放回的隨機抽樣n1 < n個樣本,得到集合 D1

  訓練弱分類器C1

  ii)從樣本整體集合D中,抽取 n2 < n 個樣本,其中合併進一半被 C1 分類錯誤的樣本。得到樣本集合 D2

  訓練弱分類器C2

  iii)抽取D樣本集合中,C1 和 C2 分類不一致樣本,組成D3

  訓練弱分類器C3

  iv)用三個分類器做投票,得到最後分類結果

  到了1995年,Freund and schapire提出了現在的adaboost演算法,其主要框架可以描述為:

  i)迴圈迭代多次

  更新樣本分佈

  尋找當前分佈下的最優弱分類器

  計算弱分類器誤差率

  ii)聚合多次訓練的弱分類器

  在下圖中可以看到完整的adaboost演算法:

圖1.1 adaboost演算法過程

  現在,boost演算法有了很大的發展,出現了很多的其他boost演算法,例如:logitboost演算法,gentleboost演算法等等。在這次報告中,我們將著重介紹adaboost演算法的過程和特性。

二、Adaboost演算法及分析

  從圖1.1中,我們可以看到adaboost的一個詳細的演算法過程。Adaboost是一種比較有特點的演算法,可以總結如下:

  1)每次迭代改變的是樣本的分佈,而不是重複取樣(re weight)

  2)樣本分佈的改變取決於樣本是否被正確分類

  總是分類正確的樣本權值低

  總是分類錯誤的樣本權值高(通常是邊界附近的樣本)

  3)最終的結果是弱分類器的加權組合

  權值表示該弱分類器的效能

  簡單來說,Adaboost有很多優點:

  1)adaboost是一種有很高精度的分類器

  2)可以使用各種方法構建子分類器,adaboost演算法提供的是框架

  3)當使用簡單分類器時,計算出的結果是可以理解的。而且弱分類器構造極其簡單

  4)簡單,不用做特徵篩選

  5)不用擔心overfitting!

  總之:adaboost是簡單,有效。

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

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

  第一步:

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

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

  第二步:

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

  第三步:

  得到一個子分類器h3

  整合所有子分類器:

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

  Adaboost演算法的某些特性是非常好的,在我們的報告中,主要介紹adaboost的兩個特性。一是訓練的錯誤率上界,隨著迭代次數的增加,會逐漸下降;二是adaboost演算法即使訓練次數很多,也不會出現過擬合的問題。

  下面主要通過證明過程和圖表來描述這兩個特性:

  1)錯誤率上界下降的特性

  從而可以看出,隨著迭代次數的增加,實際上錯誤率上界在下降。

  2)不會出現過擬合現象

  通常,過擬合現象指的是下圖描述的這種現象,即隨著模型訓練誤差的下降,實際上,模型的泛化誤差(測試誤差)在上升。橫軸表示迭代的次數,縱軸表示訓練誤差的值。

而實際上,並沒有觀察到adaboost演算法出現這樣的情況,即當訓練誤差小到一定程度以後,繼續訓練,返回誤差仍然不會增加。

  對這種現象的解釋,要藉助margin的概念,其中margin表示如下:

  通過引入margin的概念,我們可以觀察到下圖所出現的現象:

  從圖上左邊的子圖可以看到,隨著訓練次數的增加,test的誤差率並沒有升高,同時對應著右邊的子圖可以看到,隨著訓練次數的增加,margin一直在增加。這就是說,在訓練誤差下降到一定程度以後,更多的訓練,會增加分類器的分類margin,這個過程也能夠防止測試誤差的上升。

三、多分類adaboost

  在日常任務中,我們通常需要去解決多分類的問題。而前面的介紹中,adaboost演算法只能適用於二分類的情況。因此,在這一小節中,我們著重介紹如何將adaboost演算法調整到適合處理多分類任務的方法。

  目前有三種比較常用的將二分類adaboost方法。

  1、adaboost M1方法

  主要思路: adaboost組合的若干個弱分類器本身就是多分類的分類器。

  在訓練的時候,樣本權重空間的計算方法,仍然為:

  在解碼的時候,選擇一個最有可能的分類

  2、adaboost MH方法

  主要思路: 組合的弱分類器仍然是二分類的分類器,將分類label和分類樣例組合,生成N個樣本,在這個新的樣本空間上訓練分類器。

  可以用下圖來表示其原理:

  3、對多分類輸出進行二進位制編碼

  主要思路:對N個label進行二進位制編碼,例如用m位二進位制數表示一個label。然後訓練m個二分類分類器,在解碼時生成m位的二進位制數。從而對應到一個label上。

四、總結

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

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

  2)用於做分類任務的baseline

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

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

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

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

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

眾所周知,模式識別的方法可以按照參與識別特徵的屬性來區分,可以分為兩大類:一、使用定量特徵(可度量)如物體長度、寬度等,來描述的各種模式,這一類主要是指決策理論,有匹配、統計、神經網路等方法;二、使用定性特徵如特徵結構、排列順序等,來描繪的各種模式,這一類主要是指結構判別,主要有串和樹的匹配等方法。

模式識別的完整的流程順序是:感測器——分割組織——特徵提取——分類器——後處理。其中分類器的設計部分,可以使用的理論有很多,目前主要包括:基於統計理論的方法(貝葉斯理論)、線性判別函式、神經網路的方法、隨機方法(對於複雜的問題)、非度量方法(定性結構特徵)

分類器得到的模型不僅要很好擬合輸入資料,還要能夠正確地預測未知樣本的類標號。因此,訓練演算法的主要目標就是要建立具有很好的泛化能力模型,即建立能夠準確地預測未知樣本類標號的模型。

通常我們用“方差”和“偏差”來測量學習演算法與給定分類問題的“匹配”和“校準”程度。“偏差”度量的是匹配的“準確性”和“質量”:一個高的偏差意味著一個壞的匹配,“方差”度量的是匹配的“精確性”和“特定性”:一個高的方差意味著一個弱的匹配。

研究表明,使用重取樣技術可以提高分類器的準確率,而boosting演算法就是涉及分類器設計中的重取樣技術。其思想內涵在於:從給定的資料集中抽取多個數據子集,使得有可能計算任意統計量的值及其範圍。

說道boosting,不得不說Arcing(adaptive reweighting and combining)自適應的權值重置和組合:重新使用和選擇資料,以期達到改善分類器效能的目的。最簡單的arcing版本就是bagging演算法。

Bagging一個多分類器系統

bagging演算法的基本思想:

給定一個弱學習演算法,和一個訓練集;單個弱學習演算法準確率不高;將該學習演算法使用多次,得出預測函式序列,進行投票,最後結果準確率將得到提高。

步驟1:從大小為n的原始資料集D中,分別獨立隨機的抽取n’個數據(n’),形成自助資料集,將這個過程獨立重複多次,直到產生很多獨立的自助資料集。

步驟2:每一個自助資料集都被獨立的用於訓練一個“分量分類器”。

步驟3、最終的分類判決由這些“分量分類器”各自的判決結果投票決定。

Bagging演算法是第一個多分類器系統,後面還有(組合分類器系統)。

演算法:

For t = 1, 2, …, T Do

從資料集S中取樣(放回選樣)

訓練得到模型Ht

對未知樣本X分類時,每個模型Ht都得出一個分類,得票最高的即為未知樣本X的分類,也

可通過得票的平均值用於連續值的預測 。

Bagging和boosting的區別

訓練集:

預測函式

準確性

使用要求

Bagging

隨機選擇,各輪訓練集相互獨立

沒有權重;可以並行生成

在有些資料集中,boosting會引起退化

要求“不穩定”的分類方法

Boosting

各輪訓練集並不獨立,它的選擇與前輪的學習結果有關

有權重;只能順序生成

在大多數資料集中,boosting的準確性比bagging高

要求“不穩定”的分類方法

訓練集的小變動能夠使得分類模型顯著變動

Bagging是一個純粹的降低相關度的方法,如果樹的節點具有很高的相關性,bagging就會有好的結果。早期的AdaBoost在第二步的時候採用重取樣方法,即使某些樣本權重增加。這種方法與bagging存在某種關聯。它也是Boost的成功之處中降低相關度方面的重要部分。

AdaBoost在第二步中如果使用加權的tree-growing演算法,而不是重取樣演算法,效果會更好。可以使用stumps作為弱分類器

最初的boosting演算法

1989年Kearns and Valiant研究了PAC學習模型中弱學習演算法和強學習演算法兩者間的等價問題,即任意給定僅僅比隨機猜測稍好(準確率大於0.5)的弱學習演算法,是否可以被提升為強學習演算法?若兩者等價,則我們只需尋找一個比隨機猜測稍好的弱學習演算法,然後將其提升為強學習演算法,從而不必費很大力氣去直接尋找強學習演算法。就此問題,Schapire於1990年首次給出了肯定的答案。他主持這樣一個觀點:任一弱學習演算法可以通過加強提升到一個任意正確率的強學習演算法,並通過構造一種多項式級的演算法來實現這一加強過程,這就是最初的Boosting演算法的原型。

主要思想是,根據已有的訓練樣本集設計一個分類器,要求其準確率要比平均效能好,然後依次順序加入多個分量分類器系統,最後形成一個總體分類器。

以一個二類問題舉例。

步驟1:從大小為n的原始樣本集D中隨機選取n1個樣本點(不放回),組成樣本集D1。根據D1訓練出第一個分類器C1。

步驟2:構造第二個樣本集D2,它是根據C1最富資訊的那些樣本點組成的。在最後產生的D2集合中將有一半的樣本被C1正確分類,而另一半的樣本被C1錯誤分類。

步驟3:繼續構造第三個樣本集D3,方法:在D中剩餘的樣本中選取樣本點,並且用C1和C2進行分類,如果C1和C2判決結果不同,那麼就把樣本加入D3,否則就忽略這個樣本。然後用D3訓練新分類器C3。

步驟4:用這3個分類器對新樣本x進行分類,如果C1和C2的判決結果相同,則表為一類,不同則表為另一類。

Boosting方法有許多不同的變形,其中最流行的一種就是adaboost。這個名詞是“adaptive boosting”的縮寫。這個方法允許設計者不斷的加入新的“弱分類器”,直到達到某個預定的最小錯誤率。

1995年Freund and Schapire提出AdaBoost演算法。

1996年Yoav Freund在Experiments with a New Boosting Algorithm中提出了AdaBoost.M1和AdaBoost.M2兩種演算法。其中,AdaBoost.M1是我們通常所說的Discrete AdaBoost:而AdaBoost.M2是M1的泛化形式。該文的一個結論是:當弱分類器演算法使用簡單的分類方法時,boosting的效果明顯地統一地比bagging要好。當弱分類器演算法使用C4.5時,boosting比bagging較好,但是沒有前者的比較來得明顯。

AdaBoost.M1 Discrete AdaBoost:

初始版本
1.獲得一組樣本(X)和它的分類(Y)和一個分類器(weaklearn).
2.賦予平均的權值分佈D(i)
進入迴圈:T次
1. 賦予弱分類器權值D(i),使用弱分類器獲得樣本(X)到分類(Y)上的一個對映.(就是把某個X歸到某個Y類中去)
2. 計算這個對映的誤差e,e=各個歸類錯誤的樣本權值之和.如果e>1/2那麼弱分類器訓練失敗,跳出迴圈,

訓練結束(這在二值檢測中是不會發生的,而多值的情況就要看分類器夠不夠強健了)
3.
 設beta B = e / ( 1 - e ).用於調整權值.因為e<1/2.因此0
4. 如果某樣本分類正確,該樣本的權值就乘以B讓權值變小;如果分類錯誤,就讓該樣本的權值乘以B^-1或者不變,這樣就讓分類正確的樣本權值降低,分類錯誤的樣本權值升高,加強了對較難分類樣本的分類能力
5. 權值均衡化
迴圈結束
1. 最終的分類器是,當一個X進入時,遍歷所有Y,尋找使(h(x)=y的情況下,log(1/B)之和)最大者即是輸出分類y

書上版本

具體演算法:

每個樣本都賦予一個權重,T次迭代,每次迭代後,對分類錯誤的樣本加大權重,使得下一次的迭代更加關注這些樣本。

輸入:(X1,Y1), (X2,Y2),…(Xn,Yn)

Xi∈X, Yi∈Y={+1,-1}

初始化權值:D1(i)=1/n

For t=1,…,T

在Dt下訓練,

得到弱的假設ht: X->{-1,+1},

錯誤率:Εt=ΣDt(i) [ht(Xi)≠Yi]

選擇αt=1/2 ln ( (1- Εt)/ Εt ),

更改權值:

if ht(Xi)≠Yi , Dt+1(i)=Dt(i)* eαt /Zt

if ht(Xi)=Yi , Dt+1(i)=Dt(i)* e -αt /Zt

輸出:H(X)=sign( ∑ αtht(X) )

帶圖版本(程式版本):

初始賦予每個樣本相等的權重1/N ;

For t = 1, 2, …, T Do

學習得到分類法Ct;

計算該分類法的錯誤率Et

Et=所有被錯誤分類的樣本的權重和;

βt= Et/(1 - Et)

根據錯誤率更新樣本的權重;

正確分類的樣本: Wnew= Wold* βt

錯誤分類的樣本: Wnew= Wold

調整使得權重和為1;

每個分類法Ct的投票價值為log [ 1 / βt ]

最大錯誤率問題:

將γt=1/2-Et ;

Freund and Schapire證明:

最大錯誤率為:

即訓練錯誤率隨γt的增大呈指數級的減小.

最大總誤差:

m : 樣本個數

d : VC維

T :訓練輪數

Pr:對訓練集的經驗概率

如果T值太大,Boosting會導致過適應(overfit)

《模式分類》386

AdaBoost.M2是M1的泛化形式

.M2的流程是

1.獲得一組樣本(X)和它的分類(Y)和一個分類器(weaklearn).
2.對於某個樣本Xi將它的分類歸為一個正確分類Yi和其他不正確分類Yb
3.樣本權值進行如下分佈首先每個樣本分到1/m的權值,然後每個不正確分類分到(1/m)/Yb的個數。
也就是說樣本權值是分到了每個不正確的分類上

進入迴圈
1. 求每個樣本的權值,即每個樣本所有不正確的分類的權值和,再求每個樣本錯誤分類的權值,即不正確分類的權值除以該樣本的權值.最後將每個樣本的權值歸一化
2. 將樣本權值和某樣本的不正確分類的權值輸入到weaklearn,獲得弱分類器的輸出為各個分類的可能值
3. 計算偽錯誤率:
4. 更新權值
退出迴圈

1999年,ROBERT E. SCHAPIRE和YORAM SINGER,於Machine Learning發表論文:

Improved Boosting Algorithms Using Confidence-rated Predictions。提出了更具一般性的AdaBoost形式。提出了自信率以改善AdaBoost的效能。並提出瞭解決多標籤問題的AdaBoost.MH和AdaBoost.MR演算法,其中AdaBoost.MH演算法的一種形式又被稱為Real Boost演算法。事實上:Discrete AdaBoost是指,弱分類器的輸出值限定在{-1,+1},和與之相應的權值調整,強分類器生成的AdaBoost演算法;Real AdaBoost是指,弱分類器輸出一個可能度,該值的範圍是整個R,和與之相應的權值調整,強分類器生成的AdaBoost演算法。

事實上,Discrete到Real的轉變體現了古典集合到模糊集合轉變的思想。

至於Gentle AdaBoost。考慮到(AdaBoost對”不像”的正樣本權值調整很高,而導致了分類器的效率下降),而產生的變種演算法。它較少地強調難以分類的樣本。Rainer Lienhart,Alexander Kuranov,Vadim Pisarevsky在論文Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object Detection中提出在stump弱分類器(即每個弱分類器使用一個特徵進行分類)上進行的對比試驗中,Gentle的結果明顯好於Real和Discrete。

AdaBoost.MH(real)

演算法的運算流程:
1. 得到一組樣本(m個)和樣本相應的分類,這個分類是由K個是和否的標籤組成.某一個樣本可以有多個是標籤.
2. 均分權值:1/mk
進入迴圈:
1. 由弱分類器獲得各樣本針對各標籤的是或否結果(給出離散值或連續值)
2. 獲得alpha(t)
3. 調整權值.大概是,弱分類器判斷l標籤的是或否,若判斷正確乘以1,錯誤乘以-1,再乘以 ,然後…
4. 權值歸一化
跳出迴圈
輸出強分類器

Logit和Gentle演算法的提出過程大致是這樣的

1. 驗證Boosting algorithms是一種擬合一個additive logistic regression model(加性的邏輯迴歸模型)的階段式估計過程。它有最優一個指數判據,這個判據由第二定理與二項式對數似然判據是等價的。

2. 作者證明Discrete是使用adaptive Newton updates擬合一個additive logistic regression model來最小化Ee^(-yF(x))的過程,其中F(x)=求和fm(x),而fm(x)就是各層分類器的結果。

3. 作者證明Real是使用層級最優的方法來擬合一個additive logistic regression model.

4. 作者說明了為什麼要選擇Ee^(-yF(x))作為目標:因為大家都用這個

5. 作者證明了當(blabla一個很複雜的公式,貼不出來)時Ee^(-yF(x))最小

6. 作者證明了每次權值更新以後,最近一次訓練出的弱分類器錯誤率為50%.

7. 作者證明了對於最優的F(x),樣本的分類乘以權值的和應該為0.

於是作者用80年代興起的邏輯迴歸的尋優方法中提煉出了LogitBoost(我終於找到logitBoost的logic了)

logitBoost

自適應的牛頓法,擬合加性logistic迴歸模型
1. 獲得樣本,(x,y)序列.將分類y*=(y+1)/2
2. 設定初值,F(x)=0,p(xi)=1/2
進入迴圈
1. 依式計算zi,wi.
2. 通過加權最小二乘的方式擬合函式fm(x).由zi擬合xi,權重為wi
3. 更新F(x),p(x)
退出迴圈
輸出分類器sign[F(x)].
作者提出,logitAdaBoost在每一輪中都使Ee^(-y(F(x)+f(x)))最優,會使訓練樣本的代表性下降,於是提出了Gentle AdaBoost(牛頓步長法)

Gentle AdaBoost(matlab版)
for It = 1 : Max_Iter

nodes = train(WeakLrn, Data, Labels, distr);

for i = 1:length(nodes)

curr_tr = nodes{i};

step_out = calc_output(curr_tr, Data);

s1 = sum( (Labels == 1) .* (step_out) .* distr);

s2 = sum( (Labels == -1) .* (step_out) .* distr);

if(s1 == 0 && s2 == 0)

continue;

end

Alpha = (s1 - s2) / (s1 + s2);%注意alpha的不同 Alpha = 0.5*log((s1 + eps) / (s2+eps));real

Weights(end+1) = Alpha;

Learners{end+1} = curr_tr;

final_hyp = final_hyp + step_out .* Alpha;

end

Z = sum(abs(Labels .* final_hyp));

if(Z == 0)

Z = 1;

end

distr = exp(- 1 * (Labels .* final_hyp) / Z);

Z = sum(distr);

distr = distr / Z;

end

ModestAdaBoost

for i = 1:length(nodes)

curr_tr = nodes{i};

step_out = calc_output(curr_tr, Data);

s1 = sum( (Labels == 1) .* (step_out) .* distr);

s2 = sum( (Labels == -1) .* (step_out) .* distr);

s1_rev = sum( (Labels == 1) .* (step_out) .* rev_distr);

s2_rev = sum( (Labels == -1) .* (step_out) .* rev_distr);

Alpha = s1 * (1 - s1_rev) - s2 * (1 - s2_rev);

其中的fm即為alpha

AdaBoost演算法針對不同的訓練集訓練同一個基本分類器(弱分類器),然後把這些在不同訓練集上得到的分類器集合起來,構成一個更強的最終的分類器(強分類器)。理論證明,只要每個弱分類器分類能力比隨機猜測要好,當其個數趨向於無窮個數時,強分類器的錯誤率將趨向於零。

AdaBoost演算法中不同的訓練集是通過調整每個樣本對應的權重實現的。最開始的時候,每個樣本對應的權重是相同的,在此樣本分佈下訓練出一個基本分類器h1(x)。對於h1(x)錯分的樣本,則增加其對應樣本的權重;而對於正確分類的樣本,則降低其權重。這樣可以使得錯分的樣本突出出來,並得到一個新的樣本分佈。同時,根據錯分的情況賦予h1(x)一個權重,表示該基本分類器的重要程度,錯分得越少權重越大。在新的樣本分佈下,再次對基本分類器進行訓練,得到基本分類器h2(x)及其權重。依次類推,經過T次這樣的迴圈,就得到了T個基本分類器,以及T個對應的權重。最後把這T個基本分類器按一定權重累加起來,就得到了最終所期望的強分類器。

一些改進的演算法

1、級聯ad

一種改進的AdaBoost演算法——AD_AdaBoost。Viola提出的級聯結構的分類器是指一組序列的分類器。在對待識樣本進行分類時,只有被前面一級的分類器判決為正的樣本才被送入後面的分類器繼續處理,反之則被認為是負樣本直接輸出。最後,只有那些被每一級的分類器都判決為正的樣本才作為正樣本輸出。在級聯結構的分類器中,Viola和jones採用Ad aBoost演算法來對每一級的分類器進行訓練。

2、一種用於不平衡資料分類的改進Ad a B o o s t演算法

3、基於雙閾值的增強型AdaBoost_快速演算法

關於boost演算法

  boost演算法是基於PAC學習理論(probably approximately correct)而建立的一套整合學習演算法(ensemble learning)。其根本思想在於通過多個簡單的弱分類器,構建出準確率很高的強分類器,PAC學習理論證實了這一方法的可行性。下面關於幾種Boost演算法的比較,是基於文章《Additive Logistic Regression a Statistical View of Boosting》整理的。

幾種boost演算法步驟

  通常使用最多的應該是離散的Adaboost演算法(Discrete AdaBoost),主要因為它的簡單卻不俗的表現,Discrete Adaboost演算法的步驟如下:

  可以看出,Discrete AdaBoost的每一個弱分類的輸出結果是1或-1,並沒有屬於某個類的概率,略顯粗糙。
如果讓每個弱分類器輸出樣本屬於某個類的概率,則可以得到Real AdaBoost演算法,其步驟如下:

  Real Adaboost每個弱分類器輸出樣本屬於某類的概率後,通過一個對數函式將0-1的概率值對映到實數域,最後的分類器是所有對映函式的和。

將Real Adaboost演算法每次迭代的兩部合併,直接產生一個對映到實數域的函式,則就成了Gentle AdaBoost, 其演算法步驟如下:

  Gentle AdaBoost則在每次迭代時,基於最小二乘去做一個加權迴歸,最後所有迴歸函式的和作為最終的分類器。

  LogitBoost演算法則和Gentle AdaBoost演算法有點相像,不過其每次進行迴歸擬合的變數z是在不斷更新的,Gentle AdaBoost使用的是y。LogitBoost演算法步驟如下:

4種boost演算法的原理差異

  上面4中boost演算法,其大體結構都是比較相似的,那麼是如何推匯出每種演算法的具體形式的呢?
  首先是關於損失函式(或代價函式),通常見到比較多的是均方誤差和似然函式,而上面的演算法中,Discrete AdaBoost、Real AdaBoost和Gentle AdaBoost演算法都是採用對數損失函式,具體形式如下:

J(F)=Ee ( −yF(x))  J(F)=Ee(−yF(x))


  其表達的意義實質上與分類錯誤個數是相同的。
  而Logit Boost演算法則採用最大化對數似然函式來推導的。
  第二點是具體優化方法,Discrete AdaBoost與Real AdaBoost主要通過類似梯度下降的方法來優化,而Gentle AdaBoost與Logit Boost都是採用類似牛頓迭代的方式優化的。

演算法的效果差異

  在前面提到的參考文章中,對幾種演算法的效果進行了大量比較,大致如下;

  1. 整體效果而言,效果由好到差的順序為Logit Boost,Gentle AdaBoost, Real AdaBoost, Discrete AdaBoost
  2. 若弱分類器採用樹樁模型(也就是隻要2個葉子節點的決策樹),Discrete AdaBoost的結果比其他3種演算法結果差了很多,大概是由於系統偏差過大導致的泛化誤差較大
  3. 若弱分類器採用多層的決策樹(4或8個葉子節點),Discrete AdaBoost的結果能有較大提升,而其他3種演算法則差異不大。

  平時我們所用的AdaBoost演算法大多是Discrete AdaBoost,從這裡可以看出Discrete AdaBoost演算法模型相對比較簡單,需要弱分類器的精確度稍高,因此在具體應用時最好將每個弱分類器的葉子節點控制在4個或8個。
  關於Boost演算法還有很多比較有趣的結論,這裡不多講,可以參考上面的那篇Paper