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

系列文章目录

  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.rhkb.cn/news/214025.html

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

相关文章

imazing正在查找最新的apple mobile device组件

​ Apple Mobile Device是macOS的一个组件&#xff0c;它允许您在Mac上与iOS设备进行无缝连接和通信。因此&#xff0c;无法直接在苹果设备上下载和安装Apple Mobile Device&#xff0c;需要借助管理工具进行下载安装后启动。 如果您需要与iOS设备进行通信和同步&#xff0c;…

流量异常-挂马造成百度收录异常关键词之解决方案(虚拟主机)

一.异常现象&#xff1a;流量突然暴涨&#xff0c;达到平时流量几倍乃至几十倍&#xff0c;大多数情况下因流量超标网站被停止。 二.排查原因&#xff1a; 1.首先分析web日志&#xff1a;访问量明显的成倍、几十倍的增加&#xff1b;访问页面不同&#xff1b;访问IP分散并不固…

Linux常见压缩指令小结

为什么需要压缩技术 我们都知道文件是以byte作为单位的&#xff0c;如果我们的文件仅仅在低位占一个1 0000 0001这种情况我们完全可以压缩一下&#xff0c;将高位的0全部抹掉即可。 如上所说是一种压缩技术&#xff0c;还有一种就是将1111(此处省略96个)一共100个1&#xff0…

logback的使用

1 logback概述 SLF4J与其它日志组件调用关系图如下所示。 SLF4J&#xff0c;即Java中的简单日志门面&#xff08;Simple Logging Facade for Java&#xff09;&#xff0c;不是具体的日志解决方案&#xff0c;它只服务于各种各样的日志系统。 SLF4J最常用的日志实现框架是&am…

软件设计师——计算机组成原理(二)

&#x1f4d1;前言 本文主要是【计算机组成原理】——软件设计师——计算机组成原理的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

007:vue实现与iframe实现页面数据通信

首页先搭建一个html页面和vue页面&#xff0c;在vue页面中&#xff0c;嵌入我们需要的iframe页面 文章目录 1. 搭建 html 页面和 vue 页面2. 实现 iframe 向 vue 页面通信3. 在实现 vue 向 iframe 页面通信 1. 搭建 html 页面和 vue 页面 暂定为 iframeDemo.html 和 vueDemo.v…

外观模式 rust和java的实现

文章目录 外观模式介绍实现javarustrust仓库 外观模式 外观模式&#xff08;Facade Pattern&#xff09;隐藏系统的复杂性&#xff0c;它为子系统中的一组接口提供一个统一的高层接口&#xff0c;使得这些接口更加容易使用。外观模式通过封装子系统内部的复杂性&#xff0c;提…

选自《洛谷深入浅出进阶篇》——欧拉函数+欧拉定理+扩展欧拉定理

欧拉函数&#xff1a; 欧拉函数定义&#xff1a; 1~n中与n互质的数的个数。 比如 欧拉函数是积性函数&#xff1a;&#xff08;也就是&#xff09;当 n与m互质的时候&#xff1a; 由算术基本定理&#xff0c;我们可以设n&#xff0c;那么我们只要计算出的取值就能求出的取…

【机器视觉技术栈】03 - 镜头

镜头 定焦镜头变焦镜头远心镜头 FA镜头与远心镜头的区别&#xff1f; 焦距越小畸变程度越大&#xff0c;精度要求不高的场景可以使用焦距大的FA镜头做尺寸测量&#xff0c;但焦距越大带来的问题就是整个机械设备越大。精度高的场景使用远心镜头进行尺寸测量。 光学基础知识…

Gee教程6.模板(HTML Template)

这一章节的内容是介绍 Web 框架如何支持服务端渲染的场景 实现静态资源服务(Static Resource)。支持HTML模板渲染。 这一章节很多内容是基于net/http库的&#xff0c;该库已经实现了很多静态文件和HMML模板的相关功能的了。 静态文件 网页的三剑客&#xff0c;JavaScript、C…

APP备案,最新获取安卓签名文件中MD5等信息方法

1.通过签名文件获取SHA1和SHA256 直接通过cmd执行命令 keytool -list -v -keystore xxxxx/xxx/xx/xxx.keystore输入后回车会提示输入密码库口令&#xff0c;直接输入Keystore密码&#xff08;输入过程中终端上不会显示&#xff0c;输完回车就行&#xff09; 2.获取md5 由于…

vmware ubuntu22 安装vmtools并设置共享文件夹

我是你爹&#xff0c;再不会就紫砂。 权限不够或没读写权限自己改下就行。 1. 主机下新建文件夹&#xff0c;并如下图设置成共享 2. 把上面文件夹路径添加到共享文件夹里面 3. 开启ubuntu&#xff0c;在登陆界面显示之前我们会看到下图的重新安装vmware tools由灰变黑&#x…

Linux面试必备系列

文章目录 1、Linux的体系结构2、如何查找特定的文件&#xff08;find&#xff09;3、检索文件内容(grep)4、对文件内容做统计(awk)5、批量替换文本内容&#xff08;sed&#xff09; 1、Linux的体系结构 体系结构主要分为用户态&#xff08;用户上层活动&#xff09;和内核态内核…

OpenHarmony北向-让更广泛的应用开发者更容易参与

一、标准系统的体验 按照官方文档指导&#xff0c;这样操作&#xff0c;OH标准系统开发板就可以运行开发者开发的OpenHarmony应用了。 二、实际情况 按照开发文档上的说明&#xff0c;肯定是装不上的。因为OH不同的发行版&#xff0c;不同发行板不同的设备&#xff0c;IDE&…

Kubernetes架构及核心部件

文章目录 1、Kubernetes集群概述1.1、概述1.2、通过声明式API即可 2、Kubernetes 集群架构2.1、Master 组件2.1.1、API Server2.1.2、集群状态存储2.1.3、控制器管理器2.1.4、调度器 2.2、Worker Node 组件2.2.1、kubelet2.2.2、容器运行时环境2.2.3、kube-proxy 2.3、图解架构…

c-语言->数据在内存的存储

系列文章目录 文章目录 系列文章目录前言 前言 目的&#xff1a;学习整数在内存的储存&#xff0c;什么是大小端&#xff0c;浮点数的储存。 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#xff1a; 整数的2进制表⽰⽅法有三种&#xff0…

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

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

sqlite3.44.2的编译

文章目录 sqlite3.44.2的编译概述笔记解决shell.c编译报错的方法整理 - 正常可用的编译脚本过程剩下的事情验证编译出的输出是否可以给工程正常使用?END sqlite3.44.2的编译 概述 想从源码编译一份Sqlite3.44.2出来. 编译sqlite3.44.2前置需要的TCL环境已经编译出来到了, 做…

uniapp获取wifi连接状态

当使用Uniapp开发移动应用时&#xff0c;我们经常需要获取设备的连接状态&#xff0c;特别是WiFi连接状态。下面是一个简短的关于在Uniapp中获取WiFi连接状态的博客&#xff1a; 在Uniapp中&#xff0c;要获取设备的WiFi连接状态&#xff0c;我们可以利用uni.getNetworkType接…

少女感满满的羽绒服 ~时尚又保暖

玫瑰刺绣新中式羽绒服 粉粉嫩嫩的超级有少女心蓬松柔软又保暖 领口和袖口拼接仿真兔毛增添温暖更显可爱穿上精致可爱不显臃肿 宝贝肯定会喜欢&#xff01;&#xff01;