AdaBoost算法简介
AdaBoost算法的全称是自适应Boosting(Adaptive Boosting),是一种二分类器,它用弱分类器的线性组合构造强分类器。弱分类器的性能不用太好,只需要比随机猜测强,依靠它们可以构造出一个非常准确的强分类器。强分类器的计算公式为:
其中x是输入向量,F(x)是强分类器,是弱分类器,
是弱分类器的权重值,是一个正数,T为弱分类器的数量。弱分类器的输出值为+1或-1,分别对应于正样本和负样本。分类时的判定规则为:
其中sgn是符号函数。强分类器的输出值也为+1或-1,同样对应于正样本和负样本。弱分类器和它们的权重值通过训练算法得到。之所以叫弱分类器是因为它们的精度不用太高。
训练算法
训练时,依次训练每一个弱分类器,并得到它们的权重值。训练样本同样带有权重,初始时所有样本的权重相等,被前面的弱分类器错分的样本会加大权重,反之会减小权重,因此接下来的弱分类器会更加关注这些难分的样本。弱分类器的权重值根据它的准确率构造,精度越高的弱分类器权重越大。给定l个训练样本( ,
),其中
是特征向量,
为类别标签,其值为+1或-1。训练算法的流程如下:
初始化样本权重值,所有样本的初始权重相等:
循环,对t=1,…,T依次训练每个弱分类器:
训练一个弱分类器 ,并计算它对训练样本集的错误率
计算弱分类器的权重:
更新所有样本的权重:
其中为归一化因子,它是所有样本的权重之和:
结束循环
最后得到强分类器:
根据弱分类器权重的计算公式,错误率低的弱分类器权重大,它是准确率的增函数。在SIGAI之前的公众号文章“大话AdaBoost算法”中,我们给出了一个形象的例子。每个弱分类器类似于一个水平不太高的医生,如果在之前的考核中一个医生的技术更好,对病人情况的判断更准确,那么可以加大他在会诊时说话的分量即权重。而强分类器就是这些医生的结合。
给训练样本加权重是有必要的,如果样本没有权重,每个弱分类器的训练样本是相同的,训练出来的弱分类器也是一样的,这样训练多个弱分类器没有意义。AdaBoost算法的原则是:
关注之前被错分的样本,准确率高的弱分类器有更大的权重。
上面的算法中并没有说明弱分类器是什么样的,具体实现时我们应该选择什么样的分类器作为弱分类器?一般用深度很小的决策树。强分类器是弱分类器的线性组合,如果弱分类器是线性函数,无论怎样组合,强分类器都是线性的,因此应该选择非线性的分类器做弱分类器。
训练算法的推导
AdaBoost看上去是一个脑洞大开想出来的算法,你可能会问:为什么弱分类器的权重计算公式是这样的?为什么样本权重的更新公式是这样的?事实上,它们是有来历的。我们可以用广义加法模型+指数损失函数来推导出AdaBoost的训练算法。
广义加法模型拟合的目标函数是多个基函数的线性组合:
其中 ,为基函数的参数,
为基函数的权重系数。训练时这个模型要确定的是基函数的参数和权重值。训练的目标是最小化对所有样本的损失函数:
这是指数损失函数。如果标签值与强分类器的预测值越接近,损失函数的值越小,反之越大。使用指数损失函数而不用均方误差损失函数的原因是均方误差损失函数对分类问题的效果不好。将广义加法模型的拟合函数代入指数损失函数中,得到算法训练弱分类器时要优化的目标函数为:
这里将指数函数拆成了两部分,已有的强分类器,以及当前弱分类器对训练样本的损失函数,前者在之前的迭代中已经求出,可以看成常数。目标函数可以简化为:
其中:
它只和前面的迭代得到的强分类器有关,与当前的弱分类器、弱分类器权重无关,这就是样本权重。这个最优化问题可以分两步求解,首先将 看成常数,由于
和
的取值只能为+1或-1,要让上面的目标函数最小化,必须让二者相等。因此损失函数对f(x)的最优解为:
其中I是指标函数,根据括号里的条件是否成立其取值为0或1。上式的最优解是使得对样本的加权误差率最小的分类器。得到弱分类器之后,优化目标可以表示成 的函数:
上式前半部分是被正确分类的样本,后半部分是被错误分类的样本。这可以写成:
具体推导过程为:
函数在极值点的导数为0,即:
由此得到关于的方程:
最优解为:
其中 为弱分类器对训练样本集的加权错误率:
对逼近函数做如下更新:
导致下次迭代时样本的权重为:
这就是样本权重的更新公式。AdaBoost训练算法就是求解上述最优化问题的过程