基于Python的机器学习系列(13):Bagging

news/2024/9/18 13:33:50/ 标签: python, 机器学习, 开发语言

        在上一篇文章中,我们讨论了决策树的原理及其在分类任务中的应用。然而,单一的决策树模型往往容易过拟合,导致泛化能力较差。为了减小模型的方差,我们可以通过构建多个决策树来提升模型的表现。这种方法被称为Bagging(Bootstrap Aggregating),其核心思想是在训练多个模型时引入差异性,从而避免它们学到相同的内容。

Bagging 的工作原理

        Bagging 通过以下步骤来实现:

  1. 样本采样:从原始训练数据中进行有放回的采样,生成多个不同的子数据集。
  2. 训练多个模型:使用生成的子数据集训练多个决策树模型。
  3. 结果聚合:对所有模型的预测结果进行某种形式的聚合(如投票或取平均),从而得到最终的预测结果。

        例如,假设我们有一个包含 4 个样本的数据集,每个样本有 2 个特征。我们可以通过 Bagging 生成多个子数据集,并训练相应的决策树模型。最终,使用这些模型的预测结果进行聚合,得到最终的分类结果。

        在 Bagging 的变体中,如果采样是无放回的,那么这种方法被称为Pasting。Bagging 允许样本在多个模型中多次被采样,而 Pasting 则不允许在同一模型中重复采样。

1. 手动实现 Bagging

        首先,我们将从头开始实现 Bagging。为了简化代码,我们将使用 sklearn 中的 DecisionTreeClassifier 来作为我们的基础模型。

python">from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
import random
from scipy import stats
from sklearn.metrics import classification_report# 加载数据集并进行训练集和测试集划分
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=True, random_state=42)# 定义模型参数和 Bagging 参数
B = 5  # 基模型数量
m, n = X_train.shape
boostrap_ratio = 1
tree_params = {'max_depth': 2, 'criterion': 'gini', 'min_samples_split': 5}
models = [DecisionTreeClassifier(**tree_params) for _ in range(B)]# 初始化子样本集
xsamples = np.zeros((B, int(boostrap_ratio * m), n))
ysamples = np.zeros((B, int(boostrap_ratio * m)))# 生成子样本集并训练每个基模型
for i in range(B):for j in range(int(boostrap_ratio * m)):idx = random.randrange(m)  # 随机采样xsamples[i, j, :] = X_train[idx]ysamples[i, j] = y_train[idx]# 训练模型models[i].fit(xsamples[i], ysamples[i])# 对测试集进行预测
predictions = np.zeros((B, X_test.shape[0]))
for i, model in enumerate(models):yhat = model.predict(X_test)predictions[i, :] = yhat# 聚合预测结果
yhat = stats.mode(predictions)[0][0]  # 获取众数作为最终预测结果
print(classification_report(y_test, yhat))

2. 使用 Sklearn 实现 Bagging

        sklearn 提供了便捷的 BaggingClassifier 接口来实现 Bagging,下面是使用 sklearn 的代码实现。

python">from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier# 使用 BaggingClassifier 实现 Bagging
tree = DecisionTreeClassifier()
bag = BaggingClassifier(tree, n_estimators=5, max_samples=0.99)bag.fit(X_train, y_train)
yhat = bag.predict(X_test)
print(classification_report(y_test, yhat))

结语

        通过本篇文章,我们了解了 Bagging 的基本原理以及如何在 Python 中实现这一算法。Bagging 通过构建多个模型并对它们的结果进行聚合,显著提升了模型的泛化能力。在下一篇文章中,我们将探讨 Bagging 的进阶形式——随机森林(Random Forests),进一步提升分类器的性能。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!


http://www.ppmy.cn/news/1516908.html

相关文章

OPTICS算法原理及Python实践

OPTICS(Ordering Points To Identify the Clustering Structure)算法是一种基于密度的聚类算法,它的核心思想是通过计算数据点之间的密度关系,自动发现数据中的层次结构,而无需预先设定簇的数量。以下是OPTICS算法原理…

OpenCV入门12.2:SURF与SIFT比较及SURF示例

SIFT (Scale-Invariant Feature Transform): 提出时间: 1999年,由David Lowe提出。关键特点: 能够检测和描述图像中的关键点,这些关键点对旋转、缩放和部分亮度变化具有不变性。计算复杂度: 相对较高,因为SIFT使用了高斯差分核来检测关键点&…

C++ 136类和对象_面像对像_多态_虚析构和纯虚析构

136类和对象_面像对像_多态_虚析构和纯虚析构 学习内容 1.抽象类 2.虚函数 3.纯虚函数 /4.虚析构 和 纯虚析构 总结: 1.虚析构或纯虚析构就是用来解决通过父类指针释放子类对象 2.如果子类中没有堆区数据,可以不写为虚析构或纯虚析构 3.拥有纯虚析构函数的类也属于…

缓存三剑客(穿透,雪崩,击穿)理解

缓存穿透 概念理解 缓存穿透正如其名穿透,说明访问的数据在缓存和数据库里都没用,而且此时还大量的发起了访问,导致数据库崩溃 解决方法 一、第一种解决方法就是保存空值在数据库里面,但是这种情况会很消耗空间 二、第二种办…

利用Python对Excel数据进行条件筛选与排序

目录 一、Python与Excel数据处理的基础知识 1.1 Python中的Excel数据处理库 1.2 pandas库简介 二、使用pandas读取Excel数据 三、Excel数据的条件筛选 3.1 单条件筛选 3.2 多条件筛选 3.3 使用query方法 四、Excel数据的排序 4.1 单列排序 4.2 多列排序 五、案例分…

python模块05-json

3 请求数据提取:json 3.1 json类型数据 json对象:{key:calue} json数组:[1,2,3,4] 3.2 json模块 1) json.loads 把Json格式字符串解码转换成Python对象(json数组对应列表,json对象对应字典&#xff09…

Jenkins发邮件功能如何配置以实现自动化?

jenkins发邮件的设置指南?Jenkins怎么配置服务器? Jenkins作为一个流行的自动化服务器,其发邮件功能是通知团队成员构建状态的重要手段。AokSend将详细介绍如何配置Jenkins发邮件功能,以实现自动化通知。 Jenkins发邮件&#xf…

『 C++ 』线程库

文章目录 线程库线程的创建与销毁成员函数this_thread 命名空间线程的引用传值 互斥锁互斥锁的基本操作递归锁(可重入锁)定时互斥锁互斥锁管理器与互斥锁抛异常所引发的死锁问题 条件变量条件变量的等待条件变量的唤醒两个线程交替打印奇偶数 线程库 C标准库提供了一套完整的线…

探索 AWS Lightsail 与 EC2:如何选择适合你的云计算服务?

探索 AWS Lightsail 与 EC2:如何选择适合你的云计算服务? 随着云计算的广泛应用,AWS 提供了多种计算服务以满足不同的用户需求。对于初次接触 AWS 的用户来说,可能会在选择 AWS Lightsail 和 EC2 时感到困惑。这两者都提供了虚拟…

webpack打包优化方案

调试工具:安装webpack-bundle-analyzer打包可视化工具,可以看到打包文件大小,从而有针对性的优化。 npm install --save-dev webpack-bundle-analyzer。 方案一:将第三方依赖包使用cdn进行引入减小文件包体积(例&…

Git的使用教程及常用语法01

git安装可以到官网上下载并安装,一直点点点就行 安装成功后可以在任意地方右键以终端的形式打开。 打开命令终端,输入git -v 查看git版本 一.配置全局用户名和邮箱 配置全局用户名: git config --global user.name "your username&…

利用TeamCity实现maven项目的CI/CD

1.什么是TeamCity? TeamCity 是一款由 JetBrains 开发的强大的持续集成(Continuous Integration,CI)和持续部署(Continuous Deployment,CD)工具。它帮助开发团队自动化构建、测试和部署过程&am…

Scratch的无限可能:突破项目大小与复杂度的界限

Scratch的无限可能:突破项目大小与复杂度的界限 Scratch,这个由麻省理工学院媒体实验室开发的编程平台,以其独特的图形化编程方式,激发了全球数百万孩子的创造力和逻辑思维能力。然而,随着孩子们创意的不断扩展&#…

centos7解决病毒入侵 getty

首先使用top命令查看 找到文件地址 查看是否有自启动服务 关闭、停止、删除 tmp 病毒文件删除 清除标记 [roothost-192-168-0-66 bin]# chattr -ia /tmp/newsvc.sh [roothost-192-168-0-66 bin]# chattr -ia /tmp/redis2 [roothost-192-168-0-66 bin]# chattr -ia /tmp/svc* [r…

C++开发IDE用VisualStudio好还是QtCreator好?

在熟练使用了VisualStudio和QtCreator之后,我依然认为QtCreator作为C++项目开发IDE的便捷性真的相当杰出。 当然了,VisualStudio和QtCreator本身就不是一个量级,VS越做越大,庞大的插件库也使得他能够支持从嵌入式到手机端,从web到脚本,甚至游戏,仿真等等各个领域的开发…

Leetcode 1047-删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 题解 题目链接 //先进后出&a…

网络-VPN

VPN(Virtual Private Network,虚拟专用网络)是一种网络技术,用于在公共网络(如互联网)上建立一个安全的、加密的连接通道,以保护数据传输的安全性和隐私。通过使用 VPN,用户可以在不…

线程面试题

1.JDK自带的线程池有哪些? 2.线程池中核心线程数与最大线程数与缓冲任务队列的关系? 先使用核心线程执行任务。 当核心线程不足时,新任务入队列等待。 当队列满且线程数未达最大值时,增加非核心线程执行任务。 当队列满且线程…

xss-labs通关攻略 11-15关

第十一关:less-11 步骤一:利用burp抓包 步骤二:添加referer:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第十二关:less-12 步骤一:利用burp抓包 步骤二:修改User A…

熟悉Labview工具用

目录复制 目录 0.0:快捷键0.1:全局非图标显示0.2:小技巧:图片导入为程序1.2:事件结构1.2.0:超时分支:当事件结构框左上角设置为1时,单位毫秒,即理解为1ms内没有其他的事件…