[轉]Adaboost 算法的原理與推導

看了不少篇解釋關於Adaboost的博文,以爲這篇寫得很好,所以轉載來本身的博客中,以便學習和查閱。php

原文地址:《Adaboost 算法的原理與推導》,主要內容可分爲三塊,Adaboost介紹、實例以及公式推導。html

1 Adaboost的原理

1.1 Adaboost是什麼    

AdaBoost,是英文"Adaptive Boosting"(自適應加強)的縮寫,由Yoav Freund和Robert Schapire在1995年提出。它的自適應在於:前一個基本分類器分錯的樣本會獲得增強,加權後的全體樣本再次被用來訓練下一個基本分類器。同時,在每一輪中加入一個新的弱分類器,直到達到某個預約的足夠小的錯誤率或達到預先指定的最大迭代次數。算法

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

  1. 初始化訓練數據的權值分佈。若是有N個樣本,則每個訓練樣本最開始時都被賦予相同的權值:1/N。
  2. 訓練弱分類器。具體訓練過程當中,若是某個樣本點已經被準確地分類,那麼在構造下一個訓練集中,它的權值就被下降;相反,若是某個樣本點沒有被準確地分類,那麼它的權值就獲得提升。而後,權值更新過的樣本集被用於訓練下一個分類器,整個訓練過程如此迭代地進行下去。
  3. 將各個訓練獲得的弱分類器組合成強分類器。各個弱分類器的訓練過程結束後,加大分類偏差率小的弱分類器的權重,使其在最終的分類函數中起着較大的決定做用,而下降分類偏差率大的弱分類器的權重,使其在最終的分類函數中起着較小的決定做用。換言之,偏差率低的弱分類器在最終分類器中佔的權重較大,不然較小。

1.2 Adaboost算法流程

   給定一個訓練數據集T={(x1,y1), (x2,y2)…(xN,yN)},其中實例,而實例空間,yi屬於標記集合{-1,+1},Adaboost的目的就是從訓練數據中學習一系列弱分類器或基本分類器,而後將這些弱分類器組合成一個強分類器。函數

    Adaboost的算法流程以下:學習

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

  • 步驟2. 進行多輪迭代,用m = 1,2, ..., M表示迭代的第多少輪

a. 使用具備權值分佈Dm的訓練數據集學習,獲得基本分類器(選取讓偏差率最低的閾值來設計基本分類器):優化

b. 計算Gm(x)在訓練數據集上的分類偏差率spa

由上述式子可知,Gm(x)在訓練數據集上的偏差率em就是被Gm(x)誤分類樣本的權值之和。.net

c. 計算Gm(x)的係數,am表示Gm(x)在最終分類器中的重要程度(目的:獲得基本分類器在最終分類器中所佔的權重。注:這個公式 寫成 am=1/2ln((1-em)/em) 更準確,由於底數是天然對數e,故用In,寫成log容易讓人誤覺得底數是2或別的底數,下同):

由上述式子可知,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, ...等值進行迭代。

    拿到這10個數據的訓練樣本後,根據 X 和 Y 的對應關係,要把這10個數據分爲兩類,一類是「1」,一類是「-1」,根據數據的特色發現:「0 1 2」這3個數據對應的類是「1」,「3 4 5」這3個數據對應的類是「-1」,「6 7 8」這3個數據對應的類是「1」,9是比較孤獨的,對應類「-1」。拋開孤獨的9不講,「0 1 2」、「3 4 5」、「6 7 8」這是3類不一樣的數據,分別對應的類是一、-一、1,直觀上推測可知,能夠找到對應的數據分界點,好比2.五、5.五、8.5 將那幾類數據分紅兩類。固然,這只是主觀臆測,下面實際計算下這個具體過程。

迭代過程1

對於m=1,在權值分佈爲D1(10個數據,每一個數據的權值皆初始化爲0.1)的訓練數據上,通過計算可得:

    1. 閾值v取2.5時偏差率爲0.3(x < 2.5時取1,x > 2.5時取-1,則6 7 8分錯,偏差率爲0.3),
    2. 閾值v取5.5時偏差率最低爲0.4(x < 5.5時取1,x > 5.5時取-1,則3 4 5 6 7 8皆分錯,偏差率0.6大於0.5,不可取。故令x > 5.5時取1,x < 5.5時取-1,則0 1 2 9分錯,偏差率爲0.4),
    3. 閾值v取8.5時偏差率爲0.3(x < 8.5時取1,x > 8.5時取-1,則3 4 5分錯,偏差率爲0.3)。

能夠看到,不管閾值v取2.5,仍是8.5,總得分錯3個樣本,故可任取其中任意一個如2.5,弄成第一個基本分類器爲:

上面說閾值v取2.5時則6 7 8分錯,因此偏差率爲0.3,更加詳細的解釋是:由於樣本集中

    1. 0 1 2對應的類(Y)是1,因它們自己都小於2.5,因此被G1(x)分在了相應的類「1」中,分對了。
    2. 3 4 5自己對應的類(Y)是-1,因它們自己都大於2.5,因此被G1(x)分在了相應的類「-1」中,分對了。
    3. 但6 7 8自己對應類(Y)是1,卻因它們自己大於2.5而被G1(x)分在了類"-1"中,因此這3個樣本被分錯了。
    4. 9自己對應的類(Y)是-1,因它自己大於2.5,因此被G1(x)分在了相應的類「-1」中,分對了。

從而獲得G1(x)在訓練數據集上的偏差率(被G1(x)誤分類樣本「6 7 8」的權值之和)e1=P(G1(xi)≠yi) = 3*0.1 = 0.3

而後根據偏差率e1計算G1的係數:

這個a1表明G1(x)在最終的分類函數中所佔的權重,爲0.4236。 接着更新訓練數據的權值分佈,用於下一輪迭代:

值得一提的是,由權值更新的公式可知,每一個樣本的新權值是變大仍是變小,取決於它是被分錯仍是被分正確。

即若是某個樣本被分錯了,則yi * Gm(xi)爲負,負負得正,結果使得整個式子變大(樣本權值變大),不然變小。

第一輪迭代後,最後獲得各個數據的權值分佈D2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715,  0.0715, 0.1666, 0.1666, 0.1666, 0.0715)。由此能夠看出,由於樣本中是數據「6 7 8」被G1(x)分錯了,因此它們的權值由以前的0.1增大到0.1666,反之,其它數據皆被分正確,因此它們的權值皆由以前的0.1減少到0.0715。

分類函數f1(x)= a1*G1(x) = 0.4236G1(x)。

此時,獲得的第一個基本分類器sign(f1(x))在訓練數據集上有3個誤分類點(即6 7 8)。

從上述第一輪的整個迭代過程能夠看出:被誤分類樣本的權值之和影響偏差率,偏差率影響基本分類器在最終分類器中所佔的權重

迭代過程2

對於m=2,在權值分佈爲D2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715,  0.0715, 0.1666, 0.1666, 0.1666, 0.0715)的訓練數據上,通過計算可得:

    1. 閾值v取2.5時偏差率爲0.1666*3(x < 2.5時取1,x > 2.5時取-1,則6 7 8分錯,偏差率爲0.1666*3),
    2. 閾值v取5.5時偏差率最低爲0.0715*4(x > 5.5時取1,x < 5.5時取-1,則0 1 2 9分錯,偏差率爲0.0715*3 + 0.0715),
    3. 閾值v取8.5時偏差率爲0.0715*3(x < 8.5時取1,x > 8.5時取-1,則3 4 5分錯,偏差率爲0.0715*3)。

因此,閾值v取8.5時偏差率最低,故第二個基本分類器爲:

面對的仍是下述樣本:

很明顯,G2(x)把樣本「3 4 5」分錯了,根據D2可知它們的權值爲0.0715, 0.0715,  0.0715,因此G2(x)在訓練數據集上的偏差率e2=P(G2(xi)≠yi) = 0.0715 * 3 = 0.2143。

計算G2的係數:

更新訓練數據的權值分佈:

D3 = (0.0455, 0.0455, 0.0455, 0.1667, 0.1667,  0.01667, 0.1060, 0.1060, 0.1060, 0.0455)。被分錯的樣本「3 4 5」的權值變大,其它被分對的樣本的權值變小。 f2(x)=0.4236G1(x) + 0.6496G2(x)

此時,獲得的第二個基本分類器sign(f2(x))在訓練數據集上有3個誤分類點(即3 4 5)。

迭代過程3

對於m=3,在權值分佈爲D3 = (0.0455, 0.0455, 0.0455, 0.1667, 0.1667,  0.01667, 0.1060, 0.1060, 0.1060, 0.0455)的訓練數據上,通過計算可得:

    1. 閾值v取2.5時偏差率爲0.1060*3(x < 2.5時取1,x > 2.5時取-1,則6 7 8分錯,偏差率爲0.1060*3),
    2. 閾值v取5.5時偏差率最低爲0.0455*4(x > 5.5時取1,x < 5.5時取-1,則0 1 2 9分錯,偏差率爲0.0455*3 + 0.0715),
    3. 閾值v取8.5時偏差率爲0.1667*3(x < 8.5時取1,x > 8.5時取-1,則3 4 5分錯,偏差率爲0.1667*3)。

因此閾值v取5.5時偏差率最低,故第三個基本分類器爲:

依然仍是原樣本:

此時,被誤分類的樣本是:0 1 2 9,這4個樣本所對應的權值皆爲0.0455,

因此G3(x)在訓練數據集上的偏差率e3 = P(G3(xi)≠yi) = 0.0455*4 = 0.1820。

計算G3的係數:

更新訓練數據的權值分佈:

D4 = (0.125, 0.125, 0.125, 0.102, 0.102,  0.102, 0.065, 0.065, 0.065, 0.125)。被分錯的樣本「0 1 2 9」的權值變大,其它被分對的樣本的權值變小。

f3(x)=0.4236G1(x) + 0.6496G2(x)+0.7514G3(x)

此時,獲得的第三個基本分類器sign(f3(x))在訓練數據集上有0個誤分類點。至此,整個訓練過程結束。

如今,我們來總結下3輪迭代下來,各個樣本權值和偏差率的變化,以下所示(其中,樣本權值D中加了下劃線的表示在上一輪中被分錯的樣本的新權值):

  1. 訓練以前,各個樣本的權值被初始化爲D1 = (0.1, 0.1,0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1);
  2. 第一輪迭代中,樣本「6 7 8」被分錯,對應的偏差率爲e1=P(G1(xi)≠yi) = 3*0.1 = 0.3,此第一個基本分類器在最終的分類器中所佔的權重爲a1 = 0.4236。第一輪迭代事後,樣本新的權值爲D2 = (0.0715, 0.0715, 0.0715, 0.0715, 0.0715,  0.0715, 0.1666, 0.1666, 0.1666, 0.0715);
  3. 第二輪迭代中,樣本「3 4 5」被分錯,對應的偏差率爲e2=P(G2(xi)≠yi) = 0.0715 * 3 = 0.2143,此第二個基本分類器在最終的分類器中所佔的權重爲a2 = 0.6496。第二輪迭代事後,樣本新的權值爲D3 = (0.0455, 0.0455, 0.0455, 0.1667, 0.1667,  0.01667, 0.1060, 0.1060, 0.1060, 0.0455);
  4. 第三輪迭代中,樣本「0 1 2 9」被分錯,對應的偏差率爲e3 = P(G3(xi)≠yi) = 0.0455*4 = 0.1820,此第三個基本分類器在最終的分類器中所佔的權重爲a3 = 0.7514。第三輪迭代事後,樣本新的權值爲D4 = (0.125, 0.125, 0.125, 0.102, 0.102,  0.102, 0.065, 0.065, 0.065, 0.125)。

從上述過程當中能夠發現,若是某些個樣本被分錯,它們在下一輪迭代中的權值將被增大,同時,其它被分對的樣本在下一輪迭代中的權值將被減少。就這樣,分錯樣本權值增大,分對樣本權值變小,而在下一輪迭代中,老是選取讓偏差率最低的閾值來設計基本分類器,因此偏差率e(全部被Gm(x)誤分類樣本的權值之和)不斷下降。

綜上,將上面計算獲得的a一、a二、a3各值代入G(x)中,G(x) = sign[f3(x)] = sign[ a1 * G1(x) + a2 * G2(x) + a3 * G3(x) ],獲得最終的分類器爲:

G(x) = sign[f3(x)] = sign[ 0.4236G1(x) + 0.6496G2(x)+0.7514G3(x) ]。

 

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 還有另一種理解,便可以認爲其模型是加法模型、損失函數爲指數函數、學習算法爲前向分步算法的二類分類學習方法,下個月即12月份會再推導下,而後更新此文。而在此以前,有興趣的能夠參看《統計學習方法》第8.3節或其它相關資料。

3 Adaboost 指數損失函數推導

事實上,在上文1.2節Adaboost的算法流程的步驟3中,咱們構造的各個基本分類器的線性組合

 

 

是一個加法模型,而Adaboost算法實際上是前向分步算法的特例。那麼問題來了,什麼是加法模型,什麼又是前向分步算法呢?

3.1 加法模型和前向分步算法

以下圖所示的即是一個加法模型

 

 

其中,稱爲基函數,稱爲基函數的參數,稱爲基函數的係數。

在給定訓練數據及損失函數的條件下,學習加法模型成爲經驗風險極小化問題,即損失函數極小化問題:

 

 

隨後,該問題能夠做如此簡化:從前向後,每一步只學習一個基函數及其係數,逐步逼近上式,即:每步只優化以下損失函數:

這個優化方法便就是所謂的前向分步算法。

下面,我們來具體看下前向分步算法的算法流程:

  • 輸入:訓練數據集
  • 損失函數:
  • 基函數集:
  • 輸出:加法模型
  • 算法步驟:
    • 1. 初始化
    • 2. 對於m=1,2,..M
  • a)極小化損失函數

獲得參數

  • b)更新

    • 3. 最終獲得加法模型

    就這樣,前向分步算法將同時求解從m=1到M的全部參數()的優化問題簡化爲逐次求解各個(1≤m≤M)的優化問題。

3.2 前向分步算法與Adaboost的關係

    在上文第2節最後,咱們說Adaboost 還有另一種理解,便可以認爲其模型是加法模型、損失函數爲指數函數、學習算法爲前向分步算法的二類分類學習方法。其實,Adaboost算法就是前向分步算法的一個特例,Adaboost 中,各個基本分類器就至關於加法模型中的基函數,且其損失函數爲指數函數。

    換句話說,當前向分步算法中的基函數爲Adaboost中的基本分類器時,加法模型等價於Adaboost的最終分類器

 

 

    你甚至能夠說,這個最終分類器其實就是一個加法模型。只是這個加法模型由基本分類器及其係數組成,m = 1, 2, ..., M。前向分步算法逐一學習基函數的過程,與Adaboost算法逐一學習各個基本分類器的過程一致。

    下面,我們便來證實:當前向分步算法的損失函數是指數損失函數

    時,其學習的具體操做等價於Adaboost算法的學習過程

     假設通過m-1輪迭代,前向分步算法已經獲得

    然後在第m輪迭代獲得。其中,爲:

 

    而未知。因此,如今我們的目標即是根據前向分步算法訓練,使得最終在訓練數據集T上的指數損失最小,即

    針對這種須要求解多個參數的狀況,能夠先固定其它參數,求解其中一兩個參數,而後逐一求解剩下的參數。例如咱們能夠固定,只針對作優化。

    換言之,在面對 這2m個參數都未知的狀況下,能夠:

  1. 先假定已知,求解出
  2. 而後再逐一求解其它未知參數。

    且考慮到上式中的既不依賴也不依賴G,因此是個與最小化無關的固定值,記爲,即,則上式能夠表示爲(後面要屢次用到這個式子,簡記爲):

    值得一提的是,雖然與最小化無關,但依賴於,隨着每一輪迭代而發生變化。

    接下來,即是要證使得上式達到最小的就是Adaboost算法所求解獲得的

    爲求解上式,我們先求再求

    首先求。對於任意,使上式最小的G(x)由下式獲得:

    別忘了,

    跟1.2節所述的偏差率的計算公式對比下:

 

 

    可知,上面獲得的即是Adaboost算法的基本分類器,由於它是在第m輪加權訓練數據時,使分類偏差率最小的基本分類器。換言之,這個即是Adaboost算法所要求的,別忘了,在Adaboost算法的每一輪迭代中,都是選取讓偏差率最低的閾值來設計基本分類器。

    而後求。仍是回到以前的這個式子上:

    這個式子的後半部分能夠進一步化簡,得:

 

    接着將上面求得的

    代入上式中,且對求導,令其求導結果爲0,即獲得使得一式最小的,即爲:

    這裏的跟上文1.2節中的計算公式徹底一致。

    此外,毫無疑問,上式中的即是偏差率:

    即就是被Gm(x)誤分類樣本的權值之和。

   就這樣,結合模型,跟,能夠推出

   從而有:

    與上文1.2節介紹的權值更新公式

    相比,只相差一個規範化因子,即後者多了一個

    因此,整個過程下來,咱們能夠看到,前向分步算法逐一學習基函數的過程,確實是與Adaboost算法逐一學習各個基本分類器的過程一致,二者徹底等價。

    綜上,本節不但提供了Adaboost的另外一種理解:加法模型,損失函數爲指數函數,學習算法爲前向分步算法,並且也解釋了最開始1.2節中基本分類器及其係數的由來,以及對權值更新公式的解釋,你甚至能夠認爲本節就是對上文整個1.2節的解釋。

 

 

4 參考文獻與推薦閱讀

  1. wikipedia上關於Adaboost的介紹:http://zh.wikipedia.org/zh-cn/AdaBoost
  2. 鄒博之決策樹與Adaboost PPT:http://pan.baidu.com/s/1hqePkdY
  3. 鄒博講Adaboost指數損失函數推導的PPT:http://pan.baidu.com/s/1kTkkepD(第85頁~第98頁);
  4. 《統計學習方法 李航著》第8章;
  5. 關於adaboost的一些淺見:http://blog.sina.com.cn/s/blog_6ae183910101chcg.html
  6. A Short Introduction to Boosting:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.93.5148&rep=rep1&type=pdf
  7. 南大周志華教授作的關於boosting 25年的報告PPT:http://vdisk.weibo.com/s/FcILTUAi9m111
  8. 《數據挖掘十大算法》第7章 Adaboost;
  9. http://summerbell.iteye.com/blog/532376
  10. 統計學習那些事:http://cos.name/2011/12/stories-about-statistical-learning/
  11. 統計學習基礎學習筆記:http://www.loyhome.com/%E2%89%AA%E7%BB%9F%E8%AE%A1%E5%AD%A6%E4%B9%A0%E7%B2%BE%E8%A6%81the-elements-of-statistical-learning%E2%89%AB%E8%AF%BE%E5%A0%82%E7%AC%94%E8%AE%B0%EF%BC%88%E5%8D%81%E5%9B%9B%EF%BC%89/
  12. PRML第十四章組合模型讀書筆記:http://vdisk.weibo.com/s/DmxNcM5_IaUD
  13. 順便推薦一個很是實用的在線編輯LaTeX 公式的網頁:http://www.codecogs.com/latex/eqneditor.php?lang=zh-cn
相關文章
相關標籤/搜索