机器学习 | 如何利用集成学习提高机器学习的性能?

目录

初识集成学习

Bagging与随机森林

Otto Group Product(实操)

Boosting集成原理


初识集成学习

集成学习(Ensemble Learning)是一种通过组合多个基本模型来提高预测准确性和泛化能力的机器学习方法。它通过将多个模型的预测结果进行整合或投票来做出最终的预测决策。

集成学习通过建立几个模型来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测。只要单分类器的表现不太差,集成学习的结果总是要好于单分类器的。

Bagging与随机森林

Bagging(Bootstrap Aggregating)是一种常见的集成学习方法,旨在通过构建多个基本模型并对它们的预测结果进行组合来提高整体性能。

Bagging的关键思想在于通过对训练数据集的重采样,生成多个相互独立的基本模型,并利用这些模型的集体智慧来提高整体的预测准确性和泛化能力。由于每个基本模型都是在不同的数据子集上独立训练的,因此可以减小模型之间的相关性,从而减少过拟合的风险。

如下我们想把圆和方块进行分类:

接下来采样不同的数据集:

接下来训练分类器:

平均投票,获取最终结果:

主要实现过程总结:

随机森林:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。随机森林 = Bagging + 决策树 :

例如,如果你训练了5个树,其中有4个树的结果是True,1个树的结果是False,那么最终投票结果就是True

随机森林够造过程中的关键步骤(M表示特征数目):

1)一次随机选出一个样本,有放回的抽样,重复N次(有可能出现重复的样本)

2)随机去选出m个特征,m<<M,建立决策树

在随机森林构造过程中,如果进行有放回的抽样,我们会发现,总是有一部分样本我们选不到。随机森林的Bagging过程,对于每一颗训练出的决策树gt,与数据集D有如下关系:

对于星号的部分,即是没有选择到的数据,称之为Out-of-bag(OOB)数据,当数据足够多,对于任意一组数据(n,yn)是包外数据的概率为: 

由于基分类器是构建在训练样本的自助抽样集上的,只有约63.2%原样本集出现在中,而剩余的36.8%的数据作为包外数据,可以用于基分类器的验证集。 经验证,包外估计是对集成分类器泛化误差的无偏估计。

1)当基学习器是决策树时,可使用包外样本来辅助剪枝,或用于估计决策树中各结点的后验概率以辅助对零训练样本结点的处理。

2)当基学习器是神经网络时,可使用包外样本来辅助早期停止以减小过拟合。

bagging集成优点:Bagging +决策树/线性回归/逻辑回归/深度学习...= bagging集成学习方法。经过上面方式组成的集成学习方法:1)均可在原有算法上提高约2%左在的泛化正确率 2)简单,方便,通用。

Otto Group Product(实操)

背景介绍:奥托集团是世界上最大的电子商务公司之一,在20多个国家设有子公司。该公司每天都在世界各地销售数百万种产品,所以对其产品根据性能合理的分类非常重要。

不过,在实际工作中,工作人员发现,许多相同的产品得到了不同的分类。本案例要求,你对奥拓集团的产品进行正确的分分类。尽可能的提供分类的准确性。其地址为:地址 。

本案例中,数据集包含大约200,000种产品的93个特征。其目的是建立一个能够区分otto公司主要产品类别的预测模型。有产品共被分成九个类别(例如时装,电子产品等),如下:

id — 产品id;feat_1,feat_2,..,feat_93 - 产品的各个特征;target - 产品被划分的类别

本案例中,最后结果使用多分类对数损失进行评估。

接下来通过代码进行实现,以下是实现本次案例的相关重要操作:

数据获取

# 导入第三方库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

获取数据集数据,对数据进行一个查看:

通过seaborn可视化库,可以看到我们数据类别不均衡

数据基本处理

接下来通过随机欠采样获取数据:

接下来通过这段代码的作用是从imblearn库中导入RandomUnderSampler类,用于进行随机欠采样(Random Under Sampling)。如果没有该库,终端执行如下命令进行安装:

pip install imbalanced-learn -i https://pypi.mirrors.ustc.edu.cn/simple

通过图形可视化查看数据:

接下来把标签数据转化为数字:

开始分割数据:

模型训练

通过可视化查看数据变化:

模型评估

使用OneHotEncoder对象对y_pre进行独热编码转换。y_pre也是一个一维数组,通过reshape(-1, 1)转换为二维列向量的形式,并使用fit_transform方法进行独热编码转换。最后,将转换后的编码结果赋值给y_pre1。

rf是一个随机森林分类器对象,通过调用predict_proba方法,将测试集x_test作为输入,返回了每个样本所属于每个类别的概率估计值。

模型调优

在机器学习中,模型调优的目的是通过对模型参数的设置和调整来提高模型的性能,接下来对模型调优的超参数进行测试:

# 模型调优——确定最优的 n_estimators
# 确定n_estimators的取值范围
tuned_parameters = range(10, 200, 10)
# 创建添加accuracy的一个numpy
accuracy_t=np.zeros(len(tuned_parameters))
# 创建添加error的一个numpy
error_t=np.zeros(len(tuned_parameters))
# 调优过程实现
for j,one_parameter in enumerate(tuned_parameters):rf2 = RandomForestClassifier(n_estimators=one_parameter, max_depth=10, max_features=10, min_samples_leaf=10, oob_score=True, random_state=0, n_jobs=-1)rf2.fit(x_train, y_train)# 输出accuracyaccuracy_t[j] = rf2.oob_score_# 输出log_lossy_pre = rf2.predict_proba(x_test)error_t[j] = log_loss(y_test, y_pre, normalize=True)print(error_t)

得出的结果如下:

#优化结果过程可视化
fig,axes =plt.subplots(nrows=1,ncols=2,figsize=(20, 4), dpi=100)axes[0].plot(tuned_parameters,error_t)
axes[1].plot(tuned_parameters,accuracy_t)axes[0].set_xlabel("n_estimators")
axes[0].set_ylabel("error_t")
axes[1].set_xlabel("n_estimators")
axes[1].set_ylabel("accuracy_t")axes[0].grid(True)
axes[1].grid(True)plt.show()

经过图像展示,最后确定n_estimators=175的时候,表现效果不错

# 模型调优——确定最优的max_features
# 确定n_estimators的取值范围
tuned_parameters = range(5, 40, 5)
# 创建添加accuracy的一个numpy
accuracy_t=np.zeros(len(tuned_parameters))
# 创建添加error的一个numpy
error_t=np.zeros(len(tuned_parameters))
# 调优过程实现
for j,one_parameter in enumerate(tuned_parameters):rf2 = RandomForestClassifier(n_estimators=175, max_depth=10, max_features=one_parameter, min_samples_leaf=10, oob_score=True, random_state=0, n_jobs=-1)rf2.fit(x_train, y_train)# 输出accuracyaccuracy_t[j] = rf2.oob_score_# 输出log_lossy_pre = rf2.predict_proba(x_test)error_t[j] = log_loss(y_test, y_pre, normalize=True)print(error_t)

得出的结果如下:

#优化结果过程可视化
fig,axes =plt.subplots(nrows=1,ncols=2,figsize=(20, 4), dpi=100)axes[0].plot(tuned_parameters,error_t)
axes[1].plot(tuned_parameters,accuracy_t)axes[0].set_xlabel("max_features")
axes[0].set_ylabel("error_t")
axes[1].set_xlabel("max_features")
axes[1].set_ylabel("accuracy_t")axes[0].grid(True)
axes[1].grid(True)plt.show()

经过图像展示,最后确定max_feature=15的时候,表现效果不错 

# 模型调优——确定最优的max_depth
# 确定n_estimators的取值范围
tuned_parameters = range(10, 100, 10)
# 创建添加accuracy的一个numpy
accuracy_t=np.zeros(len(tuned_parameters))
# 创建添加error的一个numpy
error_t=np.zeros(len(tuned_parameters))
# 调优过程实现
for j,one_parameter in enumerate(tuned_parameters):rf2 = RandomForestClassifier(n_estimators=175, max_depth=one_parameter, max_features=15, min_samples_leaf=10, oob_score=True, random_state=0, n_jobs=-1)rf2.fit(x_train, y_train)# 输出accuracyaccuracy_t[j] = rf2.oob_score_# 输出log_lossy_pre = rf2.predict_proba(x_test)error_t[j] = log_loss(y_test, y_pre, normalize=True)print(error_t)

得出的结果如下:

#优化结果过程可视化
fig,axes =plt.subplots(nrows=1,ncols=2,figsize=(20, 4), dpi=100)axes[0].plot(tuned_parameters,error_t)
axes[1].plot(tuned_parameters,accuracy_t)axes[0].set_xlabel("max_depth")
axes[0].set_ylabel("error_t")
axes[1].set_xlabel("max_depth")
axes[1].set_ylabel("accuracy_t")axes[0].grid(True)
axes[1].grid(True)plt.show()

经过图像展示,最后确定max_depth=30的时候,表现效果不错

# 模型调优——确定最优的min_sample_leaf
# 确定n_estimators的取值范围
tuned_parameters = range(1, 10, 2)
# 创建添加accuracy的一个numpy
accuracy_t=np.zeros(len(tuned_parameters))
# 创建添加error的一个numpy
error_t=np.zeros(len(tuned_parameters))
# 调优过程实现
for j,one_parameter in enumerate(tuned_parameters):rf2 = RandomForestClassifier(n_estimators=175, max_depth=30, max_features=15, min_samples_leaf=one_parameter, oob_score=True, random_state=0, n_jobs=-1)rf2.fit(x_train, y_train)# 输出accuracyaccuracy_t[j] = rf2.oob_score_# 输出log_lossy_pre = rf2.predict_proba(x_test)error_t[j] = log_loss(y_test, y_pre, normalize=True)print(error_t)

得出的结果如下:

#优化结果过程可视化
fig,axes =plt.subplots(nrows=1,ncols=2,figsize=(20, 4), dpi=100)axes[0].plot(tuned_parameters,error_t)
axes[1].plot(tuned_parameters,accuracy_t)axes[0].set_xlabel("min_sample_leaf")
axes[0].set_ylabel("error_t")
axes[1].set_xlabel("min_sample_leaf")
axes[1].set_ylabel("accuracy_t")axes[0].grid(True)
axes[1].grid(True)plt.show()

经过图像展示,最后确定min_sample_leaf=1的时候,表现效果不错 

由此我们确定了最有的模型数据为:

n_estimators=175;max_depth=30;max_features=15;min_samples_leaf=1

通过获得到的具体的数据,再次模型训练:

rf3 = RandomForestClassifier(n_estimators=175, max_depth=30, max_features=15, min_samples_leaf=1, oob_score=True, random_state=40, n_jobs=-1)
rf3.fit(x_train, y_train)

最终获得到的数据如下:

提交最终结果

我们根据kaggle平台竞赛要求我们提交的格式进行对最终结果的数据处理:

这里我们先把id这一列数据删掉:

接下来对数据进行处理:

接下来我们在第一列添加一个id属性,然后把数据进行保存:

回到我们的浏览器,找到相应的位置就能看到我们保存好的文件,然后回到kaggle网站上提交作品即可:

Boosting集成原理

Boosting是一种常见的集成学习方法,它通过串行地训练多个弱分类器(或回归器)并将它们合并为一个强分类器(或回归器)。Boosting的核心思想是依次训练模型,每一次训练都会调整样本的权重,使得前一轮中被错误分类的样本在下一轮中得到更多的关注。因此,Boosting可以在弱分类器的基础上构建出准确度更高的强分类器。

简而言之:随着学习的积累从弱到强,每新加入一个弱学习器,整体能力就会得到提升。其代表算法:Adaboost,GBDT,XGBoost,LightGBM等。其训练的实现过程如下:

训练第一个学习器:

调整数据分布:

训练第二个学习器:

再次调整分布:

依次训练学习器,调整数据分布:

整体实现过程:

bagging集成与boosting集成的区别:

1)数据方面:

Bagging:对数据进行采样训练;Boosting:根据前一轮学习结果调整数据的重要性。

2)投票方面:

Bagging:所有学习器平权投票;Boosting:对学习器进行加权投票。

3)学习顺序:

Bagging的学习是并行的,每个学习器没有依赖关系;

Boosting学习是串行,学习有先后顺序。

4)主要作用:

Bagging主要用于提高泛化性能(解决过拟合,也可以说降低方差);

Boosting主要用于提高训练精度(解决欠拟合,也可以说降低偏差)

Adaboost介绍

GBDT介绍

XGBoost介绍

LightGBM介绍

LightGBM是一个基于梯度提升决策树(Gradient Boosting Decision Tree,GBDT)的机器学习框架。它是由微软开发的高效、分布式的梯度提升框架,以速度快和高准确率而闻名。

LightGBM的设计目标是解决大规模数据集和高维特征的机器学习问题。它在传统的梯度提升决策树算法的基础上进行了优化,引入了一些创新的技术和策略,以提供更好的性能和可扩展性。

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

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

相关文章

Linux 权限设置

修改文件权限:chmod 使用chmod可以修改文件权限 有两种使用格式:字母法与数字法 chmod 字母法的使用 角色说明: 角色 说明 u user, 表示该文件的所有者 g group, 表示用户组 o other, 表示其他用户 a all, 表示所有用户 权限设置说明: 操作符 说明 +

【Java程序设计】【C00243】基于Springboot的社区医院管理系统(有论文)

基于Springboot的社区医院管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的社区医院管理服务系统 本系统分为系统功能模块、管理员功能模块、用户功能模块以及医生功能模块。 系统功能模块&#xff1a;社…

ElementUI Form:Checkbox 多选框

ElementUI安装与使用指南 Checkbox 多选框 点击下载learnelementuispringboot项目源码 效果图 el-checkbox.vue &#xff08;Checkbox 多选框&#xff09;页面效果图 项目里el-checkbox.vue代码 <script> const cityOptions [上海, 北京, 广州, 深圳] export def…

Mysql-备份与恢复

目录 一、备份表 1.无需备份表结构 2.备份表结构 3.mysqldump方式备份表 二、备份库 一、备份表 1.无需备份表结构 CREATE TABLE a_bak as select * from a;#备份表&#xff08;不包含表结构&#xff09;TRUNCATE TABLE a;#清空表 INSERT INTO a SELECT * FROM a_bak;#插…

JProfiler for Mac:提升性能和诊断问题的终极工具

在当今的高性能计算和多线程应用中&#xff0c;性能优化和问题诊断是至关重要的。JProfiler for Mac 是一个强大的性能分析工具&#xff0c;旨在帮助开发者更好地理解其应用程序的运行情况&#xff0c;提升性能并快速诊断问题。 JProfiler for Mac 的主要特点包括&#xff1a;…

app逆向-frida Hook Java类如何打印[object object]

方法一 console.log(JSON.stringify(p))可能打印不出来字符串&#xff0c;一般能打印出p的字节数组。 方法二 1.先确认object是什么类型(比如要打印p) 先console.log(p.$className) 查看p是什么数据类型2.Java.cast 把p强转为对应类型3.调用该类对应的输出方法。通常有一个to…

2024/2/3

一&#xff0e;选择题 1、适宜采用inline定义函数情况是&#xff08;C&#xff09; A. 函数体含有循环语句 B. 函数体含有递归语句‘、考科一 ’ C. 函数代码少、频繁调用 D. 函数代码多、不常调用 2、假定一个函数为A(int i4, int j0) {;}, 则执行“A (1);”语句后&#xff0c…

机器学习复习(2)——线性回归SGD优化算法

目录 线性回归代码 线性回归理论 SGD算法 手撕线性回归算法 模型初始化 定义模型主体部分 定义线性回归模型训练过程 数据demo准备 模型训练与权重参数 定义线性回归预测函数 定义R2系数计算 可视化展示 预测结果 训练过程 sklearn进行机器学习 线性回归代码…

电商小程序01需求分析

目录 1 电商用例分析2 功能架构3 原型开发3.1 首页3.2 店铺页面3.3 配货单3.4 配货单有货3.5 我的应用3.6 商品详情3.7 订单确认3.8 收货地址3.9 店铺详情3.10 店铺分类3.11 商品分类 总结 低代码学习的时候最高效的方法就是带着问题去学习&#xff0c;一般可以先从电商小程序开…

【大数据】Flink SQL 语法篇(三):窗口聚合(TUMBLE、HOP、SESSION、CUMULATE)

Flink SQL 语法篇&#xff08;三&#xff09;&#xff1a;窗口聚合 1.滚动窗口&#xff08;TUMBLE&#xff09;1.1 Group Window Aggregation 方案&#xff08;支持 Batch / Streaming 任务&#xff09;1.2 Windowing TVF 方案&#xff08;1.13 只支持 Streaming 任务&#xff…

配置实例—交换机VLAN聚合配置实例

一、组网需求 某公司拥有多个部门且位于同一网段&#xff0c;为了提升业务安全性&#xff0c;将不同部门的用户划分到不同VLAN中。现由于业务需要&#xff0c;不同部门间的用户需要互通。如图1所示&#xff0c;VLAN2和VLAN3为不同部门&#xff0c;现需要实现不同VLAN间的用户可…

浪漫的通讯录(顺序表篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能…

代码随想录算法训练营第39天 | 62.不同路径 + 63.不同路径 II

今日任务 62.不同路径 63. 不同路径 II 62.不同路径 - Medium 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只…

flutter如何实现省市区选择器

前言 当我们需要用户填写地址时&#xff0c;稳妥的做法是让用户通过“滚轮”来滑动选择省份&#xff0c;市&#xff0c;区&#xff0c;此文采用flutter的第三方库来实现这一功能&#xff0c;比调用高德地图api简单一些。 流程 选择库 这里我选择了一个最近更新且支持中国的…

Acwing 141 周赛 解题报告 | 珂学家 | 逆序数+奇偶性分析

前言 整体评价 很普通的一场比赛&#xff0c;t2思维题&#xff0c;初做时愣了下&#xff0c;幸好反应过来了。t3猜猜乐&#xff0c;感觉和逆序数有关&#xff0c;和奇偶性有关。不过要注意int溢出。 欢迎关注: 珂朵莉的天空之城 A. 客人数量 题型: 签到 累加和即可 import…

Three.js学习3:第一个Three.js页面

一、一图看懂Three.js 坐标 这个没什么好说的&#xff0c;只是需要注意颜色。在 Three.js 提供的编辑器中&#xff0c;各种物体的坐标也这样的色彩&#xff1a; 红色&#xff1a;x 轴 绿色&#xff1a;y 轴 蓝色&#xff1a;z 轴 Three.js 提供的编辑器可以在本地 Three.js …

常用git指令

一.安装配置git&&利用SSH完成Git与GitHub的绑定 1.参考知乎网址&#xff1a;还不会使用 GitHub &#xff1f; GitHub 教程来了&#xff01;万字图文详解 二.在git上更新仓库步骤 1.在新建文件夹下&#xff0c;右键选择“git bash here” 2.把项目下载到本地&#xf…

AI应用开发-git开源项目的一些问题及镜像解决办法

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

微信小程序(三十一)本地同步存储API

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.存储数据 2.读取数据 3.删除数据 4.清空数据 源码&#xff1a; index.wxml <!-- 列表渲染基础写法&#xff0c;不明白的看上一篇 --> <view class"students"><view class"item…

使用 git 将本地文件上传到 gitee 远程仓库中,推送失败

项目场景&#xff1a; 背景&#xff1a; 使用 git 想要push 本地文件 到 另一个远程仓库&#xff0c;执行 git push origin master后此时报错 问题描述 问题&#xff1a; git push 本地文件 到 另一个远程仓库时&#xff0c;运行 git push origin master ,push文件失败&…