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

电子说

1.3w人已加入

描述

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

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

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

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

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

四、总结

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分