什么是非均匀数据重采样?哪种非均匀数据重采样方法更适合你?

发布者:PeacefulOasis最新更新时间:2024-09-02 来源: elecfans关键字:采样方法  机器学习 手机看文章 扫描二维码
随时随地手机看文章

在数据分析和机器学习领域,我们常常需要处理非均匀数据。非均匀数据是指具有不平衡分布或样本数量不均等的数据集。为了准确建模和预测,我们需要对这些非均匀数据进行重采样。本文将详细介绍什么是非均匀数据重采样以及如何应用不同的方法来解决这一问题。


一、什么是非均匀数据重采样?



非均匀数据重采样是一种数据处理技术,用于解决数据集中存在的类别不平衡或样本数量不均等的问题。在非均匀数据中,某些类别的样本数量很少,而其他类别的样本数量很多。这种不平衡会导致建模和预测过程中的偏差,影响结果的准确性。


非均匀数据重采样的目标是通过增加少数类别的样本数量或减少多数类别的样本数量,使得数据集更加平衡。通过重采样,我们可以在保持数据分布特征的前提下,增加较少样本的可用性,从而提高模型的性能。


二、常见的非均匀数据重采样方法和Python示例


(1)过采样(Oversampling):过采样方法通过增加少数类别的样本数量来平衡数据集。其中一种常见的方法是复制少数类别的样本,使其在数据集中出现多次。然而,简单复制样本可能会导致过拟合问题。因此,一些改进的过采样方法被提出,如SMOTE(合成少数类过采样技术)和ADASYN(自适应合成)等,它们根据少数类别样本之间的距离关系合成新的样本。


使用imbalanced-learn库中的RandomOverSampler方法进行过采样:


from imblearn.over_sampling import RandomOverSampler 

X_resampled, y_resampled = RandomOverSampler().fit_resample(X, y)

使用imbalanced-learn库中的SMOTE方法进行合成少数类过采样:


from imblearn.over_sampling import SMOTE 

X_resampled, y_resampled = SMOTE().fit_resample(X, y)

完整示例:


import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LogisticRegression

from imblearn.over_sampling import RandomOverSampler

from sklearn.metrics import classification_report



# 加载数据集

data = pd.read_csv('your_dataset.csv')



# 分割特征和目标变量

X = data.drop('target', axis=1)

y = data['target']



# 将数据集拆分为训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)



# 方法1.创建RandomOverSampler对象

ros = RandomOverSampler(random_state=42)

# 对训练集进行过采样

X_train_resampled, y_train_resampled = ros.fit_resample(X_train, y_train)



# 方法2创建SMOTE对象

# smote = SMOTE(random_state=42)

# 对训练集进行过采样

# X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)



# 使用过采样后的数据训练模型

model = LogisticRegression()

model.fit(X_train_resampled, y_train_resampled)



# 在测试集上进行预测

y_pred = model.predict(X_test)



# 输出分类报告

print(classification_report(y_test, y_pred))

(2)欠采样(Undersampling):欠采样方法通过减少多数类别的样本数量来平衡数据集。最简单的欠采样方法是随机地删除多数类别的样本。然而,这种方法可能会丢失一些重要的信息。因此,一些更高级的欠采样方法被提出,如NearMiss和ClusterCentroids等,它们通过保留具有代表性的多数类别样本来减少样本数量。


使用imbalanced-learn库中的RandomUnderSampler方法进行欠采样:


from imblearn.under_sampling import RandomUnderSampler 

X_resampled, y_resampled = RandomUnderSampler().fit_resample(X, y)

使用imbalanced-learn库中的NearMiss方法进行近邻欠采样:


from imblearn.under_sampling import NearMiss 

X_resampled, y_resampled = NearMiss().fit_resample(X, y)

(3)混合采样(Combination Sampling):混合采样方法是过采样和欠采样的结合。它同时对多数和少数类别进行处理,以达到数据集平衡的效果。其中一种常见的混合


混采样方法是SMOTEENN(SMOTE + Edited Nearest Neighbors)方法。它首先使用SMOTE方法对少数类别进行过采样,生成一些合成样本。然后,使用Edited Nearest Neighbors(ENN)方法对多数类别进行欠采样,删除一些样本。通过这种方式,混合采样方法能够克服简单过采样和欠采样方法的一些问题,同时平衡数据集。


使用imbalanced-learn库中的SMOTEENN方法进行SMOTE + Edited Nearest Neighbors采样:


from imblearn.combine import SMOTEENN 

X_resampled, y_resampled = SMOTEENN().fit_resample(X, y)

(4)加权重采样(Weighted Resampling):加权重采样方法通过为不同类别的样本赋予不同的权重来平衡数据集。它可以用于训练模型时调整样本的重要性。常见的加权重采样方法包括基于频率的加权和基于错误率的加权。基于频率的加权根据每个类别的样本数量设置权重,使得样本数量少的类别具有更高的权重。基于错误率的加权根据每个类别的错误率来调整权重,使得错误率高的类别具有更高的权重。


import torch

from torch.utils.data import DataLoader, WeightedRandomSampler



# 假设有一个不均衡的数据集,包含10个样本和对应的类别标签

data = [

    ([1, 2, 3], 0),

    ([4, 5, 6], 1),

    ([7, 8, 9], 1),

    ([10, 11, 12], 0),

    ([13, 14, 15], 1),

    ([16, 17, 18], 0),

    ([19, 20, 21], 1),

    ([22, 23, 24], 0),

    ([25, 26, 27], 1),

    ([28, 29, 30], 1)

]



# 分割特征和目标变量

X = [sample[0] for sample in data]

y = [sample[1] for sample in data]



# 创建权重列表,根据类别进行加权

class_counts = torch.tensor([y.count(0), y.count(1)])

weights = 1.0 / class_counts.float()



# 创建WeightedRandomSampler对象

sampler = WeightedRandomSampler(weights, len(weights))



# 创建数据加载器,使用加权重采样

dataset = list(zip(X, y))

dataloader = DataLoader(dataset, batch_size=2, sampler=sampler)



# 遍历数据加载器获取批次数据

for batch_X, batch_y in dataloader:

    print('Batch X:', batch_X)

    print('Batch y:', batch_y)

三、选择适当的重采样方法


选择适当的重采样方法需要考虑数据集的特点和具体问题的需求。以下是一些建议:


(1)数据分析:在重采样之前,首先对数据集进行分析,了解每个类别的样本分布情况和特征。这有助于确定哪些类别是少数类别,哪些类别是多数类别,以及是否存在其他特殊情况(如噪声数据)。


(2)重采样策略:根据数据分析的结果选择合适的重采样策略。如果少数类别的样本数量很少,可以考虑过采样方法;如果多数类别的样本数量较多,可以考虑欠采样方法;如果两者都存在问题,可以考虑混合采样方法或加权重采样方法。


(3)验证效果:在应用重采样方法后,需要评估重采样对模型性能的影响。可以使用交叉验证或保持独立测试集的方法来评估模型的准确性、召回率、精确度等指标,并与未经过重采样的结果进行对比。


四、总结


非均匀数据重采样是解决非均匀数据集问题的重要步骤。通过过采样、欠采样、混合采样和加权重采样等方法,我们可以调整数据集的分布,提高模型的性能和准确性。选择适当的重采样方法需要基于数据分析的结果,并进行有效的评估。


关键字:采样方法  机器学习 引用地址:什么是非均匀数据重采样?哪种非均匀数据重采样方法更适合你?

上一篇:如何解决数据缺失问题?
下一篇:中断是什么?PLC的三大类中断事件

推荐阅读最新更新时间:2026-03-24 11:50

STM32_ADC采样时间_采样周期_采样频率计算方法分析
  因项目需要使用到STM32的ADC功能,虽然对ADC的使用并不陌生,但是第一接触stm32的ADC功能还是有种无从下手的感觉,主要是因为STM32ADC设计较为复杂,一时对相关的专业术语较为生疏,此外固件库中涉及到的函数虽都进行了分门别类但是还是感觉函数较多,难以很快掌握,现就将个人理解写出,以便大家共同进步。   一、stm32 ADC特点   认识事物首先还是要从整体上把握,ADC也一样的道理,STM32的ADC外设提供了非常完善的功能,虽然其中很大一部分不见得能在项目中使用,但加深对其的认识对于合理利用其资源也是非常有必要的。   下面以项目采用的STM32L151为例,其他类型大同小异。   先看原文:   •
[单片机]
STM8学习笔记---ADC多通道采样遇到问题及解决方法
在ADC多通道采样时遇到了一个问题,费了半天劲才找到原因。在此将分析过程记录下来。 这是STM8S003单片机5个通道ADC采样程序,在主函数中依次读取各个通道的ADC采样值。首先单独测试一下每个通道的值。 每个通道单独测试采样值 ch2 = 623, ch3 = 0,ch4 = 2,ch5 = 1023, ch6 = 408。 下面开始多通道采样,ch2和ch3同时采样。 采样结果正常。 ch2、ch3、ch4同时采样。 采样结果正常。 ch2、ch3、ch4、ch5同时采样。 采样结果不正常,和上面的采样结果比较,好像采样值被整体下移了一位。 在试试所有通道同时采样 采样的值
[单片机]
STM8学习笔记---ADC多通道<font color='red'>采样</font>遇到问题及解决<font color='red'>方法</font>
stm32 adc dma多通道采样 数据错位 的解决方法
解决方法:不要采用连续转换模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; 需要时才实施转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); 转换后取消转换 ADC_SoftwareStartConvCmd(ADC1, DISABLE); 经过测试能够解决stm32 adc dma多通道采样 数据错位
[单片机]
ADC采样芯片ADS7822使用方法
最近,做项目中使用了一款TI(德州仪器)公司的ADC采样芯片ADS7822。现在把我的电路和程序发出来与大家分享。最重要的是,深入了解ADC芯片的使用方法,达到触类旁通。 在我的项目中,有一个微弱的电流信号,被放大电路放大成了电压信号,范围是0~2500mV,所以,我需要采集这个电压信号到单片机。 在我以前的文章中,我也强调过多次,在使用一款芯片之前,一定要去这款芯片的官方网站,或者在别的可靠的地方也可以,下载到这款芯片的数据手册(datasheet)。有很多电子初学者,不知道这个看似平常却很有效的学习方法,还没有看过芯片的数据手册,就去百度上搜索“XXX芯片电路图”“XXX芯片程序”等,然后看了一堆资料,也不会用。
[单片机]
ADC<font color='red'>采样</font>芯片ADS7822使用<font color='red'>方法</font>
最新方法:怎样提高DSP采样精度
1 AD7858的主要特性 AD7858是AD公司推出的12位串口、高速、低功耗、逐次逼近式AD转换器。它可在3~5.5 V的电压下工作,其数据通过率高达200 kSPS。该芯片内含一个低噪声、宽频带的跟踪/保持放大器,可以处理高达200 kHz的宽频信号。 AD7858很容易与微处理器或DSP接口。输入信号从CONVST的下降沿开始被采样(此位可通过硬件引脚或软件位操作),转换也从此点启动。忙信号线在转换起始时为高电平,之后在400μs后跳变为低电平以表示转换结束。 AD7858的主要特性如下: ◇支持3~5.5 V电压供电; ◇上电时,具有系统自动校准(校验芯片本身或芯片外设是否出错)和自动自校准(校验校准寄存
[嵌入式]
采样控制系统时间响应特性及其计算方法
摘 要:本文针对采样控制系统连续信号与离散信号共存的特点,指出传统离散化分析方法因忽略了系统在采样时刻之间的信息导致无法精确、真实地反映采样控制系统的时间响应特性,在此基础上,应用采样控制系统直接设计方法,基于提升技术,在考虑系统在采样时刻之间全部信息的条件下,推导给出了采样控制系统时间响应的计算方法,最后通过一个具体计算实例说明了本文方法的有效性。 关键词:采样控制系统 提升技术 时间响应 1 引言 当前多数控制方案都采用离散控制器控制连续被控对象的方法,这就构成了采样控制系统[1]。连续时间信号和离散时间信号共存,是采样控制系统的显著特点,也成为精确分析采样控制系统的难点所在[2]。传统的采样控制系统时间响应的计算方法
[模拟电子]
<font color='red'>采样</font>控制系统时间响应特性及其计算<font color='red'>方法</font>
基于PIC软件设计串行异步通信三倍速采样方法
在利用单片机开发各种嵌入式应用系统时,异步串行通信是常用的一种通信模式,有的应用中还要求实现多路异步串行通信。人们平时所应用的各种厂商的单片机,绝大部分片上只提供一个UART(通用异步收发器)硬件模块,利用它可以方便地实现一路串行通讯。PIC系列单片机也不例外,在其丰富的一系列产品中,除高端系列(PIC 17/18)一些型号片上带有2路UART硬件模块外,其他大部分型号片上只有1路UART,一些低端廉价的PIC单片机甚至还不带硬件UART。为了提高系统的性价比,要求设计者用软件实现1路或多路异步串行通信。很多人对用软件实现的UART在可靠性和效率方面持怀疑态度,其实关键问题是采用何种方式来实现可靠的UART功能。 1 串行异步
[单片机]
基于PIC软件设计串行异步通信三倍速<font color='red'>采样</font><font color='red'>方法</font>
一种用AD7858提高DSP采样精度的新方法
0 引言 TI公司生产的TMS320x系列DSP是专为实时信号处理而设计的。该系列DSP控制器将实时处理能力和控制器外设功能集于一身,可为控制系统的应用提供一个理想的解决方案。笔者在设计一款新型金属探测器时,采用TMS320LF2407xA芯片来对AD采样数据进行分析,从而成功地实现了对电机运转的控制。 DSP芯片TMS320LF2407XA内部具有10位A/D转换器。但是,由于它仅含有10位A/D转换器,若除去第一位符号位,也就是真正有用的只有九位,达不到本项目的检测精度要求。为此,本文介绍一种通过外接12位A/D转换器(AD7858)来提高DSP检测精度的新方法。 1 AD7858的主要特性 AD7858是AD公司推出
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved