本文是《机器学习宝典》第 18 篇,读完本文你能够掌握集成学习中的 AdaBoost。
在前一篇文章中介绍了 Bagging 中的一个经典算法:随机森林 。这篇我们来介绍 Boosting 系列的算法。AdaBoost 算是 Boosting 中最经典的一个算法了,所以这篇我们就介绍下它。
AdaBoost(adaptive boosting)中文名叫自适应增强,它是一种能够自动根据前一个基模型对样本预测的误差率来调整样本权重,然后基于调整权重后的样本继续学习新的基模型,如此反复,直到基模型的个数达到设定的个数停止,最后将所有训练的基模型通过组合策略进行集成,得到最终的模型。在 AdaBoost 中,基模型可以是很多种,比如决策树、神经网络等。在这个过程中,包含了两个可以提升效果的原因:
提高了那些被前一次基模型错误分类或回归预测误差较大的样本的权重,而降低那些被正确分类或回归预测误差较小样本的权重。这样一来,那些被分错或预测误差较大的数据,在下一次就会得到更大的关注。
在组合基模型时,增加分类误差率小或回归预测误差较小的基模型权重,使其在组合时的贡献更高,降低分类误差率大或回归预测误差较大的基模型权重,使其在组合时的贡献更低。
在 AdaBoost 学习的过程中,需要解决的问题有以下 4 个:
如何计算模型的预测的误差率
如何确定基模型的权重
如何更新样本的权重
如何将多个基模型组合在一起
假设我们的训练集为 ,其中 ,总共训练的基模型的个数为 T,第 t 个基模型的在训练集中的每个样本权重为 。
我们以二分类为例,来说明下一般情况下二分类问题下的 AdaBoost 的算法流程:
1.初始化数据集中的权重分布为:,其中
2.令 t = 1,2,…,T,循环:
a. 使用带有权重分布 的训练集学习一个基模型 b. 计算基模型 的误差率 ,其中 为指示函数 c. 计算基模型 的在最终的集成模型中的权重 d. 更新下一次的样本权重分布 ,其中 其中,,是一个规范化因子,以确保 是一个分布。
3.组合各个基模型生成最终模型
结合上面的算法流程来看下二分类下的 AdaBoost 是如何解决前面的 4 个问题的。
首先,模型的预测误差 可以通过计算带权重的样本分错的比例来作为样本的预测误差。
其次,基模型的权重 从计算公式中可以看到 随着该基模型的预测误差 的减小而增大,也就是说基模型的预测误差越小,最后对于最终集成模型的权重越大。也可以这么理解,由于 是错误率,可以知道 为准确率,那么 表示相对准确率,显然相对准确率越高,基模型的权重系数越大。由于一般模型的准确率都在 0.5 及以上,即 ,那么,则 。
再来看下如何更新下一次的样本权重,上面的关于 的式子等价于:
从上面式子可以看出,相比于正确分类的样本,错误分类的样本的权重被放大了 倍(这里其实解释为什么要用 log 表示以及系数为 的原因)。
最后看下如何将多个基模型组合在一起,可以看到,最终的模型 是将各个基模型的权重与该基模型的预测结果 相乘后求和。
前面我们介绍了 AdaBoost 在分类问题中的一个算法流程以及它的每个基模型权重、样本权重的公式,但是并没有解释它们的原因,其实它们可以通过 AdaBoost 的损失函数推导而来。
在 AdaBoost 中,可以将每一次生成一个基模型的过程认为是一轮,在第 t 轮时,通过带样本权重的数据集 得到一个基模型 和其对应的权重 ,这时得到的集成的模型为 ,对应的的损失函数是一个指数函数:其中 m 表示样本总个数,t 表示当前训练的轮数(基模型的个数)。
通过 AdaBoost 最终模型的表达式 可以看出,其实它是将每一轮的基模型加权求和,所以可以得到:所以损失函数可以变为:有了损失函数,最小化损失函数即可得到 和 ,即:从上面的式子可以知道损失函数中包含了 和 总共 2t 个参数,针对这种情况, 我们可以先固定 和 这些参数,求解出 和 ,然后逐一求解其他参数。
由于 不依赖于 和 ,所以是个与最小化无关的固定值,我们记为 。即 ,进而可以将损失函数变为:
考虑到 ,,可以进一步将 进行变换:
所以在求解 时,可以最小化下面的式子得到:
接下来求解 ,可以令 对 偏导为 0,可以得到:
进而可得:
其中, 是带权重的错误分类的样本权重之和:这时候可以知道 是怎么来的了。
结合 以及 可以得到:
对比前面介绍的 :可以看到,只是相差了一个规范化因子,但本质上是一样的。
为了防止Adaboost过拟合,我们通常也会加入正则化项,这个正则化项我们通常称为学习率(learning rate)。我们可以定义为 ,加上了正则化项之后,则 的取值范围为 。对于同样的训练集学习效果,较小的 意味着我们需要更多的迭代次数。通常我们用学习率和迭代最大次数一起来决定算法的拟合效果。
前面介绍的都是关于 AdaBoost 解决分类问题的情况,如果要使用 AdaBoost 解决回归问题的话,基本思路与回归问题一致,不过在回归任务中用到的损失函数与分类任务有所区别。我们设训练集 中最大的误差为:。
如果是线性误差,则误差率
如果是平方误差,则误差率
如果是指数误差,则误差率
参考:
1. 集成学习之Adaboost算法原理小结
(https://www.cnblogs.com/pinard/p/6133937.html)
2. AdaBoost算法
(https://zhuanlan.zhihu.com/p/39972832)
3. 集成模型之Adaboost算法(三)
(https://zhuanlan.zhihu.com/p/38507561)
4. Adaboost 算法的原理与推导
(https://blog.csdn.net/v_july_v/article/details/40718799)
??扫码查看《机器学习宝典》历史内容
(完)
人人都是数据分析师,人人都能玩转Pandas | Numpy 精品系列教程汇总 | 我是如何入门机器学习的呢 | 谷歌机器学习43条黄金法则