天天看点

Adaboost算法的初步理解

  菜鸟初次接触Adaboost,虽然算法流程比较清晰简单,但对于其中的理论,存在着不少疑惑之处,如下所示:

1)如何训练得到的弱分类器,我们需要训练出多少个弱分类器进行后续的计算?对若分类器有什么要求吗?

2)加法模型有什么好处?

3)最后得到的强分类器是如何体现出分类效果的?迭代次数是不是需要最终err为0才迭代结束?

4)该算法存在过拟合现象吗?

5)我们可不可以对迭代的过程进行实例化?可不可以用几何直观的方式去体现出来?

6)Adaboost有哪些具体的实际应用?

本文主要针对这6个问题进行叙述,若存在错误之处,恳请大神们不吝指出。

问题1

    对于Adaboost的弱分类函数,众多博客基本是上直接给出训练后的线性函数(感觉那些博客里简单的事例都能目测出几个弱分类函数),可能是为了方便理解读者Adaboost的过程,这些细枝末节没有进行详细赘述,但是对于菜鸟而言,还是需要知道这个弱分类器是怎么得来的,因为这是后面进行Adaboost的前提,因此本文想尝试剖析其过程。本文打算用一些简单的数据进行计算(借鉴的这篇博客的数据https://blog.csdn.net/guyuealian/article/details/70995333),如下所示:

序号 1 2 3 4 5 6 7 8 9 10
样本点X (1,5) (2,2) (3,1) (4,6) (6,8) (6,5) (7,9) (8,7) (9,8) (10,2)
类别Y 1 1 -1 -1 1 -1 1 1 -1 -1

作图如下:

Adaboost算法的初步理解

     从图中可以看出,我们几乎很难找到一条直线将蓝色(1)与橙色(-1)的点进行完全分开,但是我们可以找到一些线性的弱分类器,进行弱分类,很显然,我们可以找到的弱分类器肯定不止一个,理论上是可以找到无穷多个,但是我们在实际应用中总不能找无穷多个吧,肯定是希望用最少的个数达到想要的效果,对于Adaboost而言,很多的博客中都是找了3个弱分类器,不知道这样选择的个数有什么依据(不知道是不是自己调研得不够全面)。大胆猜测,可能是因为先尝试个数为3的情况,发现效果理想就没继续尝试为4,5,6...的情况。对于弱分类器的基本要求,(1)需要每一个弱分类器满足准确率超过50%,并且弱分类器的准确率直接影响后面的Adaboost的迭代次数;(2)弱分类器之间的差异性不能太小,如果差异太小,进行组合的实际价值不大,对准确率的提高不会明显。

问题2

    对于这个问题,进行了简单的初步理解,由于模型是加法模型,在计算损失函数极小值问题的时候可以进行简化,采用的是向前分步方法,即:每次计算的时候都只学习一个基函数和系数,这样可以简化目标函数的形式,利于计算。

问题3

强分类器是通过公式:

Adaboost算法的初步理解

对其进行效果的评价的,得到的强分类器可以进行验证其效果如何。

对于迭代次数,首先需要预设一个很小的错误率,当错误率低于这个阈值时,迭代结束。

问题4

     是存在过拟合现象的,维基百科的原话是:In some problems it can be less susceptible to the overfitting problem than other learning algorithms. 并不是说不存在过拟合问题,只是过拟合问题没其他的学习算法那么严重。

问题5

    我们拟采用之前问题1中的数据,进行实例化,看看该过程是怎么回事。

算法流程主要是这样的:

  • 给权值进行初始化,D1=[1/N,1/N,1/N,1/N,1/N,1/N,1/N,1/N,1/N,1/N]=[1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10,1/10],即:
序号 1 2 3 4 5 6 7 8 9 10
样本点X (1,5) (2,2) (3,1) (4,6) (6,8) (6,8) (7,9) (8,7) (9,8) 10,2)
类别Y 1 1 -1 -1 1 -1 1 1 -1 -1
D1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
  • 给出3个弱分类器为H1(x=3.5),H2(x=7.5),H3(y=4)

我们可以明显的看出,三个弱分类器的err都为0.1+0.1+0.1+0.1=0.4,所以我们可以任意挑一个弱分类器,那就先用H1:

在H1的情况下,误差率e1=0.4,我们可以使用公式计算得到:

Adaboost算法的初步理解

此时所得的强分类器为G1(x)=sign(0.2027H1),作图如下:

Adaboost算法的初步理解

从图中可以看出,迭代一次后的分类效果并没有提高。

  • 更新权值D:
序号 1 2 3 4 5 6 7 8 9 10
样本点X (1,5) (2,2) (3,1) (4,6) (6,8) (6,8) (7,9) (8,7) (9,8) 10,2)
类别Y 1 1 -1 -1 1 -1 1 1 -1 -1
D2 1/12 1/12 1/8 1/12 1/8 1/12 1/8 1/8 1/12 1/12

再重新计算每个弱分类器的误差率

当弱分类器为H1时,err=1/8+1/8+1/8+1/8=1/2;

当弱分类器为H2时,err=1/8+1/12+1/12+1/8=5/12;

当弱分类器为H3时,err=1/12+1/12+1/12+1/12=1/3;

可见,误差率最小的是H3,因此下一次迭代选用H3:

在H3的情况下,误差率e2=1/3,我们可以使用公式计算得到:

Adaboost算法的初步理解

此时所得的强分类器为G2(x)=sign(0.2027H1+0.3466H3),作图如下:

Adaboost算法的初步理解

我们来仔细分析一下,两条直线分成四个区域,我分别命名为1,2,3,4象限,并分别计算出G2(x)的值,结果如下图所示:

Adaboost算法的初步理解

    我们从图中看出,虽然又迭代了一次,但似乎准确率并没有提高,1象限误判了一个点,2象限没有点,3象限误判了两个点,4象限误判了一个点,总共还是误判了4个点,准确率似乎没有提高。

  • 更新权值D:
序号 1 2 3 4 5 6 7 8 9 10
样本点X (1,5) (2,2) (3,1) (4,6) (6,8) (6,8) (7,9) (8,7) (9,8) 10,2)
类别Y 1 1 -1 -1 1 -1 1 1 -1 -1
D3 1/16 1/16 3/16 1/16 3/16 1/16 3/16 3/16 1/16 1/16

再重新计算每个弱分类器的误差率

当弱分类器为H1时,err=3/16+3/16+3/16+3/16=3/4;

当弱分类器为H2时,err=3/16+1/16+1/16+3/16=1/2;

当弱分类器为H3时,err=1/16+1/16+1/16+1/16=1/4;

可见,误差率最小的是H3,因此下一次迭代选用H3:

在H3的情况下,误差率e3=1/4,我们可以使用公式计算得到:

Adaboost算法的初步理解

此时所得的强分类器为G3(x)=sign(0.2027H1+0.3466H3+0.5493H3),作图如下:

Adaboost算法的初步理解

    我们可以看到并没有达到预期的效果,我们不妨大胆假设一下,就算再继续迭代下去n次,效果依然如此,为什么会出现这样的情况?症结何在呢?我想,是因我们的弱分类器没有选择好,导致出现这样的情况。我们选择的弱分类器H2一直都没选择用于迭代,可见弱分类器的选择是多么有技巧的事情啊!

    跟博客(https://blog.csdn.net/guyuealian/article/details/70995333)相比,该作者选择的弱分类器十分的巧妙,巧妙之处在于初始的误差率就比较低,而且,在第二次迭代的时候可以刚好让H2作为第二次迭代,这样不仅可以快速的达到预期的结果,而且不会出现本文中这样的不收敛的情况。

    关于adaboost的应用十分广泛,有文本识别、图像识别等领域,特别是图像识别领域,从国外的文献看,很多年以前就已经很成熟了。

继续阅读