Adaboost算法流程及示例


1. Boosting提升方法(源自統計學習方法)

       提升方法是一種常用的統計學習方法,應用十分廣泛且有效。在分類問題中,它通過改變訓練樣本的權重,學習多個分類器,並將這些分類器進行線性組合,提高分類的性能。提升算法基於這樣一種思路:對於一個復雜任務來說,將多個專家的判斷進行適當的綜合所得出的判斷,要比其中任何一個專家獨斷的判斷好。實際上,就是“三個臭皮匠頂個諸葛亮”的道理。

       歷史上,Kearns和Valiant首先提出了“強可學習(Strongly learnable)”和“弱可學習(Weekly learnable)”的概念。支出:在概率近似正確(probably approximately correct,PAC)學習框架中,一個概念(一個分類),如果存在一個多項式的學習算法能夠學習它,並且正確率很好,那么就稱這個概念是強可學習的;一個概念(一個分類),如果存在一個多項式的學習算法能夠學習它,但學習的正確率僅比隨機猜測略好,那么就稱這個概念是弱可學習的。非常有趣的是Schapire后來證明強可學習與弱可學習是等價的,也就是說,在PAC學習框架下,一個概念是強可學習的充要條件是這個概念是弱可學習的。

       這樣一來,問題便成為,在學習中,如果已經發現了“弱學習算法”,那么能否將它提升(boost)為“強學習算法”。大家知道,發現弱學習算法通常要比發現強學習算法容易得多。那么如何具體實施提升,便成為開發提升方法時所要解決的問題。關於提升方法的研究很多,有很多算法被提出,最具代表性的是AdaBoost算法(Adaboost algorithm)。

       對與分類問題而言,給定一個訓練樣本集,求比較粗糙的分類規則(弱分類器)要比求精確的分類規則(強分類器)容易得多。提升方法就是從弱學習算法出發,反復學習,得到一系列分類器,然后組合這些分類器,構成一個強分類器。

       這樣,對於提升算法來說,有兩個問題需要回答:一是在每一輪如何改變訓練數據的權值分布;二是如何將弱分類器組合成一個強分類器。

 

      Boosting算法要涉及到兩個部分,加法模型前向分步算法。

      (1) 加法模型就是說強分類器由一系列弱分類器線性相加而成。一般組合形式如下:

$F_M(x;P)=\sum_{m=1}^n\alpha _mh(x;\theta_m)$

      其中$h(x;\theta_m)$是一個個的弱分類器,$\theta_m$是弱分類器學習到的最優參數;$\alpha_m$就是若學習在強分類器中所占的比重;$P$是所有$\alpha_m$和$\theta_m$的組合。這些弱分類器線性相加組成強分類器。

      (2) 前向分布就是說在訓練過程中,下一輪迭代產生的分類器是在上一輪的基礎上訓練得來的。也就是可以協成這樣的形式:

$F_m (x)=F_{m-1}(x)+\alpha _mh(x;\theta_m)$

       由於采用的損失函數不同,Boosting算法也因此有了不同的類型,AdaBoost就是損失函數為指數損失的Boosting算法。

2. Adaboost算法

Adaboost算法思想:

1) 提高那些被前一輪弱分類器錯誤分類的樣本的權值,降低那些被正確分類的樣本的權值;

2) 采用加權多數表決的方法。具體的,加大分類誤差率小的弱分類器的權值,使其在表決中起較大的作用;減小分類誤差率大的弱分類器的權值,使其在表決中起較小的作用。

Adaboost算法流程:

輸入:訓練數據集$T=\{(x_1, y_1),(x_2, y_2),(x_3, y_3),...(x_n, y_n)\}$,其中$x_i\in X\subseteq \mathbb{R}^{n},y_i\in Y=\{-1,+1\}$,$Y=\{-1, +1\}$是弱分類算法。

輸出:最終分類器$G_m(x)$

初始化:假定第一次訓練時,樣本均勻分布權值一樣。

 $D_1=(w_{11}, w_{12},w_{13}......w_{1n})$

              其中$w_{1i}=\frac{1}{n},i=1,2,3...n$

循環:m=1,2,3...M,

(a) 使用具有權值分布$D_m$的訓練數據集學習,得到基本分類器$G_m$(選取讓誤差率最低的閾值來設計基本分類器):

$G_m(x):\chi \rightarrow \{-1, +1\}$

 

(b) 計算$G_m(x)$在訓練集上的分類誤差率$e_m$

$e_m=P(G_m(x_i)\neq y_i)=\sum_{i=1}^{n}w_{mi}I(G_m(x_i)\neq y_i)$

    $I(G_m(x_i)\neq y_i)$:當$G_m(x_i)$與$y_i$相等時,函數取值為0;當$G_m(x_i)$與$y_i$不相等時,取值為1;。

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

 

(c) 計算$G_m(x)$的系數$\alpha_m$,$\alpha_m$表示$G_m(x)$在最終分類器中的重要程度:

$\alpha_m = \frac{1}{2}ln\frac{1-e_m}{e_m}$

    【注】顯然$e_m <= 1/2$時,$\alpha_mam >= 0$,且$\alpha_m$隨着$e_m$的減小而增大,意味着分類誤差率越小的基本分類器在最終分類器中的作用越大

      此時分類器為:$f_m(x)=\alpha_mG_m(x)$

 

(d) 更新訓練數據集的權值分布,用於下一輪迭代。

$D_{m+1}=(w_{m+1,1},w_{m+1,2},w_{m+1,3},...w_{m+1,n})$

$w_{m+1,i}=\frac{w_{mi}}{Z_m}exp(-y_i\alpha_mG_m(x_i))$,$i=1,2,3,...n$

其中$Z_m$是規范化因子,使得$D_{m+1}$成為一個概率分布。

$Z_m=\sum_{i=1}^{n}w_{mi}exp(-y_i\alpha_mG_m(x_i))$

 

循環結束條件:

$e_m$小於某個閾值(一般是0.5),或是達到最大迭代次數。

AdaBoost 方法中使用的分類器可能很弱(比如出現很大錯誤率),但只要它的分類效果比隨機好一點(比如兩類問題分類錯誤率略小於0.5),就能夠改善最終得到的模型。

組合分類器:

$f(x)=\sum_{m=1}^{M}\alpha_mG_m(x)$

最終分類器:

 $G_m(x)=sign(f(x))=sign(\sum_{i=1}^{M}\alpha_mG_m(x))$

 

3. Adaboost示例

假定給出下列訓練樣本。

序號 i 1 2 3 4 5 6 7 8 9 10
數據 x 0 1 2 3 4 5 6 7 8 9
類別標簽 y 1 1 1 -1 -1 -1 1 1 1 -1

初始化$w_{1i}=\frac{1}{n}=0.1$,n=10(樣本個數)

序號
i 1 2 3 4 5 6 7 8 9 10
數據 x 0 1 2 3 4 5 6 7 8 9
類別標簽 y 1 1 1 -1 -1 -1 1 1 1 -1
初始權值 $w_{1i}$ 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1

閾值猜測:觀察數據,可以發現數據分為兩類:-1和1,其中數據“0,1,2”對應“1”類,數據“3,4,5”對應“-1”類,數據“6,7,8”對應“1”類,數據“9”對應“"1”類。拋開單個的數據“9”,可以找到對應的數據分界點(即可能的閾值),比如:2.5、5.5、8.5(一般0.5的往上加,也可以是其他數)。然后計算每個點的誤差率,選最小的那個作為閾值。

                 但在實際操作中,可以每個數據點都做為閾值,然后就算誤差率,保留誤差率最小的那個值。若誤差率有大於0.5的就取反(分類換一下,若大於取1,取反后就小於取1),再計算誤差率。

迭代過程1:m=1

1> 確定閾值的取值及誤差率

  • 當閾值取2.5時,誤差率為0.3。即 x<2.5 時取 1,x>2.5 時取 -1,則數據6、7、8分錯,誤差率為0.3(簡單理解:10個里面3個錯的,真正誤差率計算看下面的表格 )
  • 當閾值取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
  • 當閾值取8.5時,誤差率為0.3。即 x<8.5 時取1,x>8.5 時取 -1,則數據3、4、5分錯,錯誤率為0.3

由上面可知,閾值取2.5 或8.5時,誤差率一樣,所以可以任選一個作為基本分類器。這里選2.5為例。

$G_1(x)=\begin{cases}1, &x<2.5 \\-1, & x>2.5 \end{cases}$

計算誤差率:

序號 i 1 2 3 4 5 6 7 8 9 10
數據 x 0 1 2 3 4 5 6 7 8 9
類別標簽 y 1 1 1 -1 -1 -1 1 1 1 -1
分類器結果 $G_1(x)$ 1 1 1 -1 -1 -1 -1 -1 -1 -1
分類結果  

 從上可得$G_1(x)$在訓練數據集上的誤差率(被分錯類的樣本的權值之和):

$e_1=P(G_1(x_i)\neq y_i)=\sum_{G_1(x_i)\neq y_i}w_{1i}=0.1+0.1+0.1=0.3$

2> 計算$G_1(x)$的系數:

$\alpha_1=\frac{1}{2}ln\frac{1-e_1}{e_1}=\frac{1}{2}ln\frac{1-0.3}{0.3}\approx 0.42365$

這個$\alpha_1$代表$G_1(x)$在最終的分類函數中所占的比重約為0.42365

3> 分類函數

$f_1(x)=\alpha_1G_1(x)=0.42365G_1(x)$

4> 更新權值分布:

序號
i 1 2 3 4 5 6 7 8 9 10
數據 x 0 1 2 3 4 5 6 7 8 9
類別標簽 y 1 1 1 -1 -1 -1 1 1 1 -1
初始權值1 $w_{1i}$ 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
更新權值2 $w_{2i}$ 0.07143 0.07143 0.07143 0.07143 0.07143 0.07143 0.16666 0.16666 0.16666 0.07143

     由上面可以看出,因為數據“6,7,8”被$G_1(x)$分錯了,所以它們的權值由初始的0.1增大到了0.16666;其他的數據由於被分對了,所以權值由0.1減小到0.07143。

 

迭代過程2:m=2

1> 確定閾值的取值及誤差率

  • 當閾值取2.5時,誤差率為0.49998。即 x<2.5 時取 1,x>2.5 時取 -1,則數據6、7、8分錯,誤差率為0.16666*3(取過,不列入考慮范圍)
  • 當閾值取5.5時,誤差率最低為0.28572。即 x<5.5 時取1,x>5.5 時取 -1,則數據3、4、5、6、7、8分錯,錯誤率為0.07143*3+0.16666*3=0.71427>0.5,故反過來,令 x>5.5 取 1,x<5.5 時取 -1,則數據0、1、2、9分錯,誤差率為0.07143*4=0.28572
  • 當閾值取8.5時,誤差率為0.21429。即 x<8.5 時取1,x>8.5 時取 -1,則數據3、4、5分錯,錯誤率為0.07143*3=0.21429

由上面可知,閾值取8.5時,誤差率最小,所以:

$G_2(x)=\begin{cases}1, &x<8.5 \\-1, & x>8.5 \end{cases}$

計算誤差率:

序號 i 1 2 3 4 5 6 7 8 9 10
數據 x 0 1 2 3 4 5 6 7 8 9
類別標簽 y 1 1 1 -1 -1 -1 1 1 1 -1
權值分布  $w_{2i}$ 0.07143 0.07143 0.07143 0.07143 0.07143 0.07143 0.16666 0.16666 0.16666 0.07143
分類器結果 $G_2(x)$ 1 1 1 1 1 1 1 1 1 -1
分類結果  

 從上可得$G_2(x)$在訓練數據集上的誤差率(被分錯類的樣本的權值之和):

$e_2=P(G_2(x_i)\neq y_i)=\sum_{G_2(x_i)\neq y_i}w_{2i}=0.07143+0.07143+0.07143=0.21429$

2> 計算$G_2(x)$的系數:

$\alpha_2=\frac{1}{2}ln\frac{1-e_2}{e_2}=\frac{1}{2}ln\frac{1-0.21429}{0.21429}\approx 0.64963$

這個$\alpha_2$代表$G_2(x)$在最終的分類函數中所占的比重約為0.649263

3> 分類函數

$f_2(x)=\alpha_2G_2(x)=0.64963G_2(x)$

4> 更新權值分布:

序號
i 1 2 3 4 5 6 7 8 9 10
數據 x 0 1 2 3 4 5 6 7 8 9
類別標簽 y 1 1 1 -1 -1 -1 1 1 1 -1
初始權值1 $w_{1i}$ 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
權值2 $w_{2i}$ 0.07143 0.07143 0.07143 0.07143 0.07143 0.07143 0.16666 0.16666 0.16666 0.07143
更新權值3 $w_{3i} 0.04546 0.04546 0.04546 0.16667 0.16667 0.16667 0.10606 0.10606 0.10606 0.04546

 

迭代過程3:m=3

1> 確定閾值的取值及誤差率

  • 當閾值取2.5時,誤差率為0.31818。即 x<2.5 時取 1,x>2.5 時取 -1,則數據6、7、8分錯,誤差率為0.10606*3=0.31818(取過,不列入考慮范圍)
  • 當閾值取5.5時,誤差率最低為0.18184。即 x<5.5 時取1,x>5.5 時取 -1,則數據3、4、5、6、7、8分錯,錯誤率為0.16667*3+0.10606*3=0.81819>0.5,故反過來,令 x>5.5 取 1,x<5.5 時取 -1,則數據0、1、2、9分錯,誤差率為0.04546*4=0.18184
  • 當閾值取8.5時,誤差率為0.13638。即 x<8.5 時取1,x>8.5 時取 -1,則數據3、4、5分錯,錯誤率為0.04546*3=0.13638(取過,不列入考慮范圍)

由上面可知,閾值取8.5時,誤差率最小,但8.5取過了,所以取5.5:

$G_3(x)=\begin{cases}-1, &x<5.5 \\1, & x>5.5 \end{cases}$

計算誤差率:

序號 i 1 2 3 4 5 6 7 8 9 10
數據 x 0 1 2 3 4 5 6 7 8 9
類別標簽 y 1 1 1 -1 -1 -1 1 1 1 -1
權值分布  $w_{3i}$ 0.04546 0.04546 0.04546 0.16667 0.16667 0.16667 0.10606 0.10606 0.10606 0.04546
分類器結果 $G_3(x)$ -1 -1 -1 -1 -1 -1 1 1 1 1
分類結果  

 從上可得$G_3(x)$在訓練數據集上的誤差率(被分錯類的樣本的權值之和):

$e_3=P(G_3(x_i)\neq y_i)=\sum_{G_3(x_i)\neq y_i}w_{3i}=0.04546+0.04546+0.04546+04546=0.18184$

2> 計算$G_3(x)$的系數:

$\alpha_3=\frac{1}{2}ln\frac{1-e_3}{e_3}=\frac{1}{2}ln\frac{1-0.18188}{0.18184}\approx 0.75197$

這個$\alpha_3$代表$G_3(x)$在最終的分類函數中所占的比重約為0.75197

3> 分類函數

$f_3(x)=\alpha_3G_3(x)=0.75197G_3(x)$

4> 更新權值分布:

序號
i 1 2 3 4 5 6 7 8 9 10
數據 x 0 1 2 3 4 5 6 7 8 9
類別標簽 y 1 1 1 -1 -1 -1 1 1 1 -1
初始權值1 $w_{1i}$ 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
權值2 $w_{2i}$ 0.07143 0.07143 0.07143 0.07143 0.07143 0.07143 0.16666 0.16666 0.16666 0.07143
權值3 $w_{3i} 0.04546 0.04546 0.04546 0.16667 0.16667 0.16667 0.10606 0.10606 0.10606 0.04546
更新權值4 $w_{4i} 0.12500 0.12500 0.12500 0.10185 0.10185 0.10185 0.06481 0.06481 0.06481 0.12500

迭代過程4:m=4

此時觀察數據,每次迭代被分錯的數據都已經重新分配過權值,按其他參考資料來說,此時的誤差率為0,所以迭代可以到此結束。

最終分類器:

$G_m(x)=sign(0.42365G_1(x)+0.64963G_2(x)0.75197G_3(x))$

 

---------------------  
參考文獻:
原文:https://blog.csdn.net/gyqjn/article/details/45501185


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM