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

发布时间:2024-09-02  

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


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



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


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


二、常见的非均匀数据重采样方法和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)验证效果:在应用重采样方法后,需要评估重采样对模型性能的影响。可以使用交叉验证或保持独立测试集的方法来评估模型的准确性、召回率、精确度等指标,并与未经过重采样的结果进行对比。


四、总结


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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>