目录
- Boosting简介
- AdaBoost
- 1. 基本思路
- 2. 算法过程
- 3. 算法解释
- 3.1 加法模型
- 3.2 指数损失函数
- 3.3 前向分步算法
- 3.4 推导证明
- 3.4.1 优化 G m ( x ) G_m(x) Gm(x)
- 3.4.2 优化 α m \alpha_m αm
机器学习中有一类集成学习算法,它基于一组弱学习器进行组合提升,得到具有优越性能的强学习器。集成学习策略主要有boosting和bagging两大类。本文要介绍的AdaBoost就是boosting的重要代表。
Boosting简介
Boosting基本思想:通过改变训练数据的概率分布(训练数据的权值分布),学习多个弱分类器,并将它们线性组合,构成强分类器。Boosting算法要求基学习器能对特定的数据分布进行学习,这可通过“重赋权法”实施。对无法接受带权样本的基学习算法,则可通过“重采样法”来处理。
AdaBoost
1. 基本思路
俗话说“三个臭皮匠,顶个诸葛亮”,AdaBoost算法就认为综合多个学习器得出的判断要比单独的学习器的判断要更可靠。那么它就要训练得到若干个不同的基学习器,再将它们进行组合。
这里有两个步骤:第一是训练基学习器,基学习器之间必须是不同的,要么是不同的模型,要么模型一样但是参数不一样。要不然一样的学习器只能得到一样的结果,对我们最终的判断没有任何助益。如果我们选用的基学习器都相同的话,那么就要对数据进行一定的操作 (重赋权or重采样) 使得训练得到不同的参数。AdaBoost 采用重赋权法,每训练出一个学习器后,改变样本的权值,使得被分类错误的样本拥有更大的权重,这样在下一轮的训练中将会更加关注这些错分样本,最终得到一个相对好的结果。第二步是基学习器的线性组合,AdaBoost采用加权多数表决,即分类误差率低的基学习器有更大的权重,进行线性组合。
2. 算法过程
假设一个二分类训练数据集 .
(1)初始化权值分布
训练数据的权值分布,初始状态假设训练数据集具有均匀的权值分布,即每个训练样本在基分类器的学习中作用相同。
(2)对 ,进行以下步骤:
① 学习得到基本分类器
使用具有权值分布的训练数据集进行学习,得到基本分类器 , 可以根据输入给出+1或-1的输出。
② 计算的分类误差率 其中, 是指示函数,当后面括号里的式子成立就取1,不成立就取0。所以
③ 计算 的系数 其中 相当于基本分类器的权重,前面说误差率低的分类器要有较大的权重,我们这里先介绍 的这种形式能够实现我们的需求,后面会进一步介绍这是有严格的推导的,它为什么刚刚好就是这种形式。
从上图不难看出,取值在0到正无穷,且大的小,小的大,是符合我们的逻辑的。这里解释一下分类误差率 为什么小于等于1/2. 因为对于二分类问题,错误率超过0.5的话,只要进行简单的完全反转就可以使其降到0.5以下。举例来说,若 分类结果为 [1,1,1,-1] 错误率0.75,那么只要改成 [-1,-1,-1,1] 错误率就只有0.25了。(另一种想法是随机分类的错误率是0.5,弱学习器虽然弱,正确率也是要略高于随机分类的。
④ 更新训练数据集的权值分布 这里的公式看起来很复杂,其实思想是很简单的,我们一步步看。首先, 是规范化因子,它将 映射到0~1的范围内,使之成为一个概率分布。的值其实就是将所有的
然后再看 ,我们就可以先忽略掉 去理解。如果分类器 将一个样本分类正确,说明要么真实值 为1 预测结果也为1,要么真实为-1 预测也为-1,它们总是同号的,此时 ,如果分类错误则 .所以可以将原来的式子写成 (先忽略) : 可以看出,当分类正确,会在原来的权重基础上乘上 ,是小于0的,于是权重被进一步缩小,而错分样本的权重会放大,且被放大了
(3) 得到最终分类器 其中,是符号函数,若括号内取值小于0则输出-1,大于0则输出1。对个基本分类器进行加权表决,系数
算法描述到这里就结束了,总结一下就是:首先初始化权值分布,然后进入迭代,在每一轮中,依次计算分类器 ,分类错误率,系数,并改变得到下一轮的权值分布 ,当满足迭代停止条件则退出,对得到的若干基分类器进行加权求和,得到最终的分类器。
3. 算法解释
AdaBoost算法的另一种解释是,可以认为AdaBoost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二分类学习方法。
下面分别解释加法模型、指数损失函数、前向分步算法。
3.1 加法模型
其中,为基函数,为基函数的参数,为基函数的系数。显然,上面构建的基本分类器的线性组合
在给定训练数据和损失函数的条件下,学习加法模型成为损失函数极小化问题:其含义是要求得最优的系数和参数使得损失函数最小,第一个求和号指对所有样本数据求和,第二个是对所有基分类器求和。
讨论:比较前向分步算法和梯度下降算法
这是一个复杂的优化问题,如果使用传统梯度下降,它要一次性优化2M个参数,复杂度很高。而前向分步算法求解的思想是:因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数机器系数,逐步逼近优化目标函数式,那么就可以简化优化的复杂度。
3.2 指数损失函数
3.3 前向分步算法
输入:训练数据集 ; 损失函数; 基函数集
输出:加法模型
(1)初始化
(2)对,依次进行:
- ① 极小化损失函数得到
- ② 更新
(3)得到加法模型
这样,前向分步算法将同时求解从m=1到M所有参数的优化问题简化为主次求解各个的问题。可以看出AdaBoost是前向分步算法的特例,其基函数是基本分类器,损失函数是指数损失函数。
3.4 推导证明
现在我们要进行推导证明,用基函数是基本分类器、损失函数是指数损失函数的前向分步算法对进行优化,求得的结果就是我们上面介绍AdaBoost时给出的形式。
第 m 轮迭代得到 ,而 这是容易理解的,第m轮的是【新得到的分类器】 加上前【m-1轮分类器累加得到的】
目标是使前向分步算法得到的 和 使 在训练集上的指数损失最小,即 其中,,第一个式子到第二个式子就是把指数部分拆开。现在要证明使这个式子达到最小的就是AdaBoost算法得到的.
3.4.1 优化
使右边式子值最小的G就是我们要求的最优G*,但是我们知道AdaBoost算法的基本分类器使第m轮加权训练数据分类误差率最小,而第m轮加权训练数据分类误差率就是求和号及其后面的部分。所以,此处 也就是AdaBoost算法得到的 .
3.4.2 优化
损失函数对 求导,令导数为0,得到的
先对上面经过一定变形的损失函数进行进一步变换,由于有两种取值,我们可以将其拆开: 第二个等号就是将 提到求和号前面,第三个等号是加上并减去 分别和原来的两项组合。第一个大括号内变成 ,第二个大括号内变成
整理一下就得到: 求偏导并令求导结果为0: 也就得到一个等式关系,并在等式两边取对数: 而此处,对数里面的分母就是分类误差率 ,就得到上面的结果
最后最后,我们知道在AdaBoost中计算了后面就要更新权值,因为,所以: 和AdaBoost中的结果也是一样的,除了没进行规范化之外。顺带一提,也表达了AdaBoost将损失函数视为训练数据权值的思想。