我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解Python AdaBoost算法的实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解Python AdaBoost算法的实现

1. AdaBoost 算法简介

Boosting是机器学习的三大框架之一,其特点是,训练过程中的诸多弱模型,彼此之间有着强依赖关系。Boost也被称为增强学习或提升法。典型的代表算法是AdaBoost算法。AdaBoost算法的核心思想是:将关注点放在预测错误的样本上。

AdaBoost 算法可以概括如下:

①假设共有m个样本数据,首先根据需求划分好训练集数据,按照一般思路,训练出第一个弱模型G1​(x)。

②对第一个弱模型G1​(x),计算该弱模型的分类错误率(或者说带权错误率,但是因为第一次迭代训练是均等权重的,所以第一次迭代的带权错误率等于普通的分类错误率)。

通过计算的分类错误率来确定该弱模型的权重,并更新训练集数据的权值分布。(这里涉及两个权重不要弄混,先是模型权重,再是样本数据权重)

记模型G1​(x)的权重为α1​,则F1​(x)=0+α1​G1​(x)(因为是第一次迭代,所以上一次可以暂记为0)。

③开始第二次迭代,使用更新后的样本权重再次训练一个弱模型,然后将该弱模型与上一次训练的弱模型G2​(x),按照一定的规则得到的模型权重进行复合,F2​(x)=F1​(x)+α2​G2​(x)。

遂得到模型F2​(x)。

这里的重点,就在于α1​,α2​等,这些模型的权重的确定。

④循环以上过程n次(从第二次开始,每次计算的模型错误率,是带权错误率)。

(n的值是自己指定的,希望的迭代次数)。

直到得到模型Fn​(x)=Fn−1​(x)+Gn​(x),即为AdaBoost算法的输出模型,此时的模型Fn​(x)是一个强训练模型。

2. AdaBoost算法 逻辑详解

按照以上思路,下边开始针对其中涉及的细节进行详解。

2.1 数据

首先要面对的,是数据。假设样本数据集D中共有m个样本,并表示如下:

D={(x1​,y1​),(x2​,y2​),...,(xm​,ym​)}

其中xi​是特征向量,yi​是标签。标签的取值可以是1和-1。

AdaBoost算法每次训练模型的时候,使用的可以是从m个样本中抽样抽出的部分样本,但是预测的时候必须统一,测试集必须是固定的m个样本。

2.2 带权错误率

使用AdaBoost算法,每次训练完弱模型后,需要进一步计算出其带权错误率。

带权错误率的公式如下:

如何理解这个式子:其中I()是指示函数,即,当括号内条件满足时值为1,当不满足条件时值为0。

这里括号内的条件,即表示对某样本的分类不正确。可以看出,预测错误的样本越多,该值则越大。

ωij​即第j次迭代中的第i个样本的权重。

在第一次迭代中第一次训练弱模型时,每个样本的初始权重是均等的,均为1/m​。

即每个样本被选中的概率是均等的。AdaBoost算法首先基于该均等的权重训练一个简单的弱学习器。

且因为均等权重,在第一次迭代的输出的弱分类器的带权错误率,是刚好等于预测错误的个数在m个样本中所占的比重的。(即带权错误率等于普通的分类错误率)。

2.3 损失函数 与 确定样本权重

AdaBoost算法的损失函数为指数损失。

以第k次迭代为例,第k次迭代将得到模型Fk​(x)=Fk−1​(x)+αk​G(x),则Fk​(x)的损失函数函数为:

经简单分析,可以看出,对于每个样本

若预测正确,则指数为负,损失只增加 1 e \frac{1}{e} e1​;

若预测错误,则损失函数的损失会增加e。

将该损失函数进行进一步展开得:

因为Loss,即该表达式整体,表示的是模型Fk​(x)的损失,e−yi​αk​Gk​(xi​)表示的则是第k次迭代中,新训练弱模型,样本和模型都加权后的损失。e−yi​Fk−1​(xi​)表示的则是第k−1次迭代中得到的模型Fk−1​的损失。

鉴于AdaBoost算法是利用上一个弱分类器Fk−1​的准确率(或者说错误率) 和 模型权重来调整数据,以获得下一个分类器。继续观察该表达式,可以清晰地发现,模型Fk​的损失,等于模型Gk​乘以模型权重αk​后,并经过 以模型Fk−1​损失为度量尺度的样本权重的调节,后的损失。所以式子中的e−yi​Fk−1​(xi​)即可以理解为样本权重ωk,i​。

对于每一个样本,如果在上次迭代结果的模型Fk−1​中预测正确,则在第k次迭代中给予较小的样本权重;如果在上次迭代结果的模型Fk−1​中预测错误,则在第k次迭代的预测中给予较大的样本权重,这使得其在第k次迭代中预测的结果将拥有更大的话语权。如果再次预测错误将带来更大的损失。

ωk,i​=e−yi​Fk−1​(xi​)这样的表示还尚不完美,因为要将其作为权重,就还需要进行归一化处理才好。

进一步将Fk−1​再展开可得到每次迭代的样本权重,与上次迭代样本权重之间的关系,并做归一化处理得:

其中Zt​是归一化因子。这里的​,其中ek−1​是第k-1次迭代分类的带权错误率。

可以看到该表达式中还有模型权重αk−1​需要进一步确定。

2.4 确定模型权重

模型权重的确定这一环节,涉及了较为麻烦的推导。这里只讨论逻辑,具体推导过程不再细究。

以第k次迭代为例,第k次迭代将得到模型Fk​(x)=Fk−1​(x)+αk​G(x),我们需要确定的αk​的值。

以使得AdaBoost算法的损失函数Loss最小为目标,经过一系列麻烦的推导,最终得到

根据该表达式不难看出,分类误差率越大,则对应的弱分类器权重系数也就越小。

2.5 输出模型

最终模型的表达式如下所示:

这里使用了符号函数sign,即若值大于0则表示标签1,小于0则表示标签-1。

3.AdaBoost算法的python实现

首先生成两组高斯分布的数据,用于模型训练和效果展示。

import numpy as np
from matplotlib import pyplot as plt
from sklearn.datasets import make_gaussian_quantiles

# 符合高斯分布,均值默认为0,方差为2,200个样本,2个特征,标签有2类,打乱
x1,y1 = make_gaussian_quantiles(
    cov=2,
    n_samples=200,
    n_features=2,
    n_classes=2,
    shuffle=True,
    random_state=1
)
# 满足高斯分布,两个特征,均值都为3,方差为1.5,300个样本数据,标签也有两个类别,打乱
x2,y2 = make_gaussian_quantiles(
    mean=(3,3),
    cov=1.5,
    n_samples=300,
    n_features=2,
    n_classes=2,
    shuffle=True,
    random_state=1
)

# 水平拼接:x1, x2
X = np.vstack((x1,x2))

# 垂直拼接:标签值 
y = np.hstack((y1,y2))

得到了有500个样本的数据集,该数据集有两个特征,标签取值有两种。特征数据为X,标签数据为y。

做数据可视化展示如下:

# 可视化
plt.scatter(X[:,0],X[:,1],c=y)
plt.show()

数据分布图像如下图所示:

然后训练模型:

# 基础模型 使用决策树分类器作为基础模型
from sklearn.tree import DecisionTreeClassifier
# 导入集成模型AdaBoostClassifier
from sklearn.ensemble import AdaBoostClassifier


# 实例化弱模型 设置最大深度为2
weak_classifier = DecisionTreeClassifier(max_depth=2)

# 集成模型 每次训练随机抽取300个样本,学习率为0.8
clf = AdaBoostClassifier(base_estimator=weak_classifier,algorithm="SAMME",n_estimators=300,learning_rate=0.8)
clf.fit(X,y)

为了更直观地展示模型在每个点处的效果,接下来我们绘制等高线图来呈现模型效果。

首先找出两个特征x1和x2的最小值和最大值,然后在原来的基础上分别减一、加一,来构建网格化数据。

x1_min = X[:,0].min()-1
x1_max = X[:,0].max()+1
x2_min = X[:,1].min()-1
x2_max = X[:,1].max()+1
x1_new,x2_new = np.meshgrid(np.arange(x1_min,x1_max),np.arange(x2_min,x2_max))

做预测:

y_t = clf.predict(np.c_[x1_new.ravel(),x2_new.ravel()])

模型预测结果如下:

绘制等高线图,并填充色彩:

y_t = y_t.reshape(x1_new.shape)
plt.contourf(x1_new,x2_new,y_t)

plt.scatter(X[:,0],X[:,1],c=y)
plt.show()

输出图像效果如下:        

到此这篇关于详解Python AdaBoost算法的实现的文章就介绍到这了,更多相关Python AdaBoost算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解Python AdaBoost算法的实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python实现的候选消除算法详解

候选消除算法是一种基于归纳推理的机器学习算法,用于从给定的训练数据中学习一个概念。它的目的是将训练数据中的所有实例归纳成一个最具一般性的概念描述,即“概念学习”的过程。候选消除算法的基本思想是:初始化一个最特殊的概念描述和一个最一般的概念描
Python实现的候选消除算法详解
2024-01-24

详解Bagging算法的原理及Python实现

目录一、什么是集成学习二、Bagging算法三、Bagging用于分类四、Bagging用于回归一、什么是集成学习 集成学习是一种技术框架,它本身不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务,一般结构是:先产生
2022-06-02

Python机器学习之AdaBoost算法的示例分析

这篇文章将为大家详细讲解有关Python机器学习之AdaBoost算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、算法概述AdaBoost 是英文 Adaptive Boosting(自适
2023-06-15

Python编程实现蚁群算法详解

简介 蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为
2022-06-04

Python实现线性搜索算法详解

线性搜索是最简单的搜索算法,从数据集的开头开始,检查每一项数据,直到找到匹配项,一旦找到目标,搜索结束。线性搜索算法的缺点需要注意的是线性搜索算法尽管简单,但不适用数据大的情况,由于算法将每个数据一一比较,所以数据越多,耗时越长。线性
Python实现线性搜索算法详解
2024-01-23

Python实现调度算法代码详解

调度算法 操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源。这就是调度。目的是控制资源使用者的数量,选取资源使用者许可占用资源或占用资源。 在
2022-06-04

python机器学习Sklearn中adaboost算法的示例分析

这篇文章主要为大家展示了“python机器学习Sklearn中adaboost算法的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python机器学习Sklearn中adaboost算法
2023-06-21

TF-IDF算法解析与Python实现方法详解

TF-IDF(term frequency?inverse document frequency)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。比较容易理解的一个应用场景
2022-06-04

python中实现k-means聚类算法详解

算法优缺点:优点:容易实现 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢 使用数据类型:数值型数据 算法思想k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去。 1.首先我们需要
2022-06-04

Python编程实现粒子群算法(PSO)详解

1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的。假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位置)。最好的策略就是结合自己的经验在距离
2022-06-04

t-SNE算法的原理和Python代码实现详解

T分布随机邻域嵌入(t-SNE),是一种用于可视化的无监督机器学习算法,使用非线性降维技术,根据数据点与特征的相似性,试图最小化高维和低维空间中这些条件概率(或相似性)之间的差异,以在低维空间中完美表示数据点。因此,t-SNE擅长在二维或三
t-SNE算法的原理和Python代码实现详解
2024-01-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录