一、模型介绍
Adaboost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。Adaboost 算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次得到的分类器最后融合起来,作为最后的决策分类器。
二、模型原理
原理:
AdaBoost 在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率。每一个训练样本都被赋予一个权重,表明它被某个分类器选入训练集的概率。如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。通过这样的方式,AdaBoost 方法能“聚焦于”那些较难分(更富信息)的样本上。在具体实现上,最初令每个样本的权重都相等,对于第 k 次迭代操作,我们就根据这些权重来选取样本点,进而训练分类器 C。然后就根据这个分类器,来提高被它分错的的样本的权重,并降低被正确分类的样本权重。然后,权重更新过的样本集被用于训练下一个分类器 C。整个训练过程如此迭代地进行下去。
步骤:
输入样本集 ,输出为 -1 和 +1. 弱分类器算法,弱分类器迭代次数 K。输出最终的强分类器 f(x)
1. 初始化样本集权重
2. 对于 k = 1,2,……k
- a 使用具有权重 的样本集来训练数据,得到弱分类器 。
- b 计算 的分类误差率:
考虑更加周全的 AdaBoost 算法在这一步还应该判断是否满足基本条件(例如生成的基学习器是否比随机猜测好), 如果不满足,则当前基学习器被抛弃,学习过程提前终止。 - c 计算 的系数 (即最终集成使用的的基学习器的权重)
- d 更新训练样本的权重:
其中 是规范化因子,目的是为了使 的所有元素和为1。
3. 构建最终的分类器线性组合
三、模型细节
1 为什么使用 计算弱学习器权重系数?
从上式可以看出,如果分类误差率 越大,则对应的弱分类器权重系数 越小。如果分类误差率 越小,则对应的弱分类器权重系数 越大。即 AdaBoost 能够适应各个弱分类器的训练误差率,这也是它的名称中 “适应性 (Adaptive) ” 的由来。
2 前向分布算法
Adaboost 算法的最终模型表达式为:。可以看到这个是一个‘加性模型’。我们希望这个模型在训练集上的经验误差最小,即:
这是一个复杂的优化问题。前向分布算法求解这一优化问题的思想是:因为最终模型是一个加性模型,如果能从前往后,每一步只学习一个基学习器 及其权重 ,不断迭代得到最终的模型,那么就可以简化问题复杂度。具体的,当我们经过 k-1 轮迭代得到了最优模型 时,因为:
所以此轮优化目标为:
求解上式即可得到第 k 个基分类器 及其权重 。这样,前向分布算法就通过不断迭代求得了 k=1 到 k=K 的所有基分类器及其权重。
3 AdaBoost 算法证明过程
首先要知道 AdaBoost 的损失函数是 指数损失函数。在周志华的书中有说明:指数损失函数是分类任务原本 0/1 损失函数的一致替代损失函数,由于指数损失函数有更好的数学性质,处处可微,所以我们用它代替 0/1 损失作为优化目标。
所以,我们的优化目标为:
因为 与优化变量 无关。
令:
这个 其实就是前面说的归一化之前的权重。
此时优化目标可以写作:
首先对上式展开:
上式中将指数函数换成指示函数是因为前面说的指数损失函数和 0/1 损失函数是一致等价的。
首先求 :
该式子所示的优化问题其实就是 AdaBoost 算法的基学习器的学习过程。得到 是使第 k 轮加权训练数据分类错误最小的基分类器。
再求 ,对其求导:
即得:
其中
这里的 计算表达式就是前文中 计算公式的来源。
再看下一轮的权重更新:
以及
可得:
这里的与前文中样本权值的更新,只相差规范因子,等价的。
4 AdaBoost 算法的正则化
为了防止 AdaBoost 过拟合,我们通常也会加入正则化项,这个正则化项我们通常称为步长。定义为 v, 对于前面的弱学习器的迭代:
加上正则项之后:
v 的取值范围为 0 到 1。对于同样的训练学习效果,较小的 v 意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代次数一起来决定算法的拟合效果。
四、模型优缺点
优点:
- 1 Adaboost作为分类器时,分类精度很高。
- 2 在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。
- 3 作为简单的二元分类器时,构造简单,结果可理解。
缺点:
- 1 对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。
五、模型使用
from sklearn.ensemble import AdaBoostClassifier
adbst = AdaBoostClassifier(n_estimators=1000, learning_rate=0.5)
网友评论