当前位置: 首页 > news >正文

人工智能与机器学习原理精解【27】

文章目录

  • 集成学习
    • 集成学习概述
      • 集成学习的定义
      • 集成学习的性质
      • 集成学习的算法过程
      • 集成学习的算法描述
      • 集成学习的例子和例题
      • Julia实现集成学习
    • 集成学习数学原理
      • 一、基学习器的生成
        • Bagging(装袋法)
        • Boosting(提升法)
      • 二、基学习器的结合策略
        • 平均法
        • 投票法
        • 学习法(Stacking)
      • 三、集成学习的整体性能提升
  • 参考文献

集成学习

集成学习概述

集成学习的定义

集成学习(Ensemble Learning)是一种机器学习范式,通过构建并结合多个学习器(也被称为基学习器或组件学习器)来完成学习任务。这些学习器可以是从同一种学习算法产生的同质学习器,也可以是从不同学习算法产生的异质学习器。集成学习的核心思想是“好而不同”,即基学习器应该具有好的性能,并且它们之间的预测结果应该具有差异性,以提高整体的泛化性能。

集成学习的性质

集成学习的主要性质包括:

  1. 多样性:基学习器之间的差异性是集成学习性能提升的关键。这种差异性可以通过不同的训练数据、不同的学习算法、不同的参数设置等方式来引入。
  2. 鲁棒性:集成学习通过结合多个学习器的预测结果,能够减少单一学习器因数据噪声或模型偏差带来的过拟合风险,从而提高模型的鲁棒性。
  3. 准确性:通过结合多个学习器的预测结果,集成学习通常能够获得比单一学习器更高的预测准确性。

集成学习的算法过程

集成学习的算法过程大致可以分为以下几步:

  1. 生成基学习器:使用一种或多种学习算法从训练数据中生成多个基学习器。这些基学习器可以是同质的,也可以是异质的。
  2. 结合基学习器:通过某种策略将基学习器的预测结果结合起来,得到最终的预测结果。常见的结合策略包括平均法、投票法和学习法(如Stacking)。

集成学习的算法描述

以Bagging和Boosting为例,简要描述集成学习的算法过程:

  1. Bagging

    • 步骤:从原始训练集中通过有放回抽样得到多个训练子集;在每个训练子集上训练一个基学习器;最后通过投票或平均的方式结合基学习器的预测结果。
    • 代表算法:随机森林(Random Forest),即Bagging与决策树结合的算法。
  2. Boosting

    • 步骤:从原始训练集训练出一个基学习器;根据基学习器的预测结果调整训练样本的权重,使得预测错误的样本在后续训练中受到更多关注;基于调整后的样本权重训练下一个基学习器;重复上述过程,直到基学习器数目达到预设值;最后通过加权投票的方式结合基学习器的预测结果。
    • 代表算法:AdaBoost、Gradient Boosting(包括GBDT和XGBoost)。

集成学习的例子和例题

例子:随机森林是一种集成学习算法,它通过构建多个决策树并将它们的预测结果进行投票或平均来得到最终的预测结果。随机森林在分类、回归等任务中都有广泛的应用。

例题:假设有一个二分类问题,使用随机森林算法进行分类。首先,通过有放回抽样从原始训练集中生成多个训练子集;然后,在每个训练子集上训练一个决策树作为基学习器;最后,通过投票的方式结合所有决策树的预测结果得到最终的分类结果。

Julia实现集成学习

在Julia中实现集成学习,虽然没有像Python的scikit-learn那样直接提供完整集成学习框架的库,但我们可以利用Julia现有的机器学习库,如MLJ,来构建集成学习模型。MLJ是一个灵活的机器学习库,它提供了许多算法和工具,可以用于实现集成学习。

以下是一个使用MLJ在Julia中实现简单Bagging集成学习的示例。这个示例将使用决策树作为基学习器,并通过Bagging的方式来结合它们。

首先,确保你已经安装了MLJ和相关的依赖库。你可以使用Julia的包管理器来安装它们:

using Pkg
Pkg.add("MLJ")
Pkg.add("MLJBase")
Pkg.add("MLJEnsembles")
Pkg.add("DecisionTree")

接下来,是实现Bagging集成学习的代码:

using MLJ
using MLJBase
using MLJEnsembles
using DecisionTree# 加载数据集(这里以iris数据集为例)
data = load_iris()
X = data.X
y = data.y# 划分训练集和测试集
train, test = partition(eachindex(y), 0.7, shuffle=true, rng=123)# 定义基学习器(这里使用决策树)
base_learner = DecisionTreeClassifier()# 定义Bagging集成学习器
bagging_model = BaggingEnsemble(base_learner=base_learner,n_estimators=10,         # 使用10个基学习器sampling_fraction=0.8,   # 每个基学习器使用80%的训练数据replace=true,            # 有放回抽样rng=123                  # 随机数种子
)# 训练集成学习器
fit!(bagging_model, X[train, :], y[train])# 评估集成学习器
predictions = predict(bagging_model, X[test, :])
accuracy = sum(predictions .== y[test]) / length(y[test])
println("Accuracy: ", accuracy)

请注意,这个示例代码可能需要根据你安装的MLJ和相关库的具体版本来进行调整。此外,MLJEnsembles库可能不直接包含Bagging的实现(这取决于库的发展情况),因此你可能需要自己实现Bagging的逻辑,或者查找其他可用的Julia库或资源。

如果你发现MLJEnsembles没有直接提供Bagging,你可以通过自己编写循环来训练多个基学习器,并使用投票或平均等方式来结合它们的预测结果。这通常涉及以下步骤:

  1. 对训练数据进行有放回抽样,生成多个训练子集。
  2. 在每个训练子集上训练一个基学习器。
  3. 对测试数据,使用每个基学习器进行预测。
  4. 结合基学习器的预测结果(例如,通过投票或平均)得到最终的预测。

在Julia中实现这些步骤需要一些编程技巧,但得益于Julia的高性能和灵活性,你可以根据自己的需求定制集成学习算法。

集成学习数学原理

一、基学习器的生成

集成学习的第一步是生成多个基学习器。这些基学习器可以是同质的(如都是决策树或都是支持向量机),也可以是异质的(如包含决策树和神经网络)。在生成基学习器时,不同的集成学习方法(如Bagging、Boosting)会有不同的策略。

Bagging(装袋法)

Bagging方法通过有放回抽样从原始训练集中生成多个训练子集,每个子集用于训练一个基学习器。由于是有放回抽样,每个子集可能包含重复的样本,也可能不包含某些原始样本。Bagging的主要目的是通过样本扰动增加基学习器之间的多样性。

Boosting(提升法)

Boosting方法则通过调整训练样本的权重来生成多个基学习器。在Boosting的每一轮迭代中,都会根据前一轮基学习器的预测结果来更新样本权重,使得预测错误的样本在后续轮次中受到更多的关注。通过这种方法,Boosting逐步将弱学习器提升为强学习器。

二、基学习器的结合策略

在生成多个基学习器后,需要采用某种策略将它们结合起来以得到最终的预测结果。常见的结合策略包括平均法、投票法和学习法(如Stacking)。

平均法

对于回归问题,通常使用平均法来结合基学习器的预测结果。平均法可以分为简单平均和加权平均。

  • 简单平均:将各个基学习器的预测结果直接相加后求平均。数学公式为:

    H ( x ) = 1 T ∑ i = 1 T h i ( x ) H(x) = \frac{1}{T} \sum_{i=1}^{T} h_i(x) H(x)=T1i=1Thi(x)

    其中, H ( x ) H(x) H(x) 是最终的预测结果, T T T 是基学习器的数量, h i ( x ) h_i(x) hi(x) 是第 i i i 个基学习器的预测结果。

  • 加权平均:为不同的基学习器分配不同的权重,然后将加权后的预测结果相加。数学公式为:

    H ( x ) = ∑ i = 1 T w i h i ( x ) H(x) = \sum_{i=1}^{T} w_i h_i(x) H(x)=i=1Twihi(x)

    其中, w i w_i wi 是第 i i i 个基学习器的权重,且满足 ∑ i = 1 T w i = 1 \sum_{i=1}^{T} w_i = 1 i=1Twi=1

投票法

对于分类问题,通常使用投票法来结合基学习器的预测结果。投票法可以分为绝对多数投票法、相对多数投票法和加权投票法。

  • 绝对多数投票法:要求某标记的票数必须超过半数才能作为最终的预测结果。
  • 相对多数投票法:预测为得票最多的标记,若同时有多个标记的票数最高,则随机选择一个。
  • 加权投票法:类似于加权平均法,为不同的基学习器分配不同的权重,然后将加权后的票数相加。
学习法(Stacking)

Stacking是一种更复杂的结合策略,它通过将基学习器的预测结果作为新的特征,然后训练一个新的学习器来得到最终的预测结果。Stacking的数学公式可以表示为:

H ( x ) = g ( ϕ ( h 1 ( x ) , h 2 ( x ) , … , h T ( x ) ) ) H(x) = g(\phi(h_1(x), h_2(x), \ldots, h_T(x))) H(x)=g(ϕ(h1(x),h2(x),,hT(x)))

其中, H ( x ) H(x) H(x) 是最终的预测结果, g g g 是新的学习器, ϕ \phi ϕ 是一个映射函数,用于将基学习器的预测结果映射到新的特征空间, h i ( x ) h_i(x) hi(x) 是第 i i i 个基学习器的预测结果。

三、集成学习的整体性能提升

集成学习的整体性能提升可以从偏差-方差分解的角度来解释。Bagging方法主要通过减少基学习器之间的方差来提升集成学习的性能,因为每个基学习器都是在有放回抽样得到的训练子集上训练的,所以它们之间的差异性较大。而Boosting方法则通过逐步调整训练样本的权重来减少基学习器之间的偏差,因为每个基学习器都是在前一轮基学习器的预测结果基础上进行训练的,所以它们之间的偏差会逐渐减小。

总的来说,集成学习的数学原理和公式涉及基学习器的生成、基学习器的结合策略以及集成学习的整体性能提升等多个方面。通过合理的基学习器生成策略和结合策略,集成学习可以获得比单一学习器更好的性能。

参考文献

  1. 文心一言

相关文章:

人工智能与机器学习原理精解【27】

文章目录 集成学习集成学习概述集成学习的定义集成学习的性质集成学习的算法过程集成学习的算法描述集成学习的例子和例题Julia实现集成学习 集成学习数学原理一、基学习器的生成Bagging(装袋法)Boosting(提升法) 二、基学习器的结…...

XXL-JOB在SpringBoot中的集成

在SpringBoot中,XXL-JOB作为一个轻量级的分布式任务调度平台,提供了灵活的任务分片处理功能,这对于处理大规模、复杂的任务场景尤为重要。以下将详细探讨如何在SpringBoot中利用XXL-JOB实现灵活控制的分片处理方案,涵盖配置、代码…...

前端工程规范-3:CSS规范(Stylelint)

样式规范工具(StyleLint) Stylelint 是一个灵活且强大的工具,适用于保持 CSS 代码的质量和一致性。结合其他工具(如 Prettier 和 ESLint),可以更全面地保障前端代码的整洁性和可维护性。 目录 样式规范工具…...

Qt系列-1.Qt安装

Qt安装 0 简介 1.安装步骤 1.1 下载 进入qt中文网站:https://www.qt.io/zh-cn/ Qt开源社区版本:https://www.qt.io/download-open-source#source 1.2 安装 chmod +x qt-online-installer-linux-x64-4.8.0.run ./qt-online-installer-linux-x64-4.8.0.run 外网不能下载…...

《自控原理》最小相位系统

在复平面右半平面既没有零点,也没有极点的系统,称为最小相位系统,其余均为非最小相位系统。 从知乎看了一篇答案: https://www.zhihu.com/question/24163919 证明过程大概率比较难,我翻了两本自控的教材,…...

SpringBoot3脚手架

MySpringBootAPI SpringBoot3脚手架&#xff0c;基于SpringBoot3DruidPgSQLMyBatisPlus13FastJSON2Lombok&#xff0c;启动web容器为Undertow(非默认tomcat)&#xff0c;其他的请自行添加和配置。 <java.version>17</java.version> <springboot.version>3.3…...

【C语言软开面经】

C语言软开面经 malloc calloc realloc free动态分配内存malloccalloc函数&#xff1a;realloc 函数&#xff1a;free函数&#xff1a; 堆栈-内存分区栈区&#xff08;Stack&#xff09;&#xff1a;堆区&#xff08;Heap&#xff09;&#xff1a;全局&#xff08;静态&#xff…...

YOLOv11训练自己的数据集(从代码下载到实例测试)

文章目录 前言一、YOLOv11模型结构图二、环境搭建三、构建数据集四、修改配置文件①数据集文件配置②模型文件配置③训练文件配置 五、模型训练和测试模型训练模型验证模型推理 总结 前言 提示&#xff1a;本文是YOLOv11训练自己数据集的记录教程&#xff0c;需要大家在本地已…...

HTML粉色烟花秀

目录 系列文章 写在前面 完整代码 下载代码 代码分析 写在最后 系列文章 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4...

从零开发操作系统

没有操作系统 要考虑放到什么位置 org 07c00h 我用nasm&#xff08;汇编编译&#xff09; 放到7c00处 ibm兼容机 AX发生变化 -寄存器 不可能做存储 内存- 代码段数据段 if else --指令 代码 int a -数据段 必须告诉计算机代码段从哪里开始 改变cs寄存器里面的值可以改变推进寄…...

SigmaStudio中部分滤波器算法有效性频谱分析

一、各类滤波器参数如下图设置 1.1、输入源白噪音经过如下算法处理后Notch\Band Pass\Band Stop&#xff0c;如下频谱分析图 1.2、输入源白噪音经过low pass后处理前后的频谱分析如如下 二、Notch滤波器配置图&#xff0c;如下 2.1、两串联、五个串联和未串联的Notch对白噪音…...

ArcGIS与ArcGIS Pro去除在线地图服务名单

我们之前给大家分享了很多在线地图集&#xff0c;有些地图集会带有制作者信息&#xff0c;在布局制图的时候会带上信息影响出图美观。 一套GIS图源集搞定&#xff01;清新规划底图、影像图、境界、海洋、地形阴影图、导航图 比如ArcGIS&#xff1a; 比如ArcGIS Pro&#xff1a…...

滚雪球学MySQL[10.1讲]:常见问题与解决

全文目录&#xff1a; 前言10. 常见问题与解决10.1 数据库连接问题10.1.1 无法连接到数据库10.1.2 连接超时10.1.3 连接数过多 10.2 性能问题10.2.1 查询速度慢10.2.2 数据库锁等待 10.3 数据完整性问题10.3.1 违反外键约束10.3.2 重复记录 10.4 安全问题10.4.1 SQL注入攻击10.…...

利用 Llama-3.1-Nemotron-51B 推进精度-效率前沿的发展

今天&#xff0c;英伟达™&#xff08;NVIDIA&#xff09;发布了一款独特的语言模型&#xff0c;该模型具有无与伦比的准确性和效率性能。Llama 3.1-Nemotron-51B 源自 Meta 的 Llama-3.1-70B&#xff0c;它采用了一种新颖的神经架构搜索&#xff08;NAS&#xff09;方法&#…...

SpringBoot+Thymeleaf发票系统

> 这是一个基于SpringBootSpringSecurityThymeleafBootstrap实现的简单发票管理系统。 > 实现了用户登录&#xff0c;权限控制&#xff0c;客户管理&#xff0c;发票管理等功能。 > 并且支持导出为 CSV / PDF / EXCEL 文件。 > 本项目是一个小型发票管理系统…...

Updates were rejected because the tip of your current branch is behind 的解决方法

1. 问题描述 当我们使用 git push 推送代码出现以下问题时&#xff1a; 2. 原因分析 这个错误提示表明当前本地分支落后于远程分支&#xff0c;因此需要先拉取远程的更改。 3. 解决方法 1、拉取远程更改 在终端中执行以下命令&#xff0c;拉取远程分支的更新并合并到本地…...

Redis桌面工具:Tiny RDM

1.Tiny RDM介绍 Tiny RDM&#xff08;Tiny Redis Desktop Manager&#xff09;是一个现代化、轻量级的Redis桌面客户端&#xff0c;支持Linux、Mac和Windows操作系统。它专为开发和运维人员设计&#xff0c;使得与Redis服务器的交互操作更加便捷愉快。Tiny RDM提供了丰富的Red…...

【Java】酒店管理系统

一 需求: 编写程序 模拟酒店管理系统 : 预订和退订以及查看所有房间 1 需要有一个酒店类 2 需要有一个房间类 3 需要有一个客户端类 public class Test { } 二 分析: 客户端 : 1 先打印所有房间 2 等待用户输入,根据输入情况 判断是预订还是退订 3 等待用户输入房间号 …...

【数据库】Java 中 MongoDB 使用指南:步骤与方法介绍

MongoDB 是一个流行的 NoSQL 数据库&#xff0c;因其灵活性和高性能而广泛使用。在 Java 中使用 MongoDB&#xff0c;可以通过 MongoDB 官方提供的 Java 驱动程序来实现。本文将详细介绍在 Java 中使用 MongoDB 的步骤以及相关方法。 1. 环境准备 1.1 安装 MongoDB 首先&…...

MySQL之内置函数

目录 一、日期函数 二、字符串函数 三、数学函数 四、其它函数 一、日期函数 常见的日期函数如下&#xff1a; 函数名称说明current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳date_add(date, interval d_value_type)在date中添加日…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...