一文详解机器学习中最好用的提升方法:boosting与adaboost(代码片段)

Python学习与数据挖掘 Python学习与数据挖掘     2022-12-03     511

关键词:

在 Kaggle 及其它机器学习任务中,集成方法非常流行,不论是 还是随机森林,它们都强大无比。而本文作者从最基础的 Boosting 概念到 AdaBoost 算法进行了详细的介绍,并展示了如何实现 AdaBoost,这些都是走进集成方法大家族的敲门砖。

最近, Boosting 技术在 Kaggle 竞赛以及其它预测分析任务中大行其道。本文将尽可能详细地介绍有关 Boosting 和 AdaBoost 的相关概念。 喜欢本文记得收藏、点赞、关注。

本文将涉及:

  • 对 bagging(装袋法)的快速回顾

  • bagging 的局限性

  • Boosting 的概念细节

  • boosting 的计算效率

  • 代码示例

Bagging 的局限性

接下来,我们不妨考虑一个二元分类问题。我们把一个观测结果分类为 0 或 1。尽管这并不是本文的目的,但是为了清晰起见,让我们回顾一下 Bagging 的概念。

Bagging 指的是一种叫做「Bootstrap Aggregating」(自助聚合)的技术。其实质是选取 T 个 bootstrap 样本,在每个样本安装一个分类器,然后并行训练模型。通常,在随机森林中,决策树是并行训练的。然后,将所有分类器的结果平均化,得到一个 bagging 分类器:

Bagging 分类器的公式

该过程可以通过以下方式来说明。让我们考虑 3 个分类器,它们生成一个分类结果,该结果可能是对的也可能是错的。如果我们绘制 3 个分类器的结果,会有一些区域代表分类器的结果是错误的。在下图中,这样的区域用红色表示:

_Bagging 适用场景的示例
_

这个示例可以很好地起到说明作用,其中有一个分类器的结果是错误的,而另外两个分类器的结果是正确的。通过对分类器进行投票,你可以获得很高的分类准确率。但正如你可能会猜到的那样,bagging 机制有时并不能很好地起作用,这时所有的分类器都会在同一个区域内获得错误的分类结果。

出于这个原因,对 boosting 方法背后的直观想法是:

  • 我们需要串行训练模型,而不是并行训练。

  • 每个模型需要重点关注之前的分类器表现不佳的地方。

**Boosting 简介
**

概念

上述想法可以诠释为:

  • 在整个数据集上训练模型 h1

  • 对 h1 表现较差的区域的数据加权,并在这些数据上训练模型 h2

  • 对 h1 ≠ h2 的区域的数据加权重,并在这些数据上训练模型 h3

我们可以串行地训练这些模型,而不是并行训练。这是 Boosting 的本质!

Boosting 方法会随着时间的推移,通过调整误差度量来训练一系列低性能算法,称之为弱学习器。弱学习器指的是那些误差率略低于 50% 的算法,如下图所示:

_误差率略低于 50% 的弱分类器
_

加权误差

我们如何才能实现这样的分类器呢?实际上,我们是通过在整个迭代过程中加权误差做到的。这样,我们将为之前分类器表现较差的区域赋予更大的权重。

不妨想想二维图像上的数据点。有些点会被很好地分类,有些则不会。通常,在计算误差率时,每个误差的权重为 1/n,其中 n 是待分类的数据点个数。

_未加权的误差
_

现在让我们对误差进行加权!

_加权后的误差
_

现在,你可能注意到了,我们对没有被很好地分类的数据点赋予了更高的权重。加权的过程如下图所示:

_加权过程示例
_

最终,我们希望构建如下图所示的强分类器:

_强分类器
_

决策树桩

你可能会问,我们需要实现多少个分类器才能让整个 Boosting 系统很好地工作呢?在每一步中如何选择分类器?

答案是所谓的「决策树桩」!决策树桩是指一个单层决策树。主要思想是,我们在每一步都要找到最好的树桩(即得到最佳的数据划分),它能够使整体的误差最小化。你可以将一个树桩看做一个测试,其中,我们假设位于树桩某一侧的所有数据点都属于 1 类,另一侧的所有数据点都属于 0 类。

决策树桩的组合可能有很多种。接下来,让我们看看在这个简单的示例中有多少种树桩组合?

_待划分的 3 个数据点
_

实际上,本例中有 12 种树桩组合!这看起来可能有些令人惊讶,但其实很容易理解。

_12 个决策树桩
_

我们可以对上面的情况做 12 种可能的「测试」。每条分割线边上的数字「2」简单地表示了这样一个事实:位于分割线某一侧的所有点都可能属于 0 类或 1 类。因此,每条分割线嵌入了 2 个「测试」。

在每一轮迭代 t 中,我们将选择能够最好地划分数据的弱分类器 ht,该分类器能够最大限度地降低整体误差率。回想一下,这里的误差率是一个经过加权修正之后的误差率版本,它考虑到了前面介绍的内容。

寻找最佳划分

如上所述,通过在每轮迭代 t 中识别最佳弱分类器 ht(通常为具有 1 个节点和 2 片叶子的决策树(决策树桩))来找到最佳划分。假设我们试图预测一个想借钱的人是否会是一个好的还款人:

_找出最佳划分
_

在这种情况下,t 时刻的最佳划分是将「支付历史」作为树桩,因为这种划分的加权误差是最小的。

只需注意,实际上,像这样的决策树分类器可能具备比简单的树桩更深的结构。这将会是一个超参数。

融合分类器

自然而然地,下一步就应该是将这些分类器融合成一个符号分类器。根据某个数据点处于分割线的哪一侧,将其分类为 0 或 1。该过程可以通过如下方式实现:

_融合分类器
_

你发现了可能提升分类器性能的方法吗?

通过为每个分类器加权,可以避免赋予不同的分类器相同的重要性。

_AdaBoost
_

小结一下

让我们把到目前为止本文已经介绍过的内容总结在一段小小的伪代码中。

_伪代码
_

其中需要记住的关键点是:

  • Z 是一个常数,其作用是对权重进行归一化,使得它们加起来等于 1!

  • α_t 是应用于每个分类器的权重

大功告成!这种算法就是「AdaBoost」。如果你想充分理解所有的 boosting 方法,那么这是你需要理解的最重要的算法。

计算

Boosting 算法训练起来非常快,这太棒了。但是我们考虑到了所有树桩的可能性并且采用了递归的方法计算指数,为什么它还会训练地这么快?

现在,神奇的地方来了!如果我们选择了恰当的 α_t 和 Z,本该在每一步变化的权重将简化成如下的简单形式:

_选择了恰当的α 和 Z 之后得到的权重
_

这是一个非常强的结论,这与权重应该随着迭代而变化的说法并不矛盾。因为错误分类的训练样本数量减少了,它们的总权重仍然是 0.5!

  • 无需计算 Z

  • 无需计算 α

  • 无需计算指数

另外一个小诀窍是:任何试图将两个已经被很好地分类的数据点划分开的分类器都不会是最优的。我们甚至不需要对其进行计算。

动手编程试一下吧!

现在,本文将带领读者快速浏览一个代码示例,看看如何在 Python 环境下使用 Adaboost 进行手写数字识别。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import cross_val_predict
from sklearn.model_selection import train_test_split
from sklearn.model_selection import learning_curve

from sklearn.datasets import load_digits

首先,载入数据:

dataset = load_digits()
X = dataset['data']
y = dataset['target']

X 包含长度为 64 的数组,它们代表了简单的 8x8 的平面图像。使用该数据集的目的是为了完成手写数字识别任务。下图为一个给定的手写数字的示例:

如果我们坚持使用深度为 1 的决策树分类器(决策树桩),以下是如何在这种情况下实现 AdaBoost 分类器:

reg_ada = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1))
scores_ada = cross_val_score(reg_ada, X, y, cv=6)
scores_ada.mean()

这样得到的分类准确率的结果应该约为 26%,还具有很大的提升空间。其中一个关键的参数是序列决策树分类器的深度。那么,决策树的深度如何变化才能提高分类准确率呢?

score = []
for depth in [1,2,10] : 
    reg_ada = AdaBoostClassifier(DecisionTreeClassifier(max_depth=depth))
    scores_ada = cross_val_score(reg_ada, X, y, cv=6)
    score.append(scores_ada.mean())

在这个简单的例子中,当决策树的深度为 10 时,分类器得到了最高的分类准确率 95.8%。

结语

研究人员已经针对 AdaBoost 是否会过拟合进行了深入的探讨。近来,AdaBoost 被证明在某些时候会发生过拟合现象,用户应该意识到这一点。同时,Adaboost 也可以作为回归算法使用。

参考链接:https://towardsdatascience.com/boosting-and-adaboost-clearly-explained-856e21152d3e_

推荐文章

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

为什么机器学习算法难以优化?一文详解算法优化内部机制

↑↑↑关注后"星标"Datawhale每日干货 & 每月组队学习,不错过 Datawhale干货 来源:数据派THU,编辑:黄继彦本文约3500字,建议阅读9分钟本文介绍了一些关于机器学习和线性组合的部分问题以及缓解... 查看详情

收藏|一文详解算法优化内部机制

点上方人工智能算法与Python大数据获取更多干货在右上方 ··· 设为星标 ★,第一时间获取资源仅做学术分享,如有侵权,联系删除转载于:机器学习订阅组在机器学习中,损失的线性组合无处不在。虽然... 查看详情

机器不学习:一种提升预测能力的方法-机器学习模型

机器不学习jqbxx.com-机器学习好网站没有哪个机器学习模型可以常胜,如何找到当前问题的最优解是一个永恒的问题。幸运的是,结合/融合/整合(integration/combination/fusion)多个机器学习模型往往可以提高整体的预测能力。这是一种... 查看详情

一文读懂什么是机器学习--1.机器学习是什么?

一文读懂什么是机器学习--1.机器学习是什么?  一文读懂什么是机器学习--1.机器学习是什么?一文读懂什么是机器学习--2.机器学习的范围?一文读懂什么是机器学习--3.机器学习的方法?一文读懂什么是机器学习--4.机器学习的... 查看详情

一文读懂!异常检测全攻略!从统计方法到机器学习⛵

异常值是偏离数据集中大多数样本点的数据点。出现异常值的原因有很多,例如自然偏差、欺诈活动、人为或系统错误。不过,在我们进行任何统计分析或训练机器学习模型之前,对数据检测和识别异常值都是必不可少的,这个... 查看详情

一文详解深度学习中的normalization

一、深度学习中的InternalCovariateShift(ICS)深度学习的训练过程可以看成很多层的叠加,而每一层的参数更新会导致下一层输入数据的分布发生变化,通过层层累加,高层的输入分布变化会非常剧烈导致上层的数据需要不断去变... 查看详情

超详细一文详解pandas核心操作技巧(代码片段)

大家好,今天给大家分享最常用到pandas做数据处理和分析,特意总结了以下常用内容。喜欢本文记得收藏、点赞、关注。推荐文章李宏毅《机器学习》国语课程(2022)来了有人把吴恩达老师的机器学习和深度学习做成了中... 查看详情

机器学习系列(11)_python中gradientboostingmachine(gbm)调参方法详解(代码片段)

原文地址:CompleteGuidetoParameterTuninginGradientBoosting(GBM)inPythonbyAarshayJain原文翻译与校对:@酒酒Angie&&寒小阳([email protected])时间:2016年9月。出处:http://blog.csdn.net/han_xiaoyang/article/details/5266 查看详情

机器学习——提升方法adaboost算法,推导过程

0提升的基本方法  对于分类的问题,给定一个训练样本集,求比较粗糙的分类规则(弱分类器)要比求精确的分类的分类规则(强分类器)容易的多。提升的方法就是从弱分类器算法出发,反复学习,得到一系列弱分类器(... 查看详情

详解随机森林-机器学习中调参的基本思想菜菜的sklearn课堂笔记

调参的方式总是根据数据的状况而定,所以没有办法一概而论那我们首先来讲讲正确的调参思路。模型调参,第一步是要找准目标:我们要做什么?一般来说,这个目标是提升某个模型评估指标,比如对于随机森林来说,我们想... 查看详情

一文读懂机器学习大杀器xgboost原理

http://blog.itpub.net/31542119/viewspace-2199549/ XGBoost是boosting算法的其中一种。Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器。因为XGBoost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分... 查看详情

一文让你看懂人工智能机器学习深度学习和强化学习的关系(代码片段)

如果说信息技术是第三次工业革命的核心,那么人工智能所代表的智能则是下一次工业革命的核心力量。2016年,谷歌阿尔法围棋以4:1战胜围棋世界冠军、职业九段棋手李世石,不仅让深度学习为人们所知,而且掀起了人工智能... 查看详情

一文详解如何在chengying中通过产品线部署一键提升效率

在之前的内容当中,我们为大家介绍过ChengYing的安装原理、产品包制作等内容,本篇就延续之前的内容,和大家展开聊聊ChengYing产品线部署相关的设计。帮助对「一站式全自动化全生命周期大数据平台运维管家ChengYing」感兴趣的... 查看详情

一文详解深度学习在命名实体识别(ner)中的应用

目录1、NER简介2.深度学习方法在NER中的应用2.2IDCNN-CRF3.实战应用3.1语料准备3.2数据增强3.3实例4.总结近几年来,基于神经网络的深度学习方法在计算机视觉、语音识别等领域取得了巨大成功,另外在自然语言处理领域也取... 查看详情

如何将知识引入机器学习模型提升泛化能力?

摘要:近年来,基于数据驱动的机器学习模型开始提供可替代的方法,并在许多任务中优于纯物理学驱动模型。本文分享自华为云社区《如何将知识引入机器学习模型提升泛化能力?》,作者:PG13。基于... 查看详情

大规模机器学习 [关闭]

】大规模机器学习[关闭]【英文标题】:LargescaleMachineLearning[closed]【发布时间】:2011-03-1315:25:36【问题描述】:我需要在大型数据集(10-1000亿条记录)上运行各种机器学习技术问题主要围绕文本挖掘/信息提取,包括各种内核技... 查看详情

机器学习基础一文带你用sklearn做特征工程(代码片段)

使用sklearn做特征工程特征工程是什么?有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度... 查看详情

机器学习平台痛点与模型提升方法:基于spark的机器学习平台在点融网风控应用介绍

机器学习平台痛点与模型提升方法:基于Spark的机器学习平台在点融网风控应用介绍编者按:大数据和机器学习是近年来快速增长的热门领域,各个领域的数据量和数据规模都以惊人的速度增长。本文是近期举行的架构实践日点... 查看详情