机器学习实验五:集成学习

系列文章目录

  1. 机器学习实验一:线性回归
  2. 机器学习实验二:决策树模型
  3. 机器学习实验三:支持向量机模型
  4. 机器学习实验四:贝叶斯分类器
  5. 机器学习实验五:集成学习
  6. 机器学习实验六:聚类

文章目录

  • 系列文章目录
  • 一、实验目的
  • 二、实验原理
    • 1.集成学习
    • 2.Boosting
    • 3.Bagging
  • 三、实验内容
  • 四、实验步骤
    • 1. Adaboost-SAMME 算法
    • 2. Adaboost-SAMME.R 算法
    • 3. 手写 Bagging 实现随机森林算法
    • 4. 使用 sklearn 验证随机森林算法
  • 总结


一、实验目的

(1)掌握集成学习的基本思想;
(2)掌握 boosting 和 bagging 策略;
(3)了解基于 Adaboost 及 bagging 集成器实现多分类任务。

二、实验原理

1.集成学习

集成学习(Ensemble learning)通过构建并结合多个学习器来完成学习任
务,也被称为多分类器系统或基于委员会的学习系统等。
集成学习的一般结构是先构建一组“个体学习器”,随后再利用某种策略将
这些“个体学习器”结合起来得到集成学习的结果。其中的个体学习器一般使用
决策树等较通用的现成算法,使用训练数据集训练得到。
根据个体生成器的生成方式,集成学习方法可以分为两大类。分别为个体学
习器之间存在强依赖关系、必须串行生成的序列化方法,例如 Boosting;以及
个体学习器之间不存在强依赖关系、可以同时生成的并行化方法,例如 Bagging
和随机森林。
由于集成学习是通过将多个学习器进行结合,故常常可以获得比单独某个学
习器更显著和优越的效果。

2.Boosting

Boosting 是一类可以将弱学习器提升为强学习器的算法。
Boosting 的工作机制基本相同:首先从初始训练集中训练出一个基学习器,
随后根据基学习器的性能表现对训练样本的分布进行一定的调整,增强对错误样
本的关注度;随后基于调整后的样本分布来训练下一个基学习器;持续迭代当前
过程,直至基学习器数目达到预先设定的值;最终将全部基学习器进行加权集合,
训练完成。
Boosting 算法中具代表性的算法为 Adaboost 算法。Adaboost 算法可以通过
使得基学习器线性组合后最小化指数损失函数来推导得到。
但标准的 Adaboost 算法只能实现二分类任务,或者说,利用标准 Adaboost
算法直接进行多分类任务很难取得较好的结果。因此要想实现多分类,可以采用
改进的 SAMME 或 SAMME.R 算法1。
SAMME 与标准 Adaboost 非常相似,只是增加了 log(K−1)这一项。因此,当
类别数 K=2 时,SAMME 等同于 Adaboost。
与 SAMME 算法不同,SAMME.R 算法采用加权概率估计(weighted probability
estimates)的方法更新加法模型。相比来说,SAMME.R 算法使用了比 SAMME 算
法更多的信息,也可以获得更高的准确率和鲁棒性。

3.Bagging

在基学习器相互独立的情况下,集成学习器的误差随着学习器数量的增多呈
指数级的下降。但是,使用相同类型的基学习器处理相同的问题,几乎不可能做
到相互独立。因此可以在数据上进行处理,即对相同训练样本进行采样,产生出
若干个不同的子集,再使用每个子集分别训练基学习器。当采样方法恰当时,由
于训练数据不同,获得的基学习器会有比较大的差异,同时可以取得较好的结果。
Bagging 算法基于自助采样法,也可以理解为有放回重新采样法,即给定一
个包含 m 个样本点的数据集,每次取出样本放入采样集中,再把样本放回原始数
据集,使得下次采样时仍然可以选中这个样本。重复上述过程,可以采样出 T
个含 m 个训练样本的采样集,随后对每个采样集训练出一个基学习器,再将基学
习器进行结合。Bagging 中对于分类任务采用简单投票法(少数服从多数),对
于回归任务采用简单平均法(几何平均)。分类任务中出现同票情况时,采用随
机选择或者进一步考察分类器投票置信度来决定。
Bagging 的算法描述如下图所示:在这里插入图片描述

三、实验内容

使用 Python 编写 Adaboost 和 Bagging 算法框架,并利用 sklearn 提供的基
学习器构建 Adaboost 和 Bagging 算法模型,读取 Iris 数据集信息并进行多分类
预测,调整超参数优化模型,并根据精确率、召回率和 F1 值度量模型性能。

四、实验步骤

1. Adaboost-SAMME 算法

SAMME 算法首先初始化权重。随后进行 M 次迭代,每次迭代需要训练基分类
并进行预测,根据预测结果计算错误率,并根据错误率调整样本分布情况,最后
根据处理分类器权重并归一,完成本次迭代。
具体代码实现及注释如下:

def boost_SAMME(self, X, y, sample_weight): # SAMME
 estimator = deepcopy(self.base_estimator_)
 if self.random_state_:
 estimator.set_params(random_state=1)
 # (a)训练基分类器,计算结果
 estimator.fit(X, y, sample_weight=sample_weight)
 y_pred = estimator.predict(X)
 incorrect = y_pred != y
 # (b)计算错误率
 estimator_error = np.dot(incorrect, sample_weight) / np.sum(sample_weight, axis=0)
 # 分类效果比随机数还差,抛弃这种情况
 if estimator_error >= 1 - 1 / self.n_classes_:
 return None, None, None
 # (c)(1)计算当前分类器权重
 estimator_weight = self.learning_rate_ * np.log((1 - estimator_error) / estimator_error) 
+ np.log(
 self.n_classes_ - 1)
 # 权重为负,无意义,抛弃
 if estimator_weight <= 0:
 return None, None, None
 # (d) 更新样本权重
 sample_weight *= np.exp(estimator_weight * incorrect)
 sample_weight_sum = np.sum(sample_weight, axis=0)
 if sample_weight_sum <= 0:
 return None, None, None
 # (e)归一化权重
 sample_weight /= sample_weight_sum
 # 存储当前弱分类器
 self.estimators_.append(estimator)
 return sample_weight, estimator_weight, estimator_error

2. Adaboost-SAMME.R 算法

SAMME.R 算法首先初始化权重。随后进行 M 次迭代,每次迭代需要训练及分
类并进行预测,随后根据预测结果计算加权概率估计 h(x),再根据 h(x)的值调
整样本分布情况及分类器权重并归一化处理。
具体代码实现及注释如下:

def boost_SAMMER(self, X, y, sample_weight): # SAMME.R
 estimator = deepcopy(self.base_estimator_)
 if self.random_state_:
 estimator.set_params(random_state=1)
 # 训练弱分类器
 estimator.fit(X, y, sample_weight=sample_weight)
 # 计算错误率
 y_pred = estimator.predict(X)
 incorrect = y_pred != y
 estimator_error = np.dot(incorrect, sample_weight) / np.sum(sample_weight, axis=0)
 # 比随机猜还差,抛弃
 if estimator_error >= 1.0 - 1 / self.n_classes_:
 return None, None, None
 # 计算 h(x)
 y_predict_proba = estimator.predict_proba(X)
 y_predict_proba[y_predict_proba < np.finfo(y_predict_proba.dtype).eps] = 
np.finfo(y_predict_proba.dtype).eps
 y_codes = np.array([-1. / (self.n_classes_ - 1), 1.])
 y_coding = y_codes.take(self.classes_ == y[:, np.newaxis])
 # 更新样本权重
 intermediate_variable = (-1. * self.learning_rate_ * (((self.n_classes_ - 1) / 
self.n_classes_) *
 inner1d(y_coding, 
np.log( y_predict
_proba)))) 
 sample_weight *= np.exp(intermediate_variable)
 sample_weight_sum = np.sum(sample_weight, axis=0)
 if sample_weight_sum <= 0:
 return None, None, None
 # 归一化权重
 sample_weight /= sample_weight_sum
 # 存储当前弱分类器
 self.estimators_.append(estimator)
 return sample_weight, 1, estimator_error

3. 手写 Bagging 实现随机森林算法

根据自助采样法定义,每次从 m 个样本中随机有放回的取出 m 个样本构成新
的数据集,得到如下代码实现:

def randomSample(X,y, rate): # 自助采样法,data 为原始数据集,rate 为采样比例(应该为 1)
 X_train = []
 y_train = []
 for i in range(int(len(X)*rate)):
 rand_num = random.randint(0, len(X) - 1)
 X_train.append(X[rand_num])
 y_train.append(y[rand_num])
 return X_train,y_train
#对 Bagging 算法的训练过程其实就是对若干个基分类器使用不同的数据子集进行训练的过程
def bagging(X,y,rate,n_estimators,base_estimator): # 数据 X、y,rate=1,分类器个数
 print("开始训练 Bagging")
 global estimators
 for i in range(n_estimators): # 构建 N 个分类器
 tmp_estimator = deepcopy(base_estimator)
 X_train,y_train = randomSample(X,y,rate)
 tmp_estimator.fit(X_train,y_train)
 estimators.append(tmp_estimator)
 print("弱分类器已完成训练")
#利用 Bagging 对数据进行分类其实就是把数据给全部基分类器进行分类,最后对得到的结果进行投票,少数服从多数得到结果
def predict(X):
 print("开始进行分类")
 global estimators
 result = []
 sample_result = []
 for estimator in estimators: # 求每一个分类器的结果
 result.append(list(estimator.predict(X)))
 n = len(result[0])
 for i in range(n): # 投票过程
 counter = Counter(list(np.array(result)[:,i]))
 tmp = counter.most_common()
 sample_result.append(tmp[0][0])
 return sample_result

4. 使用 sklearn 验证随机森林算法

以决策树作为基学习器,设置随机森林的基学习器个数 n_estimators=4,
使用 Iris 数据集的 80%为训练集,构建随机森林模型。
代码实现上,利用 sklearn 提供的 RandomForestClassifier()方法完成。
sklearn 中的 RandomForestClassifier()方法通过使用多组不同数据子集来训
练多颗决策树,再通过投票法完成分类。常用参数如下:
基分类器数量 n_estimators:默认为 100
最大深度 max_depth:基分类器决策树的最大深度
并行作业数 n_jobs:默认为 1,决定同时并行训练的基分类器个数
其他控制基分类器的参数与决策树 DesicionTreeClassifier()方法相同。
具体实现的核心代码如下:

X, y = datasets.load_iris(return_X_y=True)
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size = 0.2, random_state = 1)
random_forest = RandomForestClassifier(n_estimators=4)
random_forest.fit(X_train,y_train)

总结

以上就是今天要讲的内容,机器学习实验五:集成学习

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

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

相关文章

记一次Qt程序在win7上执行报错:0xc000007b排查步骤

前言 今天在运行别人发的一个Qt包的时候发现在我的虚拟机中运行不起&#xff0c;我的虚拟机系统是win7企业版不带sp1。在装vc2015运行库的时候也不能装。在网上搜寻资料说需要安装2919442等相关补丁。我下载相关补丁后运行提示不能安装。于是我又找到win7 企业版sp1的exe程序安…

Git多人协作(一)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言 由于博主是一个人&#xff0c;所以博主为完成这篇文章&#xff0c;在Linux下克隆了一个仓库&#xff0c;在windows下克隆了一个仓库&#xff0c;以此来模拟多人协作开发。而实际开发中&#xff0c;每个人都有自己的git…

智慧城市是什么?为什么要建智慧城市?

智慧城市是一个通过现代科技手段推动城市管理和服务创新的概念。 具体来说&#xff0c;它利用信息技术和创新概念&#xff0c;将城市的各个系统和服务集成起来&#xff0c;以提升城市运行效率、优化城市管理和服务&#xff0c;改善市民的生活质量。 为什么要建智慧城市呢&…

阿里云优惠活动与优惠政策常见问题解答,您关心的阿里云优惠信息都在这

为了吸引更多的新老用户选择阿里云产品&#xff0c;阿里云推出了各种优惠活动和优惠政策。这些优惠活动和政策可以帮助用户降低成本&#xff0c;提高性价比。本文总结了新老用户在购买阿里云服务器之前比较关心的一些官方最新优惠活动与优惠政策的常见问题&#xff0c;包括最新…

pure::variants—产品平台化及变体管理工具

产品概述 pure::variants是德国pure-systems公司的产品&#xff0c;其目的是帮助企业实现对产品线的变体管理&#xff0c;提高企业项目资产的复用效率。pure::variants的核心理念是运用产品线管理方法对项目资产&#xff08;项目计划、需求、模型、功能模块、代码、测试用例&am…

【数据结构】- 详解哈夫曼树(用 C 语言实现哈夫曼树的构造和哈夫曼编码)

目录 一、哈夫曼树的基本概念 二、哈夫曼树的构造算法 2.1 - 哈夫曼树的构造过程 2.2 - 哈夫曼树的存储表示 2.3 - 算法实现 三、哈夫曼编码 3.1 - 哈夫曼编码的主要思想 3.2 - 哈夫曼编码的性质 3.3 - 算法实现 一、哈夫曼树的基本概念 哈夫曼树的定义&#xff0c;涉…

c语言五子棋

下面是一个简单的C语言五子棋实现示例&#xff1a; #include <stdio.h>#include <stdlib.h>#define BOARD_SIZE 15char board[BOARD_SIZE][BOARD_SIZE];void init_board() { int i, j; for (i 0; i < BOARD_SIZE; i) { for (j 0; j < BOARD_…

“2024京津冀人工智能大会”推动京津冀人工智能产业快速发展

作为全球科技创新的前沿阵地&#xff0c;北京的人工智能产业近年来得到了迅速发展。在京津冀地区&#xff0c;人工智能产业已经成为了一个热点领域&#xff0c;产业规模和创新能力在全国居于领先地位。在这个背景下&#xff0c;2024北京国际人工智能展览会&#xff08;简称:世亚…

Sql Server 2017主从配置之:AlwaysOn高可用

AlwaysOn高可用功能&#xff0c;真正实现了数据库的灾备切换、高可用。 AlwaysOn通过Windows Server故障转移群集&#xff0c;部署高可用数据库组。 在故障转移群集基础上完成部署读写分离&#xff0c;只读负载平衡最多3个写入节点实现故障转移最多3个数据实时同步节点 环境…

MySQL 8创建数据库、数据表、插入数据并且查询数据

我使用的数据库是MySQL 8。 创建数据库 create database Bookbought; -- 创建数据库Bookbought use Bookbought; -- 使用数据库Bookbought创建数据表 创建用户表bookuser。 create table ## 往allbook里边插入数据(id INT PRIMARY KEY AUTO_INCREMENT, -- id 为 主键userna…

什么是https加密协议,相比http的好处在哪?

先了解什么是http HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在计算机网络上传输超文本的应用层协议。它是一种无状态的、无连接的协议&#xff0c;通常用于在Web浏览器和服务器之间传输HTML页面、图片、音频、视频以及其他数据资源。 以下是HTTP的…

圆通单号查询,圆通速递物流查询,对需要的单号进行颜色标记

批量查询圆通速递单号的物流信息&#xff0c;并对需要的单号进行颜色标记。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&#xff0c…

249:vue+openlayers 经纬度坐标转化为地址信息,点击后在弹窗显示

第249个 点击查看专栏目录 本示例是演示如何在vue+openlayers项目中点击某点,转化经纬度坐标为地址信息,弹窗显示。 通过点击地图,获取到经纬度坐标,然后通过调取mapbox的地址转换API,将经纬度坐标转化为地址信息,通过overlay的方式,在弹窗中展示出来。 直接复制下面的…

API接口使用方法(封装好的电商平台)

为了进行此平台API的调用&#xff0c;首先我们需要做下面几件事情。 1、 获取一个KEY。 点击获取 2、 参考API文档里的接入方式和示例。 3、查看测试工具是否有需要的接口&#xff0c;响应实例的返回字段是否符合参数要求。 4、利用平台的文档中心和API测试工具&#xff0c…

可视化监控云平台/智能监控平台EasyCVR国标设备开启音频没有声音是什么原因?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。GB28181视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存…

从零开始的c语言日记day40——字符函数和字符串函数——内存函数

常用函数介绍 求字符串长度 strlen 长度不受限制的字符串函数 Strcpy Strcat strcmp 长度受限制的字符串函数介绍 strncpy strncat strncmp 字符串查找 Strstro strtok 错误信息报告 strerror 字符操作 内存操作函数 memcpy memmove memset Memcmp 使用Asser…

Vue学习计划-Vue2--VueCLi(一)准备工作,安装node、vuecli

1. 安装node 网址&#xff1a;https://nodejs.org/en下载LTS版本表示长期支持版本说明&#xff1a; node是一个基于Chrome V8引擎的javascript运行环境,让JavaScript 运行在服务端的开发平台vuecli创建的项目必须运行在node环境中&#xff0c;npm为node自带包管理工具&#xf…

100G光模块的选购技巧——帮助您节省数据中心成本

数据中心在确保信息的即时可用性和访问性方面扮演着至关重要的角色。随着数据呈指数级增长&#xff0c;数据中心运营商一直在积极寻求优化其基础设施和降低成本的有效途径。在数据中心这个复杂生态系统中&#xff0c;100G光模块是一个不可或缺的部分&#xff0c;它对于实现高速…

C#如何使用SqlSugar操作MySQL/SQL Server数据库

一. SqlSugar 连接MySQL数据库 public class MySqlCNHelper : Singleton<MySqlCNHelper>{public static SqlSugarClient CnDB;public void InitDB() {//--------------------MySQL--------------------CnDB new SqlSugarClient(new ConnectionConfig(){ConnectionString…

【C++11(二)】lambda表达式以及function包装器

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; C11 1. 前言2. lambda表达式的提出3. lambda表达…
最新文章