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

目录

初识集成学习

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)
    # 输出accuracy
    accuracy_t[j] = rf2.oob_score_
    # 输出log_loss
    y_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)
    # 输出accuracy
    accuracy_t[j] = rf2.oob_score_
    # 输出log_loss
    y_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)
    # 输出accuracy
    accuracy_t[j] = rf2.oob_score_
    # 输出log_loss
    y_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)
    # 输出accuracy
    accuracy_t[j] = rf2.oob_score_
    # 输出log_loss
    y_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的设计目标是解决大规模数据集和高维特征的机器学习问题。它在传统的梯度提升决策树算法的基础上进行了优化,引入了一些创新的技术和策略,以提供更好的性能和可扩展性。

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

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

相关文章

增加Vscode引用路径

增加Vscode引用路径 增加Vscode引用路径问题说明解决思路1在Vscode中进行配置缺点 解决思路2 增加Vscode引用路径 问题说明 在嵌入式开发中需要经常用到库函数(SPL), Vscode需要配置引用路径才能对函数名或变量进行跳转 解决思路1 与Keil5 MDK类似, 在配置C/C的json文件中添…

计算机网络_1.6.2 计算机网络体系结构分层的必要性

1.6.2 计算机网络体系结构分层的必要性 一、五层原理体系结构每层各自主要解决什么问题1、物理层2、数据链路层3、网络层4、运输层5、应用层 二、总结三、练习 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 本节主要介绍实现计算机网络需要解决哪些问题&#xff1f;以…

【Crypto | CTF】BUUCTF 大帝的密码武器1

天命&#xff1a;这题真的是来刷经验的&#xff0c;有点吐血 首先这题是贼简单&#xff0c;但我居然跪到了&#xff0c;所以特此写这一篇来惩戒自己心太大 拿到文件&#xff0c;文件写着zip&#xff0c;改成zip后缀名即可&#xff0c;也不算啥难的 打开里面的两份文件&#x…

NLP入门系列—Attention 机制

NLP入门系列—Attention 机制 Attention 正在被越来越广泛的得到应用。尤其是 [BERT]火爆了之后。 Attention 到底有什么特别之处&#xff1f;他的原理和本质是什么&#xff1f;Attention都有哪些类型&#xff1f;本文将详细讲解Attention的方方面面。 Attention 的本质是什…

LabVIEW传感器通用实验平台

LabVIEW传感器通用实验平台 介绍了基于LabVIEW的传感器实验平台的开发。该平台利用LabVIEW图形化编程语言和多参量数据采集卡&#xff0c;提供了一个交互性好、可扩充性强、使用灵活方便的传感器技术实验环境。 系统由硬件和软件两部分组成。硬件部分主要包括多通道数据采集卡…

MySQL 安装配置 windows

一、下载 去官网MySQL :: MySQL Downloads 下载社区版 然后根据自己的系统选择 直接下载。 二、安装 点击安装程序 这边看样子缺少东西。 去这边下载 Latest supported Visual C Redistributable downloads | Microsoft Learn 然后再一次安装mysql 三、配置 安装完成后&a…

Vue3_基础使用_2

这节主要介绍&#xff1a;标签和组件的ref属性&#xff0c;父子组件间的传递值&#xff0c;ts的接口定义&#xff0c;vue3的生命周期 1.标签的ref属性。 1.1ref属性就是给标签打标识用的&#xff0c;相当于html的id&#xff0c;但是在vue3中用id可能会乱&#xff0c;下面是ref…

ncc匹配(一,理论)

前头从来没用过ncc&#xff0c;基于形状匹配搞定后&#xff0c;又翻了翻learning opencv&#xff0c;他并不推荐ncc&#xff0c;而是力推emd&#xff0c;这也是当初我没考虑用ncc的原因。 当初看到ncc公式很复杂&#xff0c;也就忘了。 我的第一个匹配&#xff0c;是最笨的&a…

系统架构19 - 面向对象

面向对象设计 相关概念面向对象分析基本步骤基本原则分析模型 面向对象设计设计模型类的类型 面向对象编程基本特点需求建模设计原则面向对象软件测试 相关概念 接口&#xff1a;描述对操作规范的说明&#xff0c;其只说明操作应该做什么&#xff0c;并没有定义操作如何做。消…

服务器基础知识(IP地址与自动化技术的使用)

目录 ip地址是什么&#xff1f; 如何查看ip地址 Windows的命令提示符 图形化版本&#xff1a; 自动化技术的应用与意义 ip地址是什么&#xff1f; IP地址的主要作用是**为互联网上的每个网络和每台主机分配一个逻辑地址**。 它由32位二进制数字组成&#xff0c;通常分为四…

无人机激光雷达标定板

机载激光雷达标定板是用于校准和验证机载激光雷达系统的设备。由于机载激光雷达系统在测量地形、建筑物和植被等方面具有广泛的应用&#xff0c;因此标定板的使用对于确保测量结果的准确性和可靠性至关重要。 标定板通常由高反射率的材料制成&#xff0c;如镀金的玻璃或陶瓷&am…

关于爬取所有哔哩哔哩、任意图片、所有音乐、的python脚本语言-Edge浏览器插件 全是干货!

这些都是现成的并且实时更新的&#xff01;从次解放双手&#xff01; 首先有自己的edge浏览器基本上都有并且找到插件选项 1.哔哩哔哩视频下载助手&#xff08;爬取哔哩哔哩视频&#xff09; bilibili哔哩哔哩视频下载助手 - Microsoft Edge Addons 下面是效果&#xff1a; 2.图…

谷歌浏览器网站打不开,显示叹号

问题&#xff1a; 您与此网站之间建立的连接不安全请勿在此网站上输入任何敏感信息&#xff08;例如密码或信用卡信息&#xff09;&#xff0c;因为攻击者可能会盗取这些信息。 了解详情 解决方式&#xff1a; 网上有很多原因&#xff0c;亲测为DNS问题&#xff0c;设置&…

iPad“粘贴自”字样不消失解决办法

iPad“粘贴自”字样不消失解决办法 好无语&#xff0c;写论文主要就靠iPad看资料&#xff0c;复制粘帖的时候卡死搞得我无敌焦躁&#xff0c;问了&#x1f34e;支持的客服才解决&#xff0c;方法如下&#xff1a;1.音量上键按一下 2.音量下键按一下 3.一直按开关机键直到出现苹…

pytest的常用插件和Allure测试报告

pytest常用插件 pytest-html插件 安装&#xff1a; pip install pytest-html -U 用途&#xff1a; 生成html的测试报告 用法&#xff1a; ​在.ini配置文件里面添加 addopts --htmlreport.html --self-contained-html 效果&#xff1a; 执行结果中存在html测试报告路…

智能汽车竞赛摄像头处理(3)——动态阈值二值化(大津法)

前言 &#xff08;1&#xff09;在上一节中&#xff0c;我们学习了对图像的固定二值化处理&#xff0c;可以将原始图像处理成二值化的黑白图像&#xff0c;这里面的本质就是将原来的二维数组进行了处理&#xff0c;处理后的二维数组里的元素都是0和255两个值。 &#xff08;2…

RFID手持终端_智能pda手持终端设备定制方案

手持终端是一款多功能、适用范围广泛的安卓产品&#xff0c;具有高性能、大容量存储、高端扫描头和全网通数据连接能力。它能够快速平稳地运行&#xff0c;并提供稳定的连接表现和快速的响应时&#xff0c;适用于医院、物流运输、零售配送、资产盘点等苛刻的环境。通过快速采集…

javaScript的序列化与反序列化

render函数的基本实现 javaScript的序列化与反序列化 一&#xff0c;js中的序列化二&#xff0c;序列化三&#xff0c;反序列化四&#xff0c;总结 一&#xff0c;js中的序列化 js中序列化就是对象转换成json格式的字符串&#xff0c;使用JSON对象的stringify方法&#xff0c;…

18.3K Star,简洁强大下载利器

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 今天推荐一个强大简洁下载利器&#xff0c;用于从各种网站下载图像/视…

Linux(一)

介绍 常见的操作系统(windows、IOS、Android、MacOS, Linux, Unix)&#xff1b; 一个开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发已经得到业界的认可&#xff1b;目前很多企业级的项目(c/c/php/python/java/go)都会部署到 Linux/unix 系统上。 吉祥物 …