如何处理不平衡数据集:Python 中的欠采样和过采样技术

2023-04-13 00:00:00 采样 如何处理 不平衡

在处理不平衡数据集的问题中,欠采样和过采样都是常见的方法。两种方法的原理是通过减少多数类数据或增加少数类数据来达到平衡数据集的目的。

欠采样方法:

欠采样方法是从多数类中随机选择一些实例进行删除,从而使得多数类的数量减少。这种方法的缺点是可能会丢失有用的信息,尤其是原始数据集很少的情况下。欠采样的代码演示如下:

import pandas as pd
from collections import Counter
from imblearn.under_sampling import RandomUnderSampler

data = pd.read_csv('data.csv')
X = data.drop('label', axis=1)
y = data['label']

print('Original dataset shape %s' % Counter(y))

rus = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = rus.fit_sample(X, y)

print('Resampled dataset shape %s' % Counter(y_resampled))

上述代码中使用了imblearn库中的RandomUnderSampler函数进行欠采样。使用该函数需要先导入数据集,然后将数据集的特征和标签分别赋值给变量X和y。在fit_sample()函数中传入X和y即可进行欠采样操作。最后输出欠采样后的样本数量即可。

过采样方法:

过采样方法是在少数类中增加一些实例,从而使得少数类的数量增加。这种方法的缺点是可能会导致易过拟合,需要注意。过采样可以使用SMOTE算法实现,SMOTE即对于一个少数类样本,随机选择一个最近邻接样本,然后在两个样本之间进行插值来产生新的样本,过程如下图所示:

SMOTE算法原理

使用SMOTE算法的代码演示如下:

import pandas as pd
from collections import Counter
from imblearn.over_sampling import SMOTE

data = pd.read_csv('data.csv')
X = data.drop('label', axis=1)
y = data['label']

print('Original dataset shape %s' % Counter(y))

sm = SMOTE(random_state=42)
X_resampled, y_resampled = sm.fit_sample(X, y)

print('Resampled dataset shape %s' % Counter(y_resampled))

上述代码中使用了imblearn库中的SMOTE函数进行过采样。使用该函数需要先导入数据集,然后将数据集的特征和标签分别赋值给变量X和y。在fit_sample()函数中传入X和y即可进行过采样操作。最后输出过采样后的样本数量即可。

相关文章