一文速学-Adaboost模型算法原理以及实现+Python项目实战

news/2024/4/25 8:17:24/文章来源:https://blog.csdn.net/master_hunter/article/details/129175246

目录

前言

一、Adaboost算法概述

二、Adaboost模型原理

类推

计算原理

特点

适应较小量数据集,训练时间长

三、Python实例运用

AdaBoostClassifier分类

参数

实例实现分类

导入数据集

 划分数据集

 训练模型

 评估算法

模型效果


前言

集成学习的方法在全球各大机器学习、数据挖掘竞赛中使用的非常广泛,其概念和思想也是风靡学术界和工业界,我的期刊论文以及毕业百优论文也是用到了集成学习算法。而Adaboost作为最早开始流行的集成算法,必然包含boosting最核心的思想。作为一种元算法框架,Boosting几乎可以应用于所有目前流行的机器学习算法以进一步加强原算法的预测精度,应用十分广泛,产生了极大的影响。而AdaBoost正是其中最成功的代表,被评为数据挖掘十大算法之一。在AdaBoost提出至今的十几年间,机器学习领域的诸多知名学者不断投入到算法相关理论的研究中去,扎实的理论为AdaBoost算法的成功应用打下了坚实的基础。

在上篇文章给集成算法学习开了个小头,也较为详细的把每个Boosting算法都简述了一遍,但差点就把Adaboost算法给全部讲完了。Adaboost算是最最经典的Boosting算法了,也最能体现Boosting的思想和建模流程,那么下面我们就来了解一下Adaboost算法的原理和建模流程。


一、Adaboost算法概述

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。这在直接构造强学习器非常困难的情况下,为学习算法的设计提供了一种有效的新思路和新方法。

 对adaBoost算法的研究以及应用大多集中于分类问题,同时也出现了一些在回归问题上的应用。就其应用adaBoost系列主要解决了: 两类问题、多类单标签问题、多类多标签问题、大类单标签问题、回归问题。它用全部的训练样本进行学习。

二、Adaboost模型原理

在上篇文章我曾经用一个简单易懂的例子说过:

最近上映一部影片你想要去看,你想要确定是否值得去观看。那么首先最直观的就是去看其电影的评分,首先可以考虑各个电影APP给出的评分,再者去看看豆瓣知乎其他人给出的评分,以及其他同事朋友给出的评分,最终你收集这些所有评分,根据不同的渠道给他们给予一定的权重(比如豆瓣评分占比高一些,但是电影APP评分少一些),计算出得到你觉得此片应有的评分,再去看此部电影。

类推

以上案例就是基本的集成学习思想,把各种渠道当作是学习器,给出的评分就是这些学习器预测出的结果。当然你可以去收集足够多的渠道,让几百个人评价你的电影,这种情况的回答普遍会更加的多元化,事实证明,这是获得最佳评价的方法。

Adaboost算法其算法原理是通过调整样本权重和弱分类器权值,从训练出的弱分类器中筛选出权值系数最小的弱分类器组合成一个最终强分类器。基于训练集训练弱分类器,每次下一个弱分类器都是在样本的不同权值集上训练获得的。每个样本被分类的难易度决定权重,而分类的难易度是经过前面步骤中的分类器的输出估计得到的。

计算原理

以下是AdaBoost算法的伪代码描述:

输入:

  • 训练集 D = {(x_1, y_1), (x_2, y_2), ..., (x_m, y_m)},其中 x_i \in \mathbb{R}^n 表示第 i 个样本的特征向量,y_i \in {-1, 1} 表示第 i 个样本的类别标签。
  • 弱学习算法\mathcal{A}
  • 迭代次数 T

输出:

AdaBoost算法得到的强分类器H(x)

  1.  初始化训练数据的权值分布:对所有样本 i,令D_1(i) = 1/m
  2. 迭代 T次:
    1. 使用权值分布 D_t 训练弱分类器h_t(x)h_t(x) = \mathcal{A}(D_t)
    2. 计算分类误差率 \epsilon_t\epsilon_t = \sum_{i=1}^m D_t(i) \cdot [h_t(x_i) \neq y_i]
    3. 计算弱分类器h_t(x)的权重\alpha_t\alpha_t = \frac{1}{2} \ln \frac{1-\epsilon_t}{\epsilon_t}
    4. 更新样本权值分布D_{t+1}:对所有样本i,令D_{t+1}(i) = \frac{D_t(i) \cdot \exp(-\alpha_t y_i h_t(x_i))}{\sum_{j=1}^m D_t(j) \cdot \exp(-\alpha_t y_j h_t(x_j))}
    5. 构建强分类器H(x)H(x) = sign \left( \sum_{t=1}^T \alpha_t h_t(x) \right)

其中,\mathcal{A} 是一个能够训练弱分类器的算法,例如决策树、神经网络等。D_t(i) 表示第 t 轮迭代中第 i个样本的权值,初始值为 1/m\alpha_t是弱分类器 h_t(x)的权重,用于组合成强分类器 H(x)。最后,sign(\cdot)表示符号函数,即正数返回1,负数返回-1。

特点

Aadboost 算法系统具有较高的检测速率,且不易出现过适应现象。但是该算法在实现过程中为取得更高的检测精度则需要较大的训练样本集,在每次迭代过程中,训练一个弱分类器则对应该样本集中的每一个样本,每个样本具有很多特征,因此从庞大的特征中训练得到最优弱分类器的计算量增大。

 上面图h1是指的s2,有点贴图错误大家见谅。

适应较小量数据集,训练时间长

 典型的 Adaboost 算法采用的搜索机制是回溯法,虽然在训练弱分类器时每一次都是由贪心算法来获得局部最佳弱分类器,但是却不能确保选择出来加权后的是整体最佳。在选择具有最小误差的弱分类器之后,对每个样本的权值进行更新,增大错误分类的样本对应的权值,相对地减小被正确分类的样本权重。且执行效果依赖于弱分类器的选择,搜索时间随之增加,故训练过程使得整个系统的所用时间非常大,也因此限制了该算法的广泛应用。另一方面,在算法实现过程中,从检测率和对正样本的误识率两个方面向预期值逐渐逼近来构造级联分类器,迭代训练生成大量的弱分类器后才能实现这一构造过程。由此推出循环逼近的训练分类器需要消耗更多的时间。

三、Python实例运用

这里如果了解了整个建模原理不需要再通过流程公式再去推算一遍AdaBoost算法了,直接可以通过sklearn.ensemble模块调出AdaBoot模型:

 AdaBoost可用于分类和回归问题:

  1. 对于多类分类,AdaBoostClassifier实现了AdaBoost SAMME和AdaBooster SAMME。
  2. 对于回归,AdaBoostProgressor实现AdaBoost R2。

AdaBoostClassifier分类

通过AdaBoostClassifier函数可以构建AdaBoost分类器:

class sklearn.ensemble.AdaBoostClassifier(estimator=None,*, n_estimators=50,learning_rate=1.0,algorithm='SAMME.R',random_state=None,base_estimator='deprecated')

 此类实现称为AdaBoost SAMME的算法。

参数

estimator:object, default=None

构建增强系综的基础估计器。需要支持样本权重,以及正确的classes_和n_classes_属性。如果None,则基础估计器是DecisionTreeClassifier,初始化为max_depth=1。

n_estimators:int, default=50

提升终止时的最大估计数。在完美匹配的情况下,学习过程会提前停止。值必须在范围[1,inf)内。

learning_rate:float, default=1.0

在每个增强迭代中应用于每个分类器的权重。较高的学习率增加了每个分类器的贡献。在learning_rate和n_估计器参数之间存在权衡。值必须在范围(0.0,inf)内。

algorithm:{‘SAMME’, ‘SAMME.R’}, default=’SAMME.R’

如果“SAMME.R”,则使用SAMME.RR实增强算法。估计器必须支持类概率的计算。如果“SAMME”,则使用SAMME离散升压算法。SAMME.R算法的收敛速度通常比SAMME更快,通过较少的提升迭代实现了较低的测试误差。

random_state:int, RandomState instance or None, default=None

控制在每个增强迭代中在每个估计器处给出的随机种子。因此,它仅在估计器公开random_state时使用。在多个函数调用之间传递一个int以获得可复制的输出。

base_estimator:object, default=None

构建增强系综的基础估计器。需要支持样本权重,以及正确的classes_和n_classes_属性。如果None,则基础估计器是DecisionTreeClassifier,初始化为max_depth=1。

实例实现分类

导入数据集

分类的场景还是挺多的,我们拿现成的鸢尾花例子来实验一会:

from sklearn.datasets import load_iris
import pandas as pd
iris_data = load_iris()
iris_data_feature=list(iris_data.data)
iris_data_df=pd.DataFrame(iris_data_feature,columns=['花萼长度','花萼宽度','花瓣长度','花瓣宽度'])
iris_data_class=list(iris_data.target)
iris_class_df=pd.DataFrame(iris_data_class,columns=['花朵类型'])
iris_true_df=pd.concat([iris_data_df,iris_class_df],axis=1)

 划分数据集

一般划分数据集采取2/8切分,其中80%的数据用作训练,20%的数据用作验证。

from sklearn.model_selection import train_test_split
iris_array=iris_true_df.values
X=iris_array[:,0:4]
Y=iris_array[:,4]
test_model=0.2
seed=5
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=test_model,random_state=seed)

 训练模型

clf = AdaBoostClassifier(n_estimators=100,learning_rate=0.8,algorithm='SAMME.R',random_state=1)
AdaBoost_model=clf.fit(X_train,Y_train)

 评估算法

我这里就使用十折交叉验证法来评估算法的准确度。十折交叉验证就是随机将数据分成10份:9份用来训练模型,1份用来评估算法。

from sklearn.model_selection import KFold
results=[]
kfold=KFold(n_splits=10,shuffle=True,random_state=seed)
cv_results=cross_val_score(clf,X_train,Y_train,cv=kfold,scoring='accuracy')
results.append(cv_results)
print('%s:%f(%f)'%('AdaBoost_model',cv_results.mean(),cv_results.std()))
AdaBoost_model:0.966667(0.055277)

那么我们通过混淆矩阵来看看效果如何:

模型效果

from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
labels=[0,1,2]
cm= confusion_matrix(Y_test, Y_predict)
sns.heatmap(cm,annot=True ,fmt="d",xticklabels=labels,yticklabels=labels)
plt.title('confusion matrix')  # 标题
plt.xlabel('Predict lable')  # x轴
plt.ylabel('True lable')  # y轴
plt.show()

 那么本章内容已经足够多了,消耗需要一定的时间,内容也不能过多造成学习疲劳,后续将继续补充AdaBoost算法的一些高阶运用和项目案例实现。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73108.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NOIP2002 普及组] 过河卒

题目描述: 棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表…

干测试5年,经常被开发看不起,现在总算证明了自己····

测试不止是点点点 我感觉我是一个比较有发言权的人吧,我在测试行业摸爬滚打5年,以前经常听到开发对我说,天天的点点点有意思没? 和IT圈外的同学、朋友聊起自己的工作,往往一说自己是测试,无形中也会被大家…

利用global mapper导出等高线 在sketch up制作三维模型

为了做一个地形模型,绞尽脑汁实验了所有能查到的教程,在免费的基础上总体尝试失败,一是需要花钱的插件例如bitmap to mesh,即便能下载到,也是无法安装使用。如果你能下到且安装上,别忘了分享给我。 二是有的…

什么是品牌营销?学会正确推广您的业务

什么是品牌营销? 品牌营销涉及长期战略规划,以推广整个品牌,而不是营销单个产品或服务。它分享了一个引人入胜的故事,以在潜在客户中产生品牌知名度并建立声誉。 面向消费者的品牌使用品牌智能软件来了解人们对其品牌的看法&#…

超级详细的Maven教程

超级详细的 Maven 教程(基础高级) 1. Maven 是什么 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。 一个 Maven 工程有约定的目录结构,约定的目录结构对于 Maven 实现自动化构建而言是必不可少…

10套“2023年软考备考资料”送给你

距离软考考试越来越近了,备考的形势越发紧张了。考点那么多,我们需要抓出常考的大部分知识点。 ​为此,为大家整理了《2023年软考免费备考资料》,内含软考各科目不同类型共10套备考资料。 ​ 第1套:早鸟学习计划&am…

表格内容过多时单行/多行显示

分析 单行多行显示涉及到 table-layout: fixed; 这个属性,默认状态下的属性值是 auto (自动表格布局),两种不同的属性值区别如下: 方法 我在设置表格内容单行/多行显示时采用的方法: table 添加的样式&a…

13- 信用卡匹配 (OpenCV基础) (项目十三) *

项目要点 _, ref cv2.threshold(ref, 10, 255, cv2.THRESH_BINARY_INV) 二值化处理图片, 黑白化图片ref cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度化处理ref_contours, _ cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 计算轮廓cv2.dr…

xselect 实现已用数据禁止选择

function queryExamtemplate() {layui.$.ajax({url: 接口地址,type: "get",data: {id: id, name: name},//传参数方式 无参[]dataType: "json",contentType: "application/json",success: function (res) {if (res.code 0) {let data [];res.…

滤波算法:经典卡尔曼滤波

卡尔曼滤波实质上就是基于观测值以及估计值二者的数据对真实值进行估计的过程。预测步骤如图1所示: ​图1 卡尔曼滤波原理流程图 假设我们能够得到被测物体的位置和速度的测量值 ​,在已知上一时刻的最优估计值 ​以及它的协方差矩阵 的条件下&#xff…

【数据结构】时间复杂度

🚀write in front🚀 📜所属专栏:初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对…

Nordic nRF芯片FDS模块学习

FDS系统学习 文章目录FDS系统学习一、ROM,RAM,FLASH作用二、ROM,RAM和FLASH在单片中的运作原理三、Flash访问模块FDS用法1. FDS在sdk_config.h中的配置2. fds_register()注册3. fds_record_write()写记录4. fds_record_find()查找5. fds_record_open()读…

常见的排序算法 | 直接插入排序 | 希尔排序 | 选择排序 | 堆排序 | 冒泡排序 | 快速排序 | 归并排序 |(详解,附动图,代码)

思维导图: 一.插入排序 1.直接插入排序(InsertSort) ①手机通讯录时时刻刻都是有序的,新增一个电话号码时,就是使用插入排序的方法将其插入原有的有序序列。 ②打扑克 步骤: ①如果一个序列只有一个数&am…

报表开发难上手?这里有一份 Fastreport 最新中文用户指南,请查收

Fast Reports,Inc.成立于1998年,多年来一直致力于开发快速报表软件,包括应用程序、库和插件。FastReport的报表生成器(VCL平台和.NET平台)、跨平台的多语言脚本引擎FastScript、桌面OLAP FastCube,如今都受到世界各地开…

工赋开发者社区 | 工业数字孪生:西门子工业网络与设备虚拟调试案例(TIA+MCD+SINETPLAN)

PART1案例背景及基本情况新生产系统的设计和实施通常是耗时且高成本的过程,完成设计、采购、安装后,在移交生产运行之前还需要一个阶段,即调试阶段。如果在开发过程中的任何地方出现了错误而没有被发现,那么每个开发阶段的错误成本…

建议收藏!数据可视化大屏设计必备步骤

相信对于从事大数据相关的人员来说,数据的可视化大屏是最能展现自己工作价值的一个途径。可视化大屏就是数据分析的最后成果的展示,而如果能设计出更直观、更酷炫、更具有科技感的大屏,更能获得客户的青睐。 那么客户喜欢的究竟是怎样的可视化…

嵌入式开发:在嵌入式应用程序中混合C和C++

许多嵌入式应用程序仍使用c语言编写,但越来越多的嵌入式开发人员现在使用C语言编写程序。某些应用程序甚至共享这两种语言。这有意义吗?C是嵌入式应用中最常用的编程语言。多年来,人们一直期待着向C过渡,但过渡速度相当缓慢。但是&#xff0…

Appium自动化测试 Inspector定位Webview/H5页面元素

目录操作步骤Python操作该混合App代码Appium在操作混合App或Android App的H5页面时, 常常需要定位H5页面中的元素, 传统方式是 FQ 使用Chrome://inspect来定位元素, 环境准备相当繁琐, 不仅需要想办法FQ, 而且还需要Android设备安装Google框架以及手机版Chrome浏览器以及相应的…

问题记录-网卡丢失导致Temporary failure in name resolution

没网了,ifconfig查看一下 发现是网卡丢失 使用如下命令: sudo ifconfig eth0 up sudo dhclient解决

postgresql 数据库 主从切换 测试

postgresql 数据库 主从切换 测试 文章目录postgresql 数据库 主从切换 测试前言环境:主从切换1. 查看数据库状态:2. 备库切换主库3. 旧主库切换成备库;4 查看状态后记前言 因数据库等保需要,需要对老系统的数据库进行主从切换来…