Numpy Python – Pandas:重新采样数据集以获得平衡的类
在本文中,我们将介绍使用Numpy Python和Pandas重新采样数据集,以获得类平衡的数据集。当我们面对非常不平衡的数据集时,机器学习模型的性能会受到很大的影响。例如,在二元分类任务中,当一个类的样本数远远超过另一个类的样本数时,模型的精度将倾向于那些具有更多样本的类。导致模型对于较小的类的泛化性能较差。解决这个问题的一种方法是重新采样数据集,使得类之间的样本数不平衡更小。
阅读更多:Numpy 教程
简单介绍Numpy Python和Pandas
NumPy是Python包的一部分,用于支持大多数基本的计算需求,包括数组、矩阵和其他矩阵模式的计算,使计算机更高效地处理大型数据集。Pandas来自于“Python Data Analysis Library”的缩写,是一个用于处理和分析大数据集的Python库。它基于两个先前的库,即NumPy和Matplotlib,提供了一个简单的基于列的数据结构,更适合于处理表格和混合数据。Pandas被执行非常快且易于使用,是Python在数据科学和机器学习方面最好的数据研究工具。
平衡类的意义
在许多情况下,我们的数据集可能会出现类不平衡的问题。这意味着数据集中每个不同的类具有不同数量的样本。例如,在一个二进制分类问题中,如果类A有10个样本而类B仅有1个样本,则类不平衡是存在的。这种数据集倾向于向具有更多样本的类发展,这意味着机器学习模型具有偏见——它偏向让具有更多样本的类作出的决策,使得较小的类容易被忽略。这与我们的期望相反——我们希望模型能够充分地学习每个类别的特性。
不同的重新采样方法
在解决不平衡类别的问题时,有两种常见的方法,一种是欠采样,另一种是过采样。
欠采样
欠采样是从大类别中删除一些样本的过程。该方法可以提高学习较小类的能力。很多计算机视觉任务与一定的假定有关,即正类和负类是均衡的。因此,对于这类问题,欠采样经常被使用。
过采样
过采样是增加小类别中样本的过程。通常可以通过创建一些好的样本并加入到小类别的样本数据中,使得最终分类器能够更好地学习不平衡的数据。
重新采样的方法之一:随机上采样
随机上采样是增加较小类别的新样本的过程。它的过程将通过使用少量的基本样本来生成新样本。这种方法基于重要的假设,即少数类的任何一组样品都可以很好地代表同类任何其他样品。
方法一:SMOTE
Synthetic Minority Over-sampling Technique (SMOTE) 是一种广泛使用的过采样方法,通过生成新的 Synthetic Minority Data 来平衡样本不均衡的问题。SMOTE 通过选择任意少数类样本,并随机选择其邻居样本并使用差分特征生成新的合成样本。
SMOTE算法的主要步骤如下:
- 对于每个少数类样本,从k个最近邻中随机选择其中一个。
 - 
对于选择的那个少数类样本,找到和它的k个最近的邻居之间的差异。
 - 
为了产生新的少数类样本,使用随机数(0, 1)乘以差值,当这个差异乘以一个随机数时,将该值添加到少数类样本中。
 - 
此操作将在样本的迭代次数内重复进行,直到达到所需数量的样本。
 
重新采样的方法之二:下采样
另一种解决不平衡的方法是下采样(Random Under-Sampling),这个方法就是对多数类样本进行去除,直到多少类样本呈现一定的平衡。
方法二:随机下采样
随机下采样的原理很简单,就是随机地从多数类个体中抽取出一个和少数类相等的样本集。但是这种方法会导致随机丢失数据的情况发生。
Pandas的Resample方法
Pandas也提供了Resample方法,可以实现对数据集的采样,以达到平衡类的目的。通常,Resample方法可用于将时间序列数据重新采样。但是,我们也可以使用Resample方法重新采样数据集来实现类的平衡,方法如下:
- 对于不平衡的类别,计算其样本数与最大类别样本数之间的差异。
 - 
将样本数较少的现有样本随机复制数个以使样本数量与样本最多类别数量相等。复制越多还原原有比例的准确性更好。
 - 
从样本数最大的类别中随机地挑选出与样本最少的类别数量相等的样本,并将它们合并起来。
 
下面是一个用于执行Resampling过程的Python代码示例:
# 导入Pandas库
import pandas as pd
# 加载原始数据集
df = pd.read_csv('original_dataset.csv')
# 重新采样数据集
df_resampled = df.groupby('class_variable').\
              apply(lambda x: x.sample(df['class_variable'].value_counts().max(),
              replace=True)).reset_index(drop=True)
# 保存新的数据集
df_resampled.to_csv('resampled_dataset.csv', index=False)
总结
Resampling(重新采样)是一种常见的方法,用于处理类别之间样本数量不平衡的情况,它通过增加或减少样本来平衡类别数量。本文介绍了两种常见的重新采样技术:随机上采样和随机下采样,以及使用Pandas中Resample方法实现重新采样的方法。在使用这些方法时,需要注意一些问题,如对数据集进行一定的分层处理等。在实际应用中,需要结合实际情况选择最适合的方法
极客笔记