zoukankan      html  css  js  c++  java
  • 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}^nalpha _mh(x; heta_m)$

          其中$h(x; heta_m)$是一个个的弱分类器,$ heta_m$是弱分类器学习到的最优参数;$alpha_m$就是若学习在强分类器中所占的比重;$P$是所有$alpha_m$和$ heta_m$的组合。这些弱分类器线性相加组成强分类器。

          (2) 前向分布就是说在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。也就是可以协成这样的形式:

    $F_m (x)=F_{m-1}(x)+alpha _mh(x; heta_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_iin Xsubseteq mathbb{R}^{n},y_iin 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 ightarrow {-1, +1}$

     

    (b) 计算$G_m(x)$在训练集上的分类误差率$e_m$

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

        $I(G_m(x_i) eq 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}lnfrac{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_ialpha_mG_m(x_i))$,$i=1,2,3,...n$

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

    $Z_m=sum_{i=1}^{n}w_{mi}exp(-y_ialpha_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)=egin{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) eq y_i)=sum_{G_1(x_i) eq y_i}w_{1i}=0.1+0.1+0.1=0.3$

    2> 计算$G_1(x)$的系数:

    $alpha_1=frac{1}{2}lnfrac{1-e_1}{e_1}=frac{1}{2}lnfrac{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)=egin{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) eq y_i)=sum_{G_2(x_i) eq y_i}w_{2i}=0.07143+0.07143+0.07143=0.21429$

    2> 计算$G_2(x)$的系数:

    $alpha_2=frac{1}{2}lnfrac{1-e_2}{e_2}=frac{1}{2}lnfrac{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)=egin{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) eq y_i)=sum_{G_3(x_i) eq y_i}w_{3i}=0.04546+0.04546+0.04546+04546=0.18184$

    2> 计算$G_3(x)$的系数:

    $alpha_3=frac{1}{2}lnfrac{1-e_3}{e_3}=frac{1}{2}lnfrac{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

  • 相关阅读:
    Python基础语法 第2节课(数据类型转换、运算符、字符串)
    python基础语法 第5节课 ( if 、 for )
    python基础语法 第4节课 (字典 元组 集合)
    Python基础语法 第3节课 (列表)
    A. Peter and Snow Blower 解析(思維、幾何)
    C. Dima and Salad 解析(思維、DP)
    D. Serval and Rooted Tree (樹狀DP)
    C2. Balanced Removals (Harder) (幾何、思維)
    B. Two Fairs 解析(思維、DFS、組合)
    D. Bash and a Tough Math Puzzle 解析(線段樹、數論)
  • 原文地址:https://www.cnblogs.com/liuq/p/9927580.html
Copyright © 2011-2022 走看看