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

系列文章目录

  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): # SAMMEestimator = 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.Restimator = 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 != yestimator_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).epsy_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 estimatorsfor 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 estimatorsresult = []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.mzph.cn/news/203712.shtml

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

相关文章

Eureka的使用说明

Eureka是一个服务管理的平台&#xff0c;主要是管理多个模块之间的使用。eureka分为客户端和客户端&#xff0c;下面我们直接使用&#xff1a; 1.eureka server 服务管理的使用 1. 导入相关依赖 <dependency><groupId>org.springframework.cloud</groupId>…

docker基本管理和相关概念

1、docker是什么&#xff1f; docker是开源的应用容器引擎。基于go语言开发的&#xff0c;运行在Linux系统当中开源轻量级的“虚拟机”。 docker可以在一台主机上轻松的为任何应用创建一个轻量级的&#xff0c;可移植的&#xff0c;自给自足的容器。docker的宿主机是Linux系统…

【PID学习笔记 7 】控制系统的性能指标之三

写在前面 控制系统性能指标有单项指标和综合指标两类&#xff0c;上文重点介绍了单项指标&#xff0c;本文将介绍系统阶跃响应的综合性能指标。 一、系统阶跃响应的综合性能指标 单项指标虽然清晰明了&#xff0c;但如何统筹考虑比较困难。而偏差幅度和偏差存在的时间都与偏…

看图学源码 之 Atomic 类源码浅析一(cas + 自旋操作的 AtomicXXX原子类)

Atomic 针对基本数据类型的单个变量 AtomicInteger // 就是对 value 执行操作 public class AtomicInteger extends Number implements java.io.Serializable {...// 拿到 Unsafe 类 private static final Unsafe unsafe Unsafe.getUnsafe();// 偏移量&#xff1a; 字段…

1-Tornado的介绍

1 tornado的介绍 **Tornado**是一个用Python编写的可扩展的、无阻塞的**Web应用程序框架**和**Web服务器**。 它是由FriendFeed开发使用的&#xff1b;该公司于2009年被Facebook收购&#xff0c;而Tornado很快就开源了龙卷风以其高性能着称。它的设计允许处理大量并发连接&…

Spark常见算子汇总

创建RDD 在Spark中创建RDD的方式分为三种: 从外部存储创建RDD从集合中创建RDD从其他RDD创建 textfile 调用SparkContext.textFile()方法&#xff0c;从外部存储中读取数据来创建 RDD parallelize 调用SparkContext 的 parallelize()方法&#xff0c;将一个存在的集合&…

这些Java并发容器,你都了解吗?

文章目录 前言并发容器1.ConcurrentHashMap 并发版 HashMap示例 2.CopyOnWriteArrayList 并发版 ArrayList示例 3.CopyOnWriteArraySet 并发 Set示例 4.ConcurrentLinkedQueue 并发队列 (基于链表)示例 5.ConcurrentLinkedDeque 并发队列 (基于双向链表)示例 6.ConcurrentSkipL…

Vue学习计划-Vue2--Vue核心(五)条件、列表渲染、表单数据

1. 条件渲染 v-if v-if“表达式”v-else-if “表达式”v-else “表达式” 适用于&#xff1a;切换频率较低的场景 特点&#xff1a;不显示dom元素&#xff0c;直接被删除 注意&#xff1a;v-if和v-else-if、v-else一起使用&#xff0c;但要求结构不能被打断 v-if和template一…

Android笔记(十七):PendingIntent简介

PendingIntent翻译成中文为“待定意图”&#xff0c;这个翻译很好地表示了它的涵义。PendingIntent描述了封装Intent意图以及该意图要执行的目标操作。PendingIntent封装Intent的目标行为的执行是必须满足一定条件&#xff0c;只有条件满足&#xff0c;才会触发意图的目标操作。…

Kotlin 中的 also 和 run:选择正确的作用域函数

在 Kotlin 中&#xff0c;also 和 run 是两个十分有用的作用域函数。 虽然它们在功能上相似&#xff0c;但各自有独特的用途和适用场景。 一、分析&#xff1a; also&#xff1a;在对象的上下文中执行给定的代码块&#xff0c;并返回对象本身。它的参数是一个接收对象并返回…

分布式分布式事务分布式锁分布式ID

目录 分布式分布式系统设计理念目标设计思路中心化去中心化 基本概念分布式与集群NginxRPC消息中间件&#xff08;MQ&#xff09;NoSQL&#xff08;非关系型数据库&#xff09; 分布式事务1 事务2 本地事务3 分布式事务4 本地事务VS分布式事务5 分布式事务场景6 CAP原理7 CAP组…

ChatGPT发展历程

ChatGPT是一个在2020年成立的在线聊天平台&#xff0c;它的发展历程如下&#xff1a; 初期阶段&#xff1a;2020年&#xff0c;在全球疫情爆发的情况下&#xff0c;ChatGPT创始人开始思考如何为人们提供一个快捷、安全、便利的在线聊天平台。他们选择使用GPT&#xff08;生成对…

(2/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)

附录 A1 - 《PMBOK指南》映射 表A1显示了第六版《PMBOK指南》中定义的项目管理过程组与知识领域之间的对应关系 本附录说明了如何利用混合和敏捷方法处理《PMBOK指南》知识领域&#xff08;请参见表A1-2&#xff09;中所述的属性&#xff0c;其中涵盖了相同和不同的属性&…

conda 安装教程分享

大家好&#xff0c;我是微赚淘客系统的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我将向大家介绍如何使用conda进行安装。 首先&#xff0c;让我们来了解一下conda。conda是Anaconda发行版的一部分&#xff0c;它是一个开源的包管理系…

为什么那些删库跑路的人都极其下流

为什么那些删库跑路的人都极其下流&#xff1f;因为真的下流。注意&#xff0c;我不是针对跑路者的人品&#xff0c;遇到不公正待遇不敢反抗本身就比下流还下流&#xff0c;我说的是这种对抗方式太多低等。 干不好是能力问题&#xff0c;你不干是态度问题。记住我的话&#xf…

golang版aes-cbc-pkcs7加密解密base64hex字符串输入输出

最近项目中golang项目中使用aes加解密&#xff0c;做个记录方便以后使用 aes-cbc-pkcs7加密解密base64输入输出 type AesBase64 struct {key []byte // 允许16,24,32字节长度iv []byte // 只允许16字节长度 }func NewAesBase64(key []byte, iv []byte) *AesBase64 {return &…

C#网络应用程序(Web页面浏览器、局域网聊天程序)

目录 一、创建Web页面浏览器 1.示例源码 2.生成效果 二、局域网聊天程序 1.类 2.服务器端 3.客户端 一、创建Web页面浏览器 TextBox 控件用来输入要浏览的网页地址&#xff0c;Button控件用来执行浏览网页操作&#xff0c; WebBrowser控件用来显示要浏览的网页。这个控…

Matlab 曲线动态绘制

axes(handles.axes1); % 选定所画坐标轴 figure也可 h1 animatedline; h1.Color b; h1.LineWidth 2; h1.LineStyle -; % 线属性设置 for i 1 : length(x)addpoints(h1,x(i),y(i)); % x/y为待绘制曲线数据drawnow;pause(0.01); % 画点间停顿 end 示例&#xff1a; figure…

exynos4412—中断处理

一、什么是中断 一种硬件上的通知机制&#xff0c;用来通知CPU发生了某种需要立即处理的事件 分为&#xff1a; 内部中断 CPU执行程序的过程中&#xff0c;发生的一些硬件出错、运算出错事件&#xff08;如分母为0、溢出等等&#xff09;&#xff0c;不可屏蔽外部中断 外设发…

scitb包1.6版本发布,一个为制作专业统计表格而生的R包

目前&#xff0c;本人写的scitb包1.6版本已经正式在R语言官方CRAN上线&#xff0c;scitb包是一个为生成专业化统计表格而生的R包。 可以使用以下代码安装 install.packages("scitb")安装过旧版本的从新安装一次就可以升级了,根据粉丝的建议&#xff0c;增加了Overal…