【Python】机器学习中的过采样和欠采样:处理不平衡数据集的关键技术


原谅把你带走的雨天
在渐渐模糊的窗前
每个人最后都要说再见
原谅被你带走的永远
微笑着容易过一天
也许是我已经 老了一点
那些日子你会不会舍不得
思念就像关不紧的门
空气里有幸福的灰尘
否则为何闭上眼睛的时候
又全都想起了
谁都别说
让我一个人躲一躲
你的承诺
我竟然没怀疑过
反反覆覆
要不是当初深深深爱过
我试着恨你
却想起你的笑容
                     🎵 陈楚生/单依纯《原谅》


在机器学习和数据科学中,数据集的不平衡是一个常见的问题。当一个数据集中的某一类样本数量远远超过其他类时,模型往往会偏向多数类,从而影响分类器的性能。为了解决这一问题,研究人员提出了多种技术,其中过采样和欠采样是两种最常用的方法。本文将详细介绍过采样和欠采样的概念、原理以及在实际应用中的注意事项。

什么是不平衡数据集?

不平衡数据集是指某些类的样本数量显著多于其他类的情况。假设有一个二分类问题,其中类别0有950个样本,而类别1只有50个样本。由于类别0的样本数量远远多于类别1,模型在训练时更容易学习到类别0的特征,忽略类别1,从而导致分类性能下降。

过采样(Oversampling)

过采样是一种通过增加少数类样本数量来平衡数据集的方法。其主要思想是生成新的少数类样本,使少数类的样本数量增加到与多数类相同或相近。

常见的过采样方法

随机过采样(Random Oversampling):

通过随机复制少数类样本来增加其数量。这种方法简单易行,但可能导致过拟合,因为它没有引入新的信息。

from imblearn.over_sampling import RandomOverSamplerros = RandomOverSampler(random_state=42)
X_resampled, y_resampled = ros.fit_resample(X_train, y_train)
SMOTE(Synthetic Minority Over-sampling Technique):

通过在少数类样本之间插值生成新的样本。SMOTE不仅复制少数类样本,还生成新的合成样本,从而减少了过拟合的风险。

from imblearn.over_sampling import SMOTEsmote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
ADASYN(Adaptive Synthetic Sampling Approach for Imbalanced Learning):

ADASYN是对SMOTE的改进,它根据样本的分类难度自适应地生成合成样本。分类难度大的样本生成更多的新样本,分类难度小的样本生成较少的新样本。

from imblearn.over_sampling import ADASYNadasyn = ADASYN(random_state=42)
X_resampled, y_resampled = adasyn.fit_resample(X_train, y_train)

欠采样(Undersampling)

欠采样是一种通过减少多数类样本数量来平衡数据集的方法。其主要思想是减少多数类样本的数量,使其与少数类的样本数量接近,从而达到平衡数据集的目的。

常见的欠采样方法

随机欠采样(Random Undersampling):

随机删除多数类样本,使其数量减少到与少数类相同或相近。虽然简单,但可能会丢失大量有用信息,导致模型性能下降。

from imblearn.under_sampling import RandomUnderSamplerrus = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = rus.fit_resample(X_train, y_train)
集成欠采样(Cluster Centroids):

通过聚类算法将多数类样本聚类为若干个簇,并用簇的中心代替原始样本,从而减少多数类样本的数量。

from imblearn.under_sampling import ClusterCentroidscc = ClusterCentroids(random_state=42)
X_resampled, y_resampled = cc.fit_resample(X_train, y_train)
Tomek Links:

通过删除与少数类样本最接近的多数类样本对(Tomek链接),从而减少多数类样本数量。这种方法不仅减少了多数类样本,还清除了数据集中的噪声样本。

from imblearn.under_sampling import TomekLinkstl = TomekLinks()
X_resampled, y_resampled = tl.fit_resample(X_train, y_train)

过采样与欠采样的选择

选择过采样还是欠采样取决于具体的数据集和问题:

  1. 过采样适用于:

    • 少数类样本特别少,直接删除多数类样本会导致信息丢失过多。
    • 数据集足够小,生成合成样本不会显著增加计算开销。
  2. 欠采样适用于:

    • 多数类样本特别多,随机复制少数类样本会导致过拟合。
    • 数据集足够大,删除部分多数类样本不会导致信息丢失过多。
      在实际应用中,有时可以结合过采样和欠采样的方法,进一步提高模型性能。例如,先通过欠采样减少多数类样本数量,再通过过采样增加少数类样本数量,从而达到更好的平衡效果。

实战案例:结合过采样和欠采样

以下是一个结合过采样和欠采样的方法来平衡数据集的示例:

from imblearn.combine import SMOTETomek
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from collections import Counter# 生成一个不平衡的数据集
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10, n_clusters_per_class=1, weights=[0.9, 0.1], flip_y=0, random_state=42)# 查看数据分布
print(f"原始数据集类别分布: {Counter(y)}")# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)# 使用SMOTETomek进行过采样和欠采样
smote_tomek = SMOTETomek(random_state=42)
X_resampled, y_resampled = smote_tomek.fit_resample(X_train, y_train)# 查看过采样和欠采样后的数据分布
print(f"过采样和欠采样后数据集类别分布: {Counter(y_resampled)}")

结论

过采样和欠采样是处理不平衡数据集的两种重要技术。过采样通过增加少数类样本数量来平衡数据集,而欠采样则通过减少多数类样本数量来达到同样的目的。根据具体问题和数据集的特点,选择合适的方法可以显著提高模型的性能。在实际应用中,结合使用这两种方法往往可以取得更好的效果。希望本文能帮助你理解并掌握过采样和欠采样的基本原理和实现方法,为你的机器学习项目提供支持。如果你有任何问题或建议,欢迎在评论区留言!

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

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

相关文章

【Vue2入门技能树】:Vue2项目从入门到放弃所遇到的问题汇总

1、body中自带 margin: 8px 的问题 解决办法&#xff1a;在 public 目录下的 index.html 中加入如下样式即可 <style>* {margin: 0;} </style>2、使用vue-router、vuex ①在项目所在文件夹下打开 cmd 终端&#xff0c;然后运行如下代码&#xff0c;等待安装 //…

【Python从入门到进阶】55、使用Python轻松操作Mysql数据库

一、引言 1、MySQL数据库简介 MySQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用了一种名为Structured Query Language&#xff08;SQL&#xff09;的查询语言来管理数据。MySQL因其高性能、可扩展性、易用性和稳定性而广受欢迎&#x…

ARM+FPGA+NVIDIA AI摄像头软硬件定制

拥有资深ISP图像技术团队&#xff0c;是英伟达、地平线等合作伙伴&#xff0c;我们的团队掌握目前市面上大部分车载平台的ISP图像画质服务能力&#xff0c;能自主开发图像ISP和增强算法。我们具有多名经验丰富光学设计专家&#xff0c;掌握车载模组光学设计能力&#xff0c;资深…

[蓝桥杯 2020 省 A1] 超级胶水

一.题目 题目描述 小明有 n 颗石子&#xff0c;按顺序摆成一排。 他准备用胶水将这些石子粘在一起。 每颗石子有自己的重量&#xff0c;如果将两颗石子粘在一起&#xff0c;将合并成一颗新的石子&#xff0c;重量是这两颗石子的重量之和。 为了保证石子粘贴牢固&#xff0…

AutoMQ 社区双周精选第十期

本期概要 欢迎来到 AutoMQ 第十期双周精选&#xff01;在过去两周里&#xff0c;主干动态方面&#xff0c;AutoMQ 发布了 1.0.5 版本&#xff0c;该版本将默认日志滚动方式从小时滚动切换到大小滚动&#xff0c;且优化了大规模对象删除的性能。另外&#xff0c;AutoBalancing …

入门五(项目介绍及登录需求)

软件缺陷判定标准 项目中缺陷的管理流程 使用Excel对于缺陷进行管理 使用工具管理缺陷 一、项目背景 传智作为一个IT教育机构&#xff0c;拥有自己开发且实际运营的产品&#xff1b; 将开发和运营的技术作为授课的内容&#xff0c;对于学员而言学到的都是一手的真实案例和…

.net 框架基础(二) 日期和时间

总目录 C# 语法总目录 .net 框架基础 二 日期和时间 日期和时间1. TimeSpan2. DateTime 日期和时间 System空间下有三个不可变的结构体进行事件表示:DateTime、DateTimeOffset、TimeSpan 1. TimeSpan 创建TimeSpan方法&#xff1a; 通过构造器通过调用其中一个静态 From ……

VPP FIB路径链表环路检查

对于路径链表中的三种路径类型&#xff1a; FIB_PATH_TYPE_RECURSIVE FIB_PATH_TYPE_ATTACHED_NEXT_HOP FIB_PATH_TYPE_ATTACHED在添加新的路径时需要进行路径环路检查。函数fib_path_list_recursive_loop_detect会被反复调用。 static void fib_entry_recursive_loop_detect…

MySQL-数据库设计规范

1、范式 1.1、概述 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式常见六种范式&#xff0c;按照范式级别由低到高如下所示&#xff1a; 第一范式第二范式第三范式巴斯范式第四范式第五范式 1.2、键和相关属性 范式的定义会用法主键和候选键&…

llllllllll

llllllllllllllll

gulp 构建Node.js 应用

安装 ## 安装 gulp 命令行工具 npm install --global gulp-cli## 安装 gulp&#xff0c;作为开发时依赖项 npm install --save-dev gulp为什么要用Gulp ? 在前端开发中&#xff0c;Gulp是一个node.js 的自动化构建工具&#xff0c;它通过流和代码优于配置的策略来简化任务编…

类的继承和方法重载

想象一下&#xff0c;有一个相亲想爱的一家人家族树。在这个家族树中&#xff0c;有一个祖先&#xff08;父类&#xff09;&#xff0c;它拥有一些基本的特征和行为&#xff0c;比如家族的传统、姓氏、某些共同的技能或知识。 现在&#xff0c;这个祖先有多个后代&#xff08;…

vivado 设计连接性

设计连接性 IP集成商提供设计师协助&#xff0c;帮助您完成连接过程 设计。图3显示了MHS的一个示例&#xff0c;图4显示了设计帮助 可在IP集成商中获得 地址映射 在XPS中&#xff0c;无论主机访问从机IP&#xff0c;每个从机都有相同的地址。IP integrator为基于master的寻址提…

【C++课程学习】:命名空间的理解(图文详解)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f4f7;1.命名冲突 &#x1f4f7;2.重定义 &#x1f4f7;3.命名空间 &#x1f37a;命名空间可…

Leetcode刷题笔记3

18. 四数之和 18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&…

解决Element组件el-switch在Vue中值的绑定与回显问题

概要 Switch 开关表示两种相互对立的状态间的切换,多用于触发「开/关」。可当一个布尔值进行使用。 问题描述与解决 引入Element组件的switch到Vue中,可以读取switch的值,但如果放在页面中,不能回显上去。 如上图,无论值是"否"还是“是”。都不能正确渲染到页…

Make New 函数 ---golang

make 和 new 函数的使用区别 共同点&#xff1a; make 函数和new 函数都是用来申请内存地址的。不同点 1、new函数的使用相对来比较少&#xff0c;用于对一般的数据类型&#xff0c;做数据类型申请 如&#xff1a; string&#xff0c; int&#xff0c;且申请的为 指针类型。…

vue-officef实现pdf文件在线预览

一、参考网址 https://www.cnblogs.com/guozhiqiang/p/17957288 1、引入依赖 npm install vue-office/pdf vue-demi2、编写组件 <template><vue-office-pdf :src"pdf"/> </template> <script> // import pdf from vue-pdf import VueOffice…

基于长短期记忆网络 LSTM 的送餐时间预测

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

Linux Kernel入门到精通系列讲解(RV-U-boot 篇) 4.2 RISC-V从零移植自己的Uboot

1. 概述 上一章节我们已经成功从OpenSBI跳转到Uboot,并且已经把默认的qemu-riscv64_smode_defconfig移植成功了,本章节我们将会重新规划memory 分区,方便后续创建更多的设备,并且从零开始移植一个属于Naruto Pi的uboot。 2. 重建分区表 2.1 当前QEMU已创建Memory 地址大小…