对高度不平衡的数据集进行抽样的正确方法是,该数据集具有较低的特征相关性和较低的类方差?

问题描述 投票:-1回答:1

我有一个数据集,具有23个相关性非常低的特征。这两个类别之间的差异很小。

这些类非常不平衡,就像可用于欺诈检测的数据一样。什么是采样此类数据的合适方法?

statistics data-science sampling oversampling imbalanced-data
1个回答
0
投票

感谢您来问您的问题!

处理不平衡的数据(通常定义为一种或多种类别的案例数量与其他类别非常不同的数据(某种形式的分布不均)是一个持续的挑战,并且这种挑战已经引起了很多在线写作。我喜欢this article作为起点。我将在Python中提供示例,尽管R中也适用类似的想法。

提供快速摘要:出于许多原因,采样很重要,其中不少原因是为了培训和测试而正确分割数据。为了简化起见,您可以更改从数据集(样本)中绘制示例的方式,以便获得每个类的机会大致相等,也可以尝试用更少的情况模拟该类的新示例,以再次达到相同的水平进行拆分时绘制类的概率。

为了简洁起见,假设变量X有两种情况:X = 0X = 1。我们将发生某些事件,出现某些特征,观察到某些响应等的情况称为X = 1。我们将其称为“正类”。最后,假设您有100,000个观察值,只有1,000个X = 1案例,其余为X = 0。因此,您的少数群体是积极的阶层,而您的失衡(正负)则为1/100。

如果您要抽取50,000个随机样本,并且希望该份额大致为正/负50/50,那么您可以做几件事。

  1. 对少数民族阶层进行过度抽样

此方法让您从X = 1的数据中绘制更多示例。为了达到50/50的平衡,您需要从正类中抽取(随机)多次,以达到25,000个示例。

要使用sci-kit learn执行此操作,您可以执行以下操作。

假设X是一个包含您的数据的数据框:

from sklearn.utils import resample

# make two dataframes, each with only one class 
majority_df = X[X['outcome']==0]
minority_df = X[X['outcome']==1]

# Oversampling the minority
oversampled_minority_df = resample(minority_df,
                          replace=True, 
                          n_samples=len(majority_df), 
                          random_state=123)

一些评论:

  • “重新采样”是一次又一次从集合中提取数据的处理
  • replace表示您希望流程“放回”它拉出的观测值;在这种情况下,这仅意味着系统可以在重采样期间多次捕获相同的观测结果(就像将其放回一个袋子中以供某人捕获)]
  • n_samplesmajority类数据帧的长度相同,因此最终结果在大多数/少数派示例之间具有均匀的平衡]

    1. 低估多数班

现在,您知道要对少数族裔进行过度采样,这正好相反。在您拥有与多数派相同数量的示例之前,无需重复采样少数派级别,在这里,您仅获取与少数派级别示例一样多的多数派级别样本。

您可以按以下方式反转上面的代码。仍然假设X是您的数据:

# Oversampling the minority
undersampled_majority_df = resample(majority_df,
                           replace=False, 
                           n_samples=len(minority_df), 
                           random_state=123)

[一些注意事项:

  • 这仍然是“重采样”,只采样较少
  • replace现在为假,因为如果不需要,您不想重复数据(过采样必须这样做)
  • [n_samples现在与minority_df的长度匹配,因此示例数相等

过度采样和欠采样类都带有统计问题,您可以在其他地方进行研究。

另一个选项是合成数据。这再次过分简化了统计过程,从而扰乱了您拥有的数据,从而制作了看起来类似于现有数据的“新”示例,但是在过程中引入了一些(有用的)噪音。

用于处理不平衡数据和合成数据创建的一种流行的软件包是imblearn。这个程序包本身有很多出色的工作,但更好的是与sklearn的相似程度以及两者的协同工作效果。

imblearn提供了流行的方法SMOTE或合成少数族裔过采样技术,以及许多其他方法。但是,在这种情况下,imblearn并非直接使用数据框,而是使用SMOTE作为其自身的拟合过程。

from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split

y = base_df['outcome']
X = base_df.drop('outcome', axis=1)

# setting up testing and training sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=27)

sm = SMOTE(random_state=123, ratio=1.0)
X_train, y_train = sm.fit_sample(X_train, y_train)

您会注意到sm对象具有fit_sample方法,并且在实例化时设置了正/负比例(通过ratio)。结果是在模型拟合期间平衡且可用的数据框。

© www.soinside.com 2019 - 2024. All rights reserved.