周志华 AdaBoost报告总结

集成学习:利用多个学习器来解决机器学习问题。

按集成学习中个体学习器的生成方式来说,集成学习可分为:

  1. Sequntial methods
    • AdaBoost
    • Arc-x4
    • LPBoost
    • ……
  2. Parallel methods
    • Bagging
    • Random Subspace
    • Random Froests
    • ……

本文主要关注AdaBoost。

AdaBoost是一种集成学习算法,主要思想是在数据集上训练多个弱学习器,将多个弱学习器的预测结果进行加权结合输出最终预测结果。

AdaBoost算法特点有:

  1. 实现简单,效果好
  2. 发展出了一族算法
  3. 有很好的理论基础:训练误差指数下降,泛化误差有上限

一、实现简单,效果好

1.1 直观解释

在数据集上训练一系列弱学习器,后一个若学习器更加关注前一个若学习器预测错误的样本,最后将这些学习器加权结合。流程如下图所示:

在这里插入图片描述

对于数据集1训练学习器1,然后对数据集1的样本权重调整,使得预测错误的样本的权重更大,形成了数据集2,训练学习器2,再次调整权重,训练学习器3,等等,最后将所有学习器结合。

1.2 原理

AdaBoost的代码只有10行左右,原理也是非常简单。我们先来看一下AdaBoost算法到底是什么。

给定训练集: ( x 1 , y 1 ) , , ( x m , y m ) ; x i X , y i { 1 , + 1 } \left( x _ { 1 } , y _ { 1 } \right) , \ldots , \left( x _ { m } , y _ { m } \right) ; x _ { i } \in \mathcal { X } , y _ { i } \in \{ - 1 , + 1 \}

初始化权重: D 1 ( i ) = 1 / m D _ { 1 } ( i ) = 1 / m

循环开始:训练轮数t = 1 , … , T :
h t = arg min h j H ϵ j = i = 1 m D t ( i ) [ y i h j ( x i ) ] h _ { t } = \arg \min _ { h _ { j } \in \mathcal { H } } \epsilon _ { j } = \sum _ { i = 1 } ^ { m } D _ { t } ( i ) \left[ y _ { i } \neq h _ { j } \left( x _ { i } \right) \right ]

 If  ϵ t 1 / 2  then stop  \text { If } \epsilon _ { t } \geq 1 / 2 \text { then stop }

Set α t = 1 2 log ( 1 ϵ t ϵ t ) \operatorname { Set } \alpha _ { t } = \frac { 1 } { 2 } \log \left( \frac { 1 - \epsilon _ { t } } { \epsilon _ { t } } \right)

D t + 1 ( x ) = D t ( x ) Z t × { exp ( α t ) ,  if  h t ( x ) = f ( x ) exp ( α t ) ,  if  h t ( x ) f ( x ) \mathcal { D } _ { t + 1 } ( \boldsymbol { x } ) = \frac { \mathcal { D } _ { t } ( \boldsymbol { x } ) } { Z _ { t } } \times \left\{ \begin{array} { l l } { \exp \left( - \alpha _ { t } \right) , } & { \text { if } h _ { t } ( \boldsymbol { x } ) = f ( \boldsymbol { x } ) } \\ { \exp \left( \alpha _ { t } \right) , } & { \text { if } h _ { t } ( \boldsymbol { x } ) \neq f ( \boldsymbol { x } ) } \end{array} \right.
 Update  = D t ( i ) exp ( α t y i h t ( x i ) ) Z t  where  Z t  is normalisation factor  \begin{array} { c } { \text { Update } } \\ { \quad = \frac { D _ { t } ( i ) \exp \left( - \alpha _ { t } y _ { i } h _ { t } \left( x _ { i } \right) \right) } { Z _ { t } } } \\ { \text { where } Z _ { t } \text { is normalisation factor } } \end{array}

循环结束

最终的分类器:
H ( x ) = sign ( t = 1 T α t h t ( x ) ) H ( x ) = \operatorname { sign } \left( \sum _ { t = 1 } ^ { T } \alpha _ { t } h _ { t } ( x ) \right)
t t 代表训练轮数, h t h_t 表示找到能够使训练误差 ϵ j \epsilon _ { j } 最小的 h j h_j (学习器),如果 ϵ j \epsilon _ { j } 大于 1 / 2 1/2 表示该 h j h_j 在训练集上都不如随机猜来的好(例如:二元分类问题,随机猜测,错误率在0.5左右,如果大于0.5则表示不如随机猜测的好),则丢弃该 h j h_j ,继续寻找好的 h j h_ j

步骤3(Set开头的行)计算权重,步骤4(Set的下一行)更新样本权重,将预测错误的样本的权重设置的更大,怎么做到的呢?注意到 α t > 0 \alpha_t > 0 ,步骤4的分子包含指数函数,预测错误时: e x p ( α t ) > 1 > e x p ( α t ) exp(\alpha_t) >1>exp(-\alpha_t) ,这样就对预测错误的样本设置了更大的权重,在下一次迭代时,根据步骤1,权重更大的样本对 ϵ j \epsilon _ { j } 的影响更大,也就是受到了更多的关注。

最后一步是将学习得到的学习器加权结合,即将弱学习器结合成强学习器。

二、AdaBoost理论发展简介

1989年:提出了“weakly learnable ?= strong learnable”,(弱学习器 ?= 强学习器) 问题,即弱学习器是否能够变成强学习器。

弱学习器:性能较弱,比如:二元分类问题,预测准确率只比随机猜测好一点

强学习器:性能强,分类精度很高

1990年:Schapire 构造性证明了 弱学习器==强学习器,提出了第一个Boosting 算法。

1997年:Freund & Schapire给出了AdaBoost算法实现

……

2013 年:周志华教授给出了Margin distribution更好的界,给出average Margin和 Margin Variance对预测结果的影响,AdaBoost最大化的是Margin distribution,该方法具有了坚实的理论基础。

可见,AdaBoost从一开始就是为了解决理论问题提出的,所以该方法在后来的发展中都有具体的理论背景。

三、AdaBoost算法的迷之问题

在对AdaBoost算法的研究过程中,人们发现AdaBoost算法没有随着训练轮数的增加而出现过拟合现象,违背的奥卡姆剃刀原则。

奥卡姆剃刀原则:如果对于同一现象有两种或多种不同的假说,我们应该采取比较简单那一种。

在这里插入图片描述

对于上图,训练8轮左右,训练集损失已经为0了,轮数增加测试集损失继续下降,这就违反了奥卡姆剃刀原则:训练8轮的模型已经在训练集上最优了,而且模型复杂度肯定比不上训练1000轮的,1000轮的模型在训练集上仍然损失为0,但是其测试集误差却更低。也就是说对于训练集选择简单的假说,即训练8轮的模型,根据奥卡姆剃刀原则,该模型应该是最好的,现实却是很复杂的模型比简单的好。

为了解释AdaBoost不会过拟合的原因,学术界出现了两个派别,一种是从统计学的观点来解释,一种是从计算机科学的角度来解释,从计算机角度来的解释比较直观,提出了间隔理论,即随着训练轮数的增加,即使训练误差为0,继续训练可以提高间隔,间隔增加,则预测性能就会提高。了解SVM算法的话应该比较熟悉间隔,间隔就是样本离划分超平面的距离。

参考

Boosting 25年

The AdaBoost Algorithm

机器学习 周志华

猜你喜欢

转载自blog.csdn.net/weixin_35576881/article/details/85114238