【集成学习】Bagging算法详解及代码实现

文章目录

  • 1. Bagging集成学习算法
    • 1.1 简介
    • 1.2 基本步骤
    • 1.3 Bagging优缺点
    • 1.4 随机森林:Bagging的一个重要应用
    • 1.5 总结
  • 2. Python代码实现
  • 3. 如何理解偏差与方差
    • 3.1 偏差(Bias)
    • 3.2 方差(Variance)
    • 3.3 方差与偏差的权衡
    • 3.4 举例说明
    • 3.5 如何调整偏差和方差
    • 3.6 偏差与方差的计算
  • 4. Bagging是如何减少方差的?

集成学习(Ensemble Learning)是一种通过结合多个模型的预测结果来提高整体预测性能的技术。常见的集成学习框架有:Bagging、Boosting、Stacking。每种方法都有其独特的优势和适用场景,本文主要聚焦于介绍 Bagging 算法

1. Bagging集成学习算法

1.1 简介

Bagging 全称叫做 Bootstrap aggregating,通过训练多个相同类型的基学习器,并将他们的预测结果进行集成,从而提高模型整体性能的集成学习方法。Bagging的核心思想是通过并行训练多个基学习器,每个基学习器在训练集的不同子集上进行训练,最终通过这些基学习器的预测结果进行平均(回归任务)或投票(分类任务)得到最终预测结果。

Bagging基本特点如下:

  • 训练n个模型,每个模型在不同训练子集上独立训练
  • 所有基学习器的预测结果进行平均(回归任务)或投票(分类任务)得到最终决策。
  • 采用 bootstrap 采样(有放回采样)从原始数据集中随机抽取样本,通常每个基学习器都基于不同的数据子集进行训练。对于每个基学习器来说,大约有63%的样本会被重复采样到,而剩余的样本则可用作模型的验证集。

1.2 基本步骤

  • 数据采样: 从原始数据中通过自助法随即有放回的抽取多个子集,每个子集的大小与原始数据相同。由于是有放回的抽样,所以每个子集可能包含重复的数据点,而一些数据点可能未被抽取
  • 训练多个基学习器: 使用不同的子集训练多个基学习器。常见的基学习器是决策树,但也通常可以是其它模型算法
  • 集成预测: 对于分类问题,通过投票的方式决定最终分类结果,对于回归问题,则通常通过取平均的方式得到最终的预测结果

1.3 Bagging优缺点

优点:

  • 降低模型的方差 : 通过训练多个基学习器,Bagging能够有效减少模型的方差,特别是在高方差模型(如决策树)上尤为有效。通过集成多个基学习器,能够平滑预测结果,从而提高模型的稳定性,减少过拟合
  • 并行化 :Bagging中的每个基学习器都可以独立训练,因而具有很好的并行化特性。可以充分利用多核处理器和分布式计算平台,显著加快训练过程
  • 使用性强 :Bagging方法对数据的异常值和噪声具有较好的鲁棒性。由于每个基学习器只依赖于部分数据,因此个别样本的噪声不会对最终结果产生过大影响

缺点:

  • 无法减少模型的偏差: 虽然Bagging能够减少方差,但对于已经有较高偏差的模型(如线性模型),Bagging无法显著提升性能,可能不会有效提高模型的整体准确性。

1.4 随机森林:Bagging的一个重要应用

随机森林(Random Forest)是Bagging算法的一个重要应用,它通过使用决策树作为基学习器并结合Bagging技术来构建集成模型。

  • 随机森林不仅利用了Bagging的思想,还在每次进行bootstrap采样时,额外对特征进行随机选择。具体来说,在每个决策树的节点分裂时,随机选择一部分特征进行训练,这种做法进一步增强了不同决策树之间的差异性
  • 通过引入特征的随机选择,随机森林避免了模型过度拟合,提高了决策树之间的多样性,从而增强了集成模型的性能和稳定性

1.5 总结

  • 适用于高方差模型: Bagging非常适合用于那些本身方差较高、不稳定的模型(如决策树)。通过集成多个模型,能够减少过拟合,增强模型的鲁棒性
  • 对噪声具有鲁棒性: 由于每个基学习器都在不同的数据子集上进行训练,因此Bagging能够有效地应对数据中的噪声和异常值
  • 不适用于高偏差模型: 对于一些本身偏差较大的模型(如线性回归),Bagging无法显著提高其性能,因为它主要减少的是方差,而不改变偏差。

2. Python代码实现

class Bagging:
    def __init__(self, base_learner, n_learners):
        self.learners = [clone(base_learner) for _ in range(n_learners)]
    
    def fit(self, X, y):
        for learner in self.learners:
            examples = np.random.choice(
                np.arange(len(X)), int(len(X)), replace=True)
            
            learner.fit(X.iloc[examples, :], y.iloc[examples])

    def predict(self, X):
        preds = [learner.predict(X) for learner in self.learners]
        return np.array(preds).mean(axis=0)

3. 如何理解偏差与方差

在机器学习中,偏差(Bias)和方差(Variance)是衡量模型表现的两个重要概念,它们分别衡量了模型的预测误差和模型对数据变化的敏感度。这两个概念通常用于描述模型的泛化能力和在不同数据集上的表现,理解它们有助于分析和改进模型。

3.1 偏差(Bias)

偏差是指模型的预测结果与真实值之间的差距,反映了模型在拟合训练数据时的系统性误差。简而言之,偏差衡量的是模型的假设与真实数据之间的差异。

  • 高偏差:如果模型的偏差较高,说明它的预测结果与真实值之间存在较大的系统性误差,模型的假设或结构太简单,无法捕捉到数据的复杂性,简单的模型通常会有较高的偏差。

  • 低偏差:如果模型的偏差较低,说明模型能够较好地拟合数据,预测结果接近真实值。复杂的模型通常会有较低的偏差,但可能会导致过拟合。

3.2 方差(Variance)

方差是指模型对训练数据集波动的敏感度。方差大的模型过于关注训练数据,在捕捉潜在模式的同时,也捕捉到了噪声。这种现象被称为过度拟合,即模型在训练数据上表现异常出色,但无法推广到新的、未见过的数据。方差大会导致模型过于复杂,从而降低预测的可靠性。

  • 高方差:如果模型的方差较高,说明它对训练数据集的变化非常敏感,即在不同的训练集上表现差异较大。高方差的模型容易过拟合训练数据,对训练集中的细节(包括噪声)进行了过度拟合
  • 低方差:如果模型的方差较低,说明它的预测结果在不同的训练集之间比较一致,表现出较强的泛化能力

方差的影响:

  • 高方差通常意味着过拟合(Overfitting),即模型过度拟合训练集的噪声和异常值,无法在新的数据上良好表现
  • 低方差通常意味着模型具有较好的泛化能力,但如果方差过低,可能表示模型过于简单

3.3 方差与偏差的权衡

偏差和方差之间通常存在权衡关系。在实际应用中,我们常常需要在偏差和方差之间找到一个平衡点,以获得最佳的模型性能。这种权衡被称为偏差-方差权衡(Bias-Variance Tradeoff)。

  • 高偏差、低方差: 模型过于简单,无法拟合数据的复杂性,容易导致欠拟合
  • 低偏差、高方差: 模型过于复杂,容易拟合训练数据中的噪声,导致过拟合
  • 适中偏差、适中方差: 模型能够捕捉数据的规律,既不缺乏复杂性,也不对训练数据过度敏感,通常是最佳的情况

3.4 举例说明

假设现在正在做一个分类问题,模型的目标是预测某个数据点属于哪个类别

  • 高偏差例子:使用一个线性模型(例如线性回归)来解决一个非常复杂的非线性分类问题。由于模型无法捕捉到数据的非线性关系,预测结果和真实标签之间存在很大的差异。这种情况下,模型的偏差很高,方差很低,属于欠拟合。
  • 高方差的例子:使用一个非常复杂的模型(例如深度神经网络或非常深的决策树)来拟合训练数据。虽然训练误差很小,但当你用新数据测试时,模型的表现大幅下降,因为它在训练过程中学到了过多的噪声和细节。此时,模型的方差较高,偏差较低,属于过拟合。

3.5 如何调整偏差和方差

降低偏差:

  • 增加模型的复杂度,例如使用非线性模型、增加模型的参数数量、增加更多的特征等
  • 提供更多的训练数据,帮助模型学习数据中的复杂关系
  • 减少正则化的强度,允许模型学习更多的细节

降低方差:

  • 减少模型复杂度,例如使用简单的模型(如线性回归、朴素贝叶斯等),避免过度拟合
  • 使用集成学习方法(如Bagging、Boosting等),通过多个模型的集成来减少方差
  • 增加训练数据量,以使模型能够更好地学习数据的整体规律而非细节
  • 使用正则化技术来限制模型复杂度

3.6 偏差与方差的计算

E [ ( y ^ − y ) 2 ] = ( E [ y ^ ] − y ) 2 ⏟ 偏差 2 + E [ ( y ^ − E [ y ^ ] ) 2 ] ⏟ 方差 + Var ( y ) ⏟ 噪声 \mathbb{E}[(\hat{y} - y)^2] = \underbrace{(\mathbb{E}[\hat{y}] - y)^2}_{\text{偏差}^2} + \underbrace{\mathbb{E}[(\hat{y} - \mathbb{E}[\hat{y}])^2]}_{\text{方差}} + \underbrace{\text{Var}(y)}_{\text{噪声}} E[(y^y)2]=偏差2 (E[y^]y)2+方差 E[(y^E[y^])2]+噪声 Var(y)

其中:

  • y ^ \hat{y} y^ 是模型的预测值。
  • y y y 是真实值。
  • E [ y ^ ] \mathbb{E}[\hat{y}] E[y^] 是模型预测值的期望。

4. Bagging是如何减少方差的?

方差是一个随机变量与其均值之间的平方偏差的期望值,表达式如下:
V a r ( X ) = E ( X − E ( X ) ) 2 Var(X)=E(X-E(X))^2 Var(X)=E(XE(X))2

V a r ( X ) = E ( X 2 ) − ( E ( X ) ) 2 Var(X) = E(X^2) - (E(X))^2 Var(X)=E(X2)(E(X))2

假设有多个模型的预测结果 X 1 , X 2 , X 3 . . . . . . X n X_1,X_2,X_3......X_n X1,X2,X3......Xn,每个变量的方差为 σ 2 \sigma^2 σ2。每个变量对应于一个弱学习器的预测结果,那么我们对这些弱学习器进行平均:

X ˉ = X 1 + X 2 + . . . + X n n \bar X = \frac {X_1+X_2+...+X_n}{n} Xˉ=nX1+X2+...+Xn

由于 V a r ( a X ) = a 2 V a r ( X ) Var(aX)=a^2Var(X) Var(aX)=a2Var(X),我们有:

V a r ( X ˉ ) = V a r ( X 1 + X 2 + . . . + X n n ) = 1 n 2 V a r ( X 1 + X 2 + . . . . + X n ) Var(\bar X) = Var(\frac {X_1+X_2+...+X_n}{n}) = \frac 1 {n^2}Var(X_1+X_2+....+X_n) Var(Xˉ)=Var(nX1+X2+...+Xn)=n21Var(X1+X2+....+Xn)

由于每个 X i X_i Xi 是独立的,我们可以写成:
1 n 2 V a r ( X 1 + X 2 + . . . + X n ) = 1 n 2 ( V a r ( X 1 ) + V a r ( X 2 ) + . . . + V a r ( X n ) ) = n σ 2 n 2 = σ 2 n \frac 1 {n^2}Var(X_1+X_2+...+X_n) = \frac {1}{n^2}(Var(X_1)+Var(X_2)+...+Var(X_n)) = \frac {n\sigma^2}{n^2} = \frac {\sigma^2}{n} n21Var(X1+X2+...+Xn)=n21(Var(X1)+Var(X2)+...+Var(Xn))=n2nσ2=nσ2

因此,我们有:
V a r ( X ˉ ) = σ 2 n < σ 2 Var(\bar X) = \frac {\sigma^2}{n} < \sigma^2 Var(Xˉ)=nσ2<σ2

换句话说,对一组观察值取平均可以减少方差。因此,减少方差并提高预测准确性的自然方法是从总体中抽取多个训练集,使用每个训练集构建一个单独的预测模型,然后对结果进行平均。

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

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

相关文章

arcgisPro加载CGCS2000天地图后,如何转成米单位

1、导入加载的天地图影像服务&#xff0c;一开始是经纬度显示的。 2、右键地图&#xff0c;选择需要调整的投影坐标&#xff0c;这里选择坐标如下&#xff1a; 3、点击确定后&#xff0c;就可以调整成米单位的了。 4、切换后结果如下&#xff1a; 如有需要&#xff0c;可调整成…

新时期下k8s 网络插件calico 安装

1、k8s master节点初始化完毕以后一直处于notreadey状态&#xff0c;一直怀疑是安装有问题或者是初始化有问题&#xff08;当然&#xff0c;如果真有问题要先解决这些问题&#xff09;&#xff0c;经过不断探索才发现是网络插件没有安装导致的&#xff0c;根据建议安装calico插…

《分布式光纤测温:解锁楼宇安全的 “高精度密码”》

在楼宇建筑中&#xff0c;因其内部空间庞大&#xff0c;各类电器设施众多&#xff0c;如何以一种既高效又稳定&#xff0c;兼具低成本与高覆盖特性的方式&#xff0c;为那些关键线路节点开展温度监测&#xff0c;是目前在安全监测领域一项重点研究项目&#xff0c;而无锡布里渊…

基于vue框架的的校园社团管理平台9ck4e(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;社团,社团加入,学生,社团活动,活动报名,社团成员,物资信息,物资申请 开题报告内容 基于Vue框架的校园社团管理平台开题报告 一、研究背景与意义 随着信息化技术的快速发展&#xff0c;校园管理正逐步向数字化、智能化转型。校园社团作…

网络安全 基础入门-概念名词

域名相关 域名 域名和IP地址相互映射&#xff0c;这样不用去记住能够被机器直接读取的IP地址数串 域名系统(DNS) 它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网。DNS使用UDP端口53。 1. 如果是自动获取dns,就向上查询&#xff…

CSS Grid 布局全攻略:从基础到进阶

文章目录 一.Grid 是什么二.示例代码1. 基础使用 - 固定宽高2.百分百宽高3.重复设置-repeat4.单位-fr5.自适应6.间距定义其他 一.Grid 是什么 CSS 中 Grid 是一种强大的布局方式&#xff0c;它可以同时处理行和列 Grid 和Flex有一些类似&#xff0c;都是由父元素包裹子元素使用…

自动驾驶控制算法-油门刹车标定

本文是学习自动驾驶控制算法第十讲 油门刹车标定表的制作以及后续一节的学习笔记。 车辆油门刹车标定的目的是获取不同车速下不同的油门踏板或刹车踏板行程下车辆的加速度&#xff0c;标定的结果作为纵向控制模型的输入&#xff0c;用于计算输出合理的油门或刹车。 1 Apollo中…

2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无

2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无 前端代码开源库 关于开源说明&#xff1a;企业服务-招聘信息管理系统-前端uniapp-系统前端开放源代码仅供学习-优雅草科技-目前优雅草科…

Java-JVM详解

Java-JVM ①JVM概述 ❶基本介绍 JVM&#xff1a;全称 Java Virtual Machine&#xff0c;一个虚拟计算机&#xff0c;Java 程序的运行环境&#xff08;Java二进制字节码的运行环境&#xff09; 特点&#xff1a; Java 虚拟机基于二进制字节码执行&#xff0c;由一套字节码指…

PyTorch 框架实现线性回归:从数据预处理到模型训练全流程

系列文章目录 01-PyTorch新手必看&#xff1a;张量是什么&#xff1f;5 分钟教你快速创建张量&#xff01; 02-张量运算真简单&#xff01;PyTorch 数值计算操作完全指南 03-Numpy 还是 PyTorch&#xff1f;张量与 Numpy 的神奇转换技巧 04-揭秘数据处理神器&#xff1a;PyTor…

升级 Spring Boot 3 配置讲解 —— 支持断点传输的文件上传和下载功能

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 在现代 Web 应用中&#xff0c;文件上传和下载是非常常见的需求。然而&#xff0c;当文件较大时&#xff0c;传统的上传下载方式可能会遇到网络不稳定或传输中断的问题。为了解决这些问题…

R语言安装教程与常见问题

生物信息基础入门笔记 R语言安装教程与常见问题 今天和大家聊一个非常基础但是很重要的技术问题——如何在不同操作系统上安装R语言&#xff1f;作为生物信息学数据分析的神兵利器&#xff0c;R语言的安装可谓是入门第一步&#xff0c;学术打工人的必备技能。今天分享在Windows…

UI自动化测试保姆级教程--pytest详解(精简易懂)

欢迎来到啊妮莫的学习小屋 别让过去的悲伤&#xff0c;毁掉当下的快乐一《借东西的小人阿莉埃蒂》 简介 pytest是一个用于Python的测试框架, 支持简单的单元测试和复杂的功能测试. 和Python自带的UnitTest框架类似, 但是相比于UnitTest更加简洁, 效率更高. 特点 非常容易上手…

基类指针指向派生类对象,基类指针的首地址永远指向子类从基类继承的基类首地址

文章目录 基类指针指向派生类对象&#xff0c;基类指针的首地址永远指向子类从基类继承的基类起始地址。代码代码2 基类指针指向派生类对象&#xff0c;基类指针的首地址永远指向子类从基类继承的基类起始地址。 代码 #include <iostream> using namespace std;class b…

分布式Id方案选择

分布式 ID 方案选择 在当今分布式系统日益盛行的背景下&#xff0c;分布式 ID 生成方案的选择成为了众多开发者关注的焦点。一个优秀的分布式 ID 方案&#xff0c;不仅能够确保生成的 ID 全局唯一&#xff0c;避免数据冲突&#xff0c;还能在高并发、大规模的分布式环境中保持…

花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7%

花生好坏缺陷识别数据集,7262张图片&#xff0c;支持yolo&#xff0c;coco json&#xff0c;pasical voc xml格式的标注&#xff0c;识别准确率在95.7% 数据集分割 训练组87&#xff05; 6353图片 有效集8% 606图片 测试集4% 303图片 预处理 自动定…

springboot 集成 etcd

springboot 集成 etcd 往期内容 ETCD 简介docker部署ETCD 前言 好久不见各位小伙伴们&#xff0c;上两期内容中&#xff0c;我们对于分布式kv存储中间件有了简单的认识&#xff0c;完成了docker-compose 部署etcd集群以及可视化工具 etcd Keeper&#xff0c;既然有了认识&a…

【递归与分治】Leetcode23:合并K个升序链表

一、题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数…

将分支A某一个commit合并到分支B

1.寻找A分支的commit 在分支B下&#xff0c;点击git找到分支A的历史提交记录,如图所示&#xff1a; 2.点击分支A的某个commit&#xff0c;进行合并到分支B 将这个commit&#xff0c;进行cherry-Pick&#xff0c;就可以把分支A的合并到分支B上的本地仓库中&#xff0c;然后就可…

如何快速上手一个鸿蒙工程

作为一名鸿蒙程序猿&#xff0c;当你换了一家公司&#xff0c;或者被交接了一个已有的业务。前辈在找你之前十分钟写了一个他都看不懂的交接文档&#xff0c;然后把一个鸿蒙工程交接给你了&#xff0c;说以后就是你负责了。之后几天你的状态大概就是下边这样的&#xff0c;一堆…