热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

AdaBoost:一个经典的自适应增强集成算法

点击上方“AI派”,选择“设为星标”最新分享,第一时间送达!本文是《机器学习宝典》第18篇,读完本文你能够掌握集成学习中的A
点击上方“AI派”,选择“设为星标
最新分享,第一时间送达!640?wx_fmt=gif

本文是《机器学习宝典》第 18 篇,读完本文你能够掌握集成学习中的 AdaBoost。

在前一篇文章中介绍了 Bagging 中的一个经典算法:随机森林 。这篇我们来介绍 Boosting 系列的算法。AdaBoost 算是 Boosting 中最经典的一个算法了,所以这篇我们就介绍下它。

AdaBoost(adaptive boosting)中文名叫自适应增强,它是一种能够自动根据前一个基模型对样本预测的误差率来调整样本权重,然后基于调整权重后的样本继续学习新的基模型,如此反复,直到基模型的个数达到设定的个数停止,最后将所有训练的基模型通过组合策略进行集成,得到最终的模型。在 AdaBoost 中,基模型可以是很多种,比如决策树、神经网络等。在这个过程中,包含了两个可以提升效果的原因:

  1. 提高了那些被前一次基模型错误分类或回归预测误差较大的样本的权重,而降低那些被正确分类或回归预测误差较小样本的权重。这样一来,那些被分错或预测误差较大的数据,在下一次就会得到更大的关注。

  2. 在组合基模型时,增加分类误差率小或回归预测误差较小的基模型权重,使其在组合时的贡献更高,降低分类误差率大或回归预测误差较大的基模型权重,使其在组合时的贡献更低。

在 AdaBoost 学习的过程中,需要解决的问题有以下 4 个:

  1. 如何计算模型的预测的误差率

  2. 如何确定基模型的权重

  3. 如何更新样本的权重

  4. 如何将多个基模型组合在一起

假设我们的训练集为 640?wx_fmt=png,其中 640?wx_fmt=png,总共训练的基模型的个数为 T,第 t 个基模型的在训练集中的每个样本权重为 640?wx_fmt=png

AdaBoost 分类问题算法流程

我们以二分类为例,来说明下一般情况下二分类问题下的 AdaBoost 的算法流程:

1.初始化数据集中的权重分布为:640?wx_fmt=png,其中640?wx_fmt=png

2.令 t = 1,2,…,T,循环:

a. 使用带有权重分布 640?wx_fmt=png 的训练集学习一个基模型640?wx_fmt=png
 b. 计算基模型 640?wx_fmt=png 的误差率 640?wx_fmt=png,其中640?wx_fmt=png 为指示函数
 c. 计算基模型 640?wx_fmt=png 的在最终的集成模型中的权重640?wx_fmt=png
 d. 更新下一次的样本权重分布 640?wx_fmt=png,其中
640?wx_fmt=png
 其中,640?wx_fmt=png,是一个规范化因子,以确保 640?wx_fmt=png 是一个分布。

3.组合各个基模型生成最终模型640?wx_fmt=png

结合上面的算法流程来看下二分类下的 AdaBoost 是如何解决前面的 4 个问题的。

首先,模型的预测误差 640?wx_fmt=png 可以通过计算带权重的样本分错的比例来作为样本的预测误差。

其次,基模型的权重 640?wx_fmt=png 从计算公式中可以看到 640?wx_fmt=png 随着该基模型的预测误差 640?wx_fmt=png 的减小而增大,也就是说基模型的预测误差越小,最后对于最终集成模型的权重越大。也可以这么理解,由于 640?wx_fmt=png 是错误率,可以知道 640?wx_fmt=png 为准确率,那么 640?wx_fmt=png 表示相对准确率,显然相对准确率越高,基模型的权重系数越大。由于一般模型的准确率都在 0.5 及以上,即 640?wx_fmt=png ,那么640?wx_fmt=png,则 640?wx_fmt=png

再来看下如何更新下一次的样本权重,上面的关于 640?wx_fmt=png 的式子等价于:

640?wx_fmt=png

从上面式子可以看出,相比于正确分类的样本,错误分类的样本的权重被放大了640?wx_fmt=png 倍(这里其实解释为什么640?wx_fmt=png要用 log 表示以及系数为 640?wx_fmt=png 的原因)。

最后看下如何将多个基模型组合在一起,可以看到,最终的模型 640?wx_fmt=png 是将各个基模型的权重640?wx_fmt=png与该基模型的预测结果 640?wx_fmt=png 相乘后求和。

AdaBoost 的损失函数

前面我们介绍了 AdaBoost 在分类问题中的一个算法流程以及它的每个基模型权重、样本权重的公式,但是并没有解释它们的原因,其实它们可以通过 AdaBoost 的损失函数推导而来。

在 AdaBoost 中,可以将每一次生成一个基模型的过程认为是一轮,在第 t 轮时,通过带样本权重的数据集 640?wx_fmt=png 得到一个基模型 640?wx_fmt=png 和其对应的权重 640?wx_fmt=png,这时得到的集成的模型为 640?wx_fmt=png,对应的的损失函数是一个指数函数:
640?wx_fmt=png
其中 m 表示样本总个数,t 表示当前训练的轮数(基模型的个数)。

通过 AdaBoost 最终模型的表达式 640?wx_fmt=png 可以看出,其实它是将每一轮的基模型加权求和,所以可以得到:
640?wx_fmt=png
所以损失函数可以变为:
640?wx_fmt=png
有了损失函数,最小化损失函数即可得到 640?wx_fmt=png640?wx_fmt=png ,即:
640?wx_fmt=png
从上面的式子可以知道损失函数中包含了 640?wx_fmt=png640?wx_fmt=png 总共 2t 个参数,针对这种情况, 我们可以先固定  640?wx_fmt=png640?wx_fmt=png 这些参数,求解出 640?wx_fmt=png640?wx_fmt=png,然后逐一求解其他参数。

由于 640?wx_fmt=png 不依赖于 640?wx_fmt=png640?wx_fmt=png ,所以是个与最小化无关的固定值,我们记为 640?wx_fmt=png即 640?wx_fmt=png,进而可以将损失函数变为:

640?wx_fmt=png

考虑到 640?wx_fmt=png,640?wx_fmt=png,可以进一步将 640?wx_fmt=png 进行变换:

640?wx_fmt=png

所以在求解 640?wx_fmt=png 时,可以最小化下面的式子得到:

640?wx_fmt=png
接下来求解 640?wx_fmt=png ,可以令 640?wx_fmt=png640?wx_fmt=png 偏导为 0,可以得到:
640?wx_fmt=png

进而可得:
640?wx_fmt=png

640?wx_fmt=png

其中,640?wx_fmt=png 是带权重的错误分类的样本权重之和:
640?wx_fmt=png
这时候可以知道 640?wx_fmt=png 是怎么来的了。

结合 640?wx_fmt=png 以及 640?wx_fmt=png 可以得到:

640?wx_fmt=png

对比前面介绍的 640?wx_fmt=png:
640?wx_fmt=png
可以看到,只是相差了一个规范化因子,但本质上是一样的。

AdaBoost 正则化

为了防止Adaboost过拟合,我们通常也会加入正则化项,这个正则化项我们通常称为学习率(learning rate)。我们可以定义为 640?wx_fmt=png,加上了正则化项之后,则
640?wx_fmt=png
640?wx_fmt=png 的取值范围为 640?wx_fmt=png。对于同样的训练集学习效果,较小的 640?wx_fmt=png 意味着我们需要更多的迭代次数。通常我们用学习率和迭代最大次数一起来决定算法的拟合效果。

AdaBoost 回归算法

前面介绍的都是关于 AdaBoost 解决分类问题的情况,如果要使用 AdaBoost 解决回归问题的话,基本思路与回归问题一致,不过在回归任务中用到的损失函数与分类任务有所区别。我们设训练集 640?wx_fmt=png 中最大的误差为:640?wx_fmt=png

  1. 如果是线性误差,则误差率640?wx_fmt=png

  2. 如果是平方误差,则误差率640?wx_fmt=png

  3. 如果是指数误差,则误差率640?wx_fmt=png

参考:

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)

??扫码查看《机器学习宝典》历史内容

640?wx_fmt=png


(完)





640

人人都是数据分析师,人人都能玩转Pandas | Numpy 精品系列教程汇总 | 我是如何入门机器学习的呢 | 谷歌机器学习43条黄金法则


640

640?wx_fmt=png


长按,识别二维码,加关注



推荐阅读
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 信用评分卡的Python实现与评估
    本文介绍如何使用Python构建和评估信用评分卡模型,涵盖数据预处理、模型训练及验证指标选择。附带详细代码示例和视频教程链接。 ... [详细]
  • 机器学习核心概念与技术
    本文系统梳理了机器学习的关键知识点,涵盖模型评估、正则化、线性模型、支持向量机、决策树及集成学习等内容,并深入探讨了各算法的原理和应用场景。 ... [详细]
  • 本文介绍了一段使用jQuery实现的用户注册页面表单验证代码,适用于前端开发人员学习和参考。该示例结合了HTML、CSS和JavaScript,确保用户输入的数据格式正确。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 解决Python中 'NoneType' 对象无属性 'find_all' 错误
    本文详细探讨了在Python编程中遇到的常见错误——'NoneType'对象没有属性'find_all',并深入分析其原因及解决方案。通过理解find_all函数的工作原理和常见用法,帮助读者避免类似问题。 ... [详细]
  • 随着生活节奏的加快和压力的增加,越来越多的人感到不快乐。本文探讨了现代社会中导致人们幸福感下降的各种因素,并提供了一些改善建议。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • 机器学习公开课备忘录(三)机器学习算法的应用与大数据集
    机器学习公开课备忘录(三)机器学习算法的应用与大数据集对应机器学习公开课第六周和第10周机器学习算法模型的选择与评价1、对于一个data,可以将data划分为trainingset、t ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
  • 2017年人工智能领域的十大里程碑事件回顾
    随着2018年的临近,我们一同回顾过去一年中人工智能领域的重要进展。这一年,无论是政策层面的支持,还是技术上的突破,都显示了人工智能发展的迅猛势头。以下是精选的2017年人工智能领域最具影响力的事件。 ... [详细]
author-avatar
狮子胯下
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有