4.4 机器学习 - 集成学习

集成学习通过 “组合多个基础模型” 提升泛化能力,核心分为并行集成(Bagging)串行集成(Boosting)多层集成(Stacking) 三大范式,分别对应 “降方差”“降偏差”“兼顾偏差与方差” 三大优化目标,适用场景与实现逻辑差异显著。

一、Bagging:并行集成,专注降低方差(Bootstrap AGGregatING)

Bagging 的核心是 “用数据多样性抵消模型波动”,通过并行训练多个相同基础模型,最终平均 / 投票输出,主打 “提升模型稳定性”,对偏差影响极小。

1. 核心原理与流程

三步实现数据采样、并行训练与结果融合,关键在于 “有放回采样(Bootstrap)” 创造多样性:

  1. 数据采样:对含 m 个样本的原始训练集,有放回采样 m 次,生成 n 个不同的训练集(每个训练集样本有重复);
  2. 并行训练:用 n 个训练集,并行训练 n 个完全相同的基础模型(如决策树);
  3. 结果融合:
    • 回归任务:n 个模型预测结果取平均;
    • 分类任务:n 个模型预测结果投票(少数服从多数)。

(1−lim⁡m→∞(1−1/m)m=1−1/e≈63%)(1-\lim_{m \to \infty}(1-1/m)^m = 1-1/e \approx 63\%) (1mlim(11/m)m=11/e63%) 的样本会被采样到,未被采样的 “Out-of-Bag(OOB)样本” 可直接作为验证集,无需额外划分数据。

2. 代码实现(简化版)

from copy import deepcopy
import numpy as np
import pandas as pd  # 假设输入为DataFrame格式class Bagging: def __init__(self, base_learner, n_learners): # 初始化n个相同基础模型(深拷贝避免参数共享)self.learners = [deepcopy(base_learner) for _ in range(n_learners)] self.n_learners = n_learnersdef fit(self, X: pd.DataFrame, y: pd.Series): # 循环模拟并行训练(实际工程中可多线程/多进程加速)for learner in self.learners: # Bootstrap有放回采样:生成与原数据量相同的样本索引sample_indices = np.random.choice(np.arange(len(X)), size=len(X), replace=True)# 用采样数据训练单个基础模型learner.fit(X.iloc[sample_indices], y.iloc[sample_indices]) def predict(self, X: pd.DataFrame) -> np.ndarray: # 回归任务:多模型预测结果取平均preds = np.array([learner.predict(X) for learner in self.learners])  # 形状:(n_learners, 样本数)return preds.mean(axis=0)  # 按样本维度平均,输出形状:(样本数,)

3. 适用场景与典型案例

  • 核心作用:显著降低方差(多模型平均抵消单模型对数据的敏感波动),对偏差基本无影响;
  • 适配基础模型:仅对 “不稳定模型” 有效(如决策树、神经网络)—— 这类模型对训练数据细节敏感,数据微小变化会导致预测结果大幅波动;对 “稳定模型”(如线性回归)效果有限;
  • 典型案例:随机森林(Random Forest)—— 在 Bagging 基础上,对每个决策树的 “特征” 也进行随机采样(如每次分裂仅选 1/3 特征),进一步增加模型多样性,降低过拟合风险。

二、Boosting:串行集成,专注降低偏差

Boosting 的核心是 “逐步修正错误,强化弱模型”,通过串行训练多个弱模型(如浅层决策树),后一个模型聚焦前一个模型的错误样本,最终加权融合,主打 “提升模型准确性”。

1. 核心原理与流程

三步实现串行训练、错误聚焦与加权融合,关键在于 “样本权重调整”:

  1. 弱模型串行训练:按顺序训练 n 个弱模型(如深度≤3 的决策树),每个模型的训练依赖前一个模型的误差;
  2. 错误样本聚焦:通过调整样本权重(或重新采样),让后一个模型更关注前一个模型预测错误的样本(如错误样本权重升高,正确样本权重降低);
  3. 结果加权融合:根据每个弱模型的性能(误差率)分配权重(误差率越低,权重越高),最终预测结果为各模型预测值的加权和。

典型算法:

  • AdaBoost:通过 “样本权重更新” 聚焦错误 错误样本权重×(1/误差率),正确样本权重×误差率错误样本权重 \times(1 / 误差率), \quad 正确样本权重 \times 误差率错误样本权重×(1/误差率),正确样本权重×误差率
  • Gradient Boosting:通过 “拟合前一轮模型的残差” 聚焦错误 残差=真实值−前一轮预测值残差 = 真实值 - 前一轮预测值残差=真实值前一轮预测值,适用性更广。

2. Gradient Boosting:基于残差的经典实现

Gradient Boosting(梯度提升)是工业界最常用的 Boosting 算法,通过 “拟合残差” 优化偏差,引入 “学习率(η)” 控制修正幅度,避免过拟合。

(1)核心公式
  • 模型迭代公式:

    Ht+1(x)=Ht(x)+η⋅ft(x)\Large H_{t+1}(x) = H_t(x) + \eta \cdot f_t(x)Ht+1(x)=Ht(x)+ηft(x)

    • Ht(x)H_t(x)Ht(x):第 t 轮集成模型的预测值;
    • ft(x)f_t(x)ft(x):第 t 个弱模型(拟合Ht(x)H_t(x)Ht(x)的残差,即y−Ht(x)y - H_t(x)yHt(x));
    • η\etaη(学习率):控制ft(x)f_t(x)ft(x)的贡献度(通常取 0.01~0.1),避免单模型影响过大导致过拟合。
  • 残差意义:当使用 MSE(均方误差)作为损失函数时,残差 y−Ht(x)y - H_t(x)yHt(x) 等于损失函数对 Ht(x)H_t(x)Ht(x) 的负梯度 −∂L/∂Ht(x)-\partial L / \partial H_t(x)L/Ht(x),即梯度下降的方向 —— 本质是用 “残差” 替代 “梯度”,简化计算。

(2)代码实现(简化版)
from copy import deepcopy
import numpy as np
import pandas as pdclass GradientBoosting: def __init__(self, base_learner, n_learners, learning_rate=0.1): self.learners = [deepcopy(base_learner) for _ in range(n_learners)] self.lr = learning_rate  # 学习率,控制每轮残差修正幅度self.n_learners = n_learnersdef fit(self, X: pd.DataFrame, y: pd.Series): residual = y.copy().values  # 初始残差=真实值(第0轮模型预测为0)for learner in self.learners: # 弱模型拟合当前残差(将残差视为“新的真实值”)learner.fit(X, residual) # 更新残差:减去当前模型的修正量(修正量=模型预测值×学习率)residual -= self.lr * learner.predict(X) def predict(self, X: pd.DataFrame) -> np.ndarray: # 所有弱模型预测值加权求和(权重=学习率)preds = np.array([learner.predict(X) for learner in self.learners])  # 形状:(n_learners, 样本数)return preds.sum(axis=0) * self.lr  # 按样本维度求和,输出形状:(样本数,)

3. GBDT 与工程优化

  • GBDT(Gradient Boosting Decision Trees):以 “浅层 CART 树” 为弱模型的 Gradient Boosting,兼顾精度与可解释性,广泛用于推荐系统(CTR 预测)、金融风控(违约预测)等场景;
  • 工程优化算法:
    • XGBoost:引入 “树复杂度正则化”(L1/L2 正则)、“缺失值自动处理”,支持并行计算(特征分裂候选值并行),训练速度比传统 GBDT 快 5~10 倍;
    • LightGBM:采用 “直方图优化”(将连续特征离散为直方图)、“Leaf-wise 树生长”(优先分裂增益大的叶子节点),进一步提升训练效率,适合亿级样本场景。

三、Stacking:多层集成,兼顾偏差与方差

Stacking 的核心是 “用不同模型多样性 + 多层学习”,通过并行训练多个不同基础模型,将其输出作为新特征输入 “元模型”,兼顾 “稳定性” 与 “准确性”,灵活性高于 Bagging 和 Boosting。

1. 单层 Stacking:基础结构

(1)核心流程

三层结构实现 “基础模型特征提取 + 元模型融合”,关键在于 “不同基础模型” 与 “特征拼接”:

  1. 第一层(基础模型层):并行训练 n 个不同类型的基础模型(如 Random Forest、GBDT、MLP),每个模型输出预测结果(如分类任务输出类别概率,回归任务输出连续值);
  2. 特征拼接(Concat):将 n 个基础模型的预测结果拼接成 “新特征矩阵”(如 3 个基础模型 → 新特征维度 = 3);
  3. 第二层(元模型层):用 “新特征矩阵” 训练元模型(如逻辑回归、Dense 层),输出最终预测结果。
(2)结构示意图
# 单层Stacking结构(核心:不同基础模型+元模型融合)元模型(如逻辑回归、Dense层)👆-------------------|     Concat      |  # 拼接各基础模型的预测结果(新特征)-------------------👆----------------  👆  ----------------  👆  ----------------| Random Forest |  |    GBDT     |  |    ...    |  |    MLP    |  # 不同类型基础模型----------------  👆  ----------------  👆  ----------------👆-------------------|     Inputs      |  # 原始输入特征(如用户特征、物品特征)-------------------
(3)核心作用
  • 主要降低方差:通过 “不同类型基础模型” 的多样性(如树模型 + 神经网络),抵消单一模型的波动;
  • 对比 Bagging:Bagging 靠 “相同模型 + 数据采样” 创造多样性,Stacking 靠 “不同模型” 创造多样性,灵活性更高,可适配更多场景。

2. 多层 Stacking:进阶结构

(1)核心流程

在单层基础上增加层级,实现 “逐层修正偏差”:

  1. 多层级联:每一层的输出作为下一层的输入(如 L1 层输出 → L2 层输入,L2 层输出 → L3 层输入);
  2. 每层多样性:每一层可使用不同基础模型(如 L1 用树模型,L2 用线性模型),高层元模型聚焦修正低层的偏差。
(2)结构示意图
# 多层Stacking结构(核心:层级联+逐层修正偏差)L3:元模型(如Dense层)👆-------------------|     Concat      |  # L2层各模型预测结果拼接-------------------👆----------------  👆  ----------------  👆  ----------------| Random Forest |  |    GBDT     |  |    ...    |  |    MLP    |  # L2层基础模型----------------  👆  ----------------  👆  ----------------👆-------------------|     Concat      |  # L1层各模型预测结果拼接-------------------👆----------------  👆  ----------------  👆  ----------------| Random Forest |  |    GBDT     |  |    ...    |  |    MLP    |  # L1层基础模型----------------  👆  ----------------  👆  ----------------👆-------------------|     Inputs      |  # 原始输入特征-------------------
(3)过拟合解决策略

多层 Stacking 的高层(如 L2、L3)因 “新特征维度低、数据量少” 易过拟合,需针对性优化:

  1. 分层数据划分:将数据集分为 A、B 两组,A 训练 L1 层,B 训练 L2 层(避免 L2 层看到 L1 层的训练数据,导致数据泄露);
  2. K 折 Bagging 重复:
    • 对每一层,用 K 折交叉验证训练 K 个模型,取 “Out-of-Fold(OOF)预测结果” 作为下一层输入(如 K=5,每个样本仅用 “未参与训练的 1 折模型” 预测,避免过拟合);
    • 重复 n 次 K 折过程,对同一样本的 n 次预测取平均,进一步降低波动。

四、三大集成范式对比

集成范式核心目标(降低偏差 / 方差)计算成本并行性关键特点适用场景
Bagging方差(主要)n(n = 基础模型数)高(n 个模型并行)相同基础模型 + Bootstrap 采样,稳定优先模型波动大、需提升稳定性(如决策树)
Boosting偏差(主要)n低(串行训练)弱模型串行 + 错误聚焦,精度优先模型欠拟合、需提升准确性(如浅层模型)
单层 Stacking方差(主要)n高(基础模型并行)不同基础模型 + 元模型融合,灵活优先需平衡稳定与灵活(如多模态数据)
多层 Stacking偏差 + 方差(兼顾)n×l×k(n = 模型数,l = 层数,k=K 折)中(每层内并行)层级联 + 逐层修正,需防过拟合高精度场景(如竞赛、核心业务预测)

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

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

相关文章

机器学习 - 使用 ID3 算法从原理到实际举例理解决策树

一、什么是决策树1.基本概念决策树是一种树形结构,由结点(node) 和有向边(directed edge) 组成。其中结点分为两类:内部结点(internal node):表示一个属性(特…

【期末复习】嵌入式——S5PV210开发板

本文为嵌入式课程期末复习,仅供参考,所用课本:嵌入式Linux操作系统(李建祥著)。第一章1.1 简述嵌入式微处理器数据存储格式的大,小端模式。大端模式是指数据的高字节保存在内存的低地址中,而数据…

word文档结尾批量插入图片 docx批量插入图片 指定几张

如果你有一些word文档。比如工作总结。你想每一个文档里面都插入几张图片。插入到每个文档的结尾,那么你可以使用这个工具。首先准备好你的文档。然后把它们拖进右边的方框中。拖动的时候,拖动第一个,然后准备好你的图片。把你的图片全部拖动…

CodeBuddy国际版又更新了体验感1

CodeBuddy国际版又更新了 更好的使用体验更少的资源消耗合理的消耗剩余资源使用起来也是很不错的,这次更新自动模式想不到的少,可以用于其他的例如翻译与写测试用例或者其他的说明文档等或者是阅读一下项目更好了解项目总的上来说 使用体验响应速度还是不…

基于开源AI智能名片链动2+1模式S2B2C商城小程序的公益课引流策略研究

摘要:本文聚焦公益课引流场景,探讨开源AI智能名片、链动21模式与S2B2C商城小程序的融合应用。通过构建低成本用户裂变体系,分析该技术组合在精准筛选、社群运营、激励机制设计中的协同效应。研究提出"智能名片画像-链动裂变激励-S2B2C生…

季度最强策略:年化247%,回撤10%,夏普比率3.79。附大小盘轮动策略python源代码。

原创内容第993篇,专注AGI,AI量化投资、个人成长与财富自由。 季度最强策略: 年化247%,回撤10%,夏普比率3.79。3积分可查看参数。 大小盘轮动的策略源代码: 年化收益18.8%。 from engine import Task, Eng…

testng.xml

一、TestNG.xml 是 TestNG 测试框架的核心配置文件,用于组织和控制测试执行。通过它,可以灵活地管理测试套件、测试类、方法,并设置各种执行参数一个基本的 testng.xml文件通常以 ​​DOCTYPE 声明​​开头,并遵循特定的文档类型定…

上架商品合规流程有多条,有的长,有的短,有的需要审核,校验商品的合规性

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

[嵌入式][stm32h743iit6] 野火繁星stm32h743iit6开发板使用学习记录

[嵌入式][stm32h743iit6] 野火繁星stm32h743iit6开发板使用学习记录野火繁星STM32H743IIT6开发板使用学习速记问题描述尝试解决野火繁星STM32H743IIT6开发板使用学习速记 问题描述 在使用该开发板学习stm32hal库pwm开发时, 偶遇代码无法驱动sg90舵机进行旋转, 无论占空比设置…

Android 热点开发的相关api总结

Android 热点 一、前言热点开发属于系统级功能开发,涉及的核心 API 多为系统签名权限保护(如android.permission.TETHER_PRIVILEGED),通常仅系统应用(如 Settings)可正常调用。 实际开发中,除基…

Claude Code 使用指南

Claude Code 使用指南 在 AI 辅助编程领域,我们正经历从简单的代码补全到能够自主执行复杂任务的“智能体”(Agent)的深刻变革。Claude Code 正是这一变革的杰出代表。它并非一个简单的问答机器人,而是一个设计精密的编程协作系统…

Spring Boot常用注解-详细解析+示例

1. SpringBootApplication详细解析:组合注解,包含Configuration(标记配置类)、EnableAutoConfiguration(开启自动配置)、ComponentScan(组件扫描)。启动类标注后,Spring …

基于原神游戏物品系统小demo制作思路

概述 本文介绍了一个基于C的游戏物品与角色管理系统,该系统实现了游戏中的物品分类、角色属性管理、队伍组建以及背包物品使用等功能。该系统采用面向对象的设计原则,通过继承和多态实现了可扩展的物品效果系统。 系统架构 1. 物品类型系统 系统定义了三…

Grounded-Segment-Anything 环境配置

Grounded-Segment-Anything 环境配置Grounded-Segment-Anything 介绍环境配置Install osx(非必须):Install RAM & Tag2Text:报错 module ‘pkgutil‘ has no attribute ‘ImpImporter‘. Did you mean: ‘zipimporter‘?运行输出分割文本提示检测远…

ZYNQ 定时器

一、ZYNQ定时器简介 每个Cortex-A9处理器都有自己的专用32位定时器和32位看门狗定时器。两个处理器共享一个全局64位定时器。这些计时器的时钟始终为CPU频率(CPU_3x2x)的1/2。在系统级,有一个24位看门狗定时器和两个16位三重定时器/计数器。系…

Java8 Comparator接口 和 List Steam 排序使用案例

在Java中,Comparator接口主要用于实现自定义排序逻辑,适用于未实现Comparable接口或需要覆盖默认比较规则的场景。以下是核心使用方法和注意事项:一、基础用法‌匿名内部类实现‌传统方式通过匿名内部类重写compare()方法,例如对整…

word2vec模型案例

代码实现:import torch.optim as optim from tqdm import tqdm, trange import numpy as np import torch from torch import nn import torch.nn.functional as FCONTEXT_SIZE 2raw_text """We are about to study the idea of a computational p…

< 自用文 OS 有关 > (续)发现正在被攻击 后的自救 Fail2ban + IPset + UFW 工作流程详解

继上编:< 自用文 主机 USC 记录:> 发现正在被攻击 后的自救-CSDN博客 环境: 改进: 以下是把代码,懒得写,扔给了 AI ,让它出的: Fail2ban IPset UFW 工作…

Linux —— 虚拟进程地址空间

🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录虚…

简单聊一聊js

JavaScript 是一种高级的、解释型的编程语言。它是现代 Web 开发的三大核心基石之一,与 HTML 和 CSS 并列。​HTML​:负责网页的结构和内容​(如标题、段落、图片)。​CSS​:负责网页的样式和布局​(如颜色…