Statistics 对于特征间相关性和类间方差较低的高度不平衡数据集,正确的采样方法是什么?

Statistics 对于特征间相关性和类间方差较低的高度不平衡数据集,正确的采样方法是什么?,statistics,data-science,sampling,oversampling,imbalanced-data,Statistics,Data Science,Sampling,Oversampling,Imbalanced Data,我有一个数据集,有23个特征,相关性很低。这两个类之间的差异很小 这些类别与欺诈检测可用数据的类别一样高度不平衡。什么样的方法适合对此类数据进行采样?感谢来到SO询问您的问题 处理不平衡数据(通常定义为一个或多个类别的案例数量与其他类别非常不同的数据——某种类型的倾斜分布)是一个持续的挑战,并引发了大量在线写作。我喜欢作为起点。我将提供Python示例,不过类似的想法也适用于R 提供一个快速的总结:采样之所以重要,有很多原因,其中最重要的一个原因是正确地分割数据以进行培训和测试。为了过分简化,您

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


这些类别与欺诈检测可用数据的类别一样高度不平衡。什么样的方法适合对此类数据进行采样?

感谢来到SO询问您的问题

处理不平衡数据(通常定义为一个或多个类别的案例数量与其他类别非常不同的数据——某种类型的倾斜分布)是一个持续的挑战,并引发了大量在线写作。我喜欢作为起点。我将提供Python示例,不过类似的想法也适用于
R

提供一个快速的总结:采样之所以重要,有很多原因,其中最重要的一个原因是正确地分割数据以进行培训和测试。为了过分简化,您可以改变从数据集(示例)中绘制示例的方式,以便获得每个类的机会大致相等,或者可以尝试用较少的实例模拟该类的新示例,以便在进行拆分时再次达到绘制类的相同概率

对于Clarity,假设变量
X
有两种情况:
X=0
X=1
。让我们称之为
X=1
一些事件发生的情况,一些特征存在,一些反应被观察到,等等。我们称之为“积极类”。最后,假设你有100000次观察,只有1000例
X=1
,其余的是
X=0
。因此,你的少数阶级是积极的阶级,你的不平衡(积极到消极)是1/100

如果您正在抽取50000个随机样本,并且希望份额大约为50/50正类和负类,您可以做一些事情

  • 少数民族阶级抽样过多
  • 此方法使您可以从
    X=1
    的数据中绘制更多示例。为了达到50/50的平衡,你需要(随机)从正数类中抽取更多的次数,以达到25000个例子

    要使用
    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)
    
    # Oversampling the minority
    undersampled_majority_df = resample(majority_df,
                               replace=False, 
                               n_samples=len(minority_df), 
                               random_state=123)
    
    几点意见:

    • “重采样”是反复从集合中提取数据的过程
    • replace
      表示您希望流程“收回”它提取的观察结果;在这种情况下,这仅仅意味着系统可以在重采样过程中多次捕获相同的观测值(就好像它被放回一个袋子里让人抓取一样)
    • n_samples
      与多数类数据帧的长度相同,因此最终结果在多数/少数类示例之间具有均衡的平衡

    • 对多数阶级抽样不足
    现在,您已经了解了对少数类进行过采样,这正好相反。与重复采样少数类直到获得与多数类相同数量的示例不同,这里只采集少数类示例数量相同的多数类示例

    您可以按如下方式反转上述代码。仍然假设
    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)
    
    # Oversampling the minority
    undersampled_majority_df = resample(majority_df,
                               replace=False, 
                               n_samples=len(minority_df), 
                               random_state=123)
    
    几点注意:

    • 这仍然是“重新采样”,只采集较少的样本
    • replace
      现在为false,因为如果不需要,您不想重复数据(对于过采样,您必须这样做)
    • n_samples
      现在与
      minority_df
      的长度匹配,因此示例数相等
    无论是过度抽样还是不足抽样,都会带来统计方面的问题,你可以在其他地方进行研究

    另一种选择是综合数据。这同样是为了使统计过程过于简单,干扰了您现有的数据,使得“新”的示例看起来与您现有的数据相似,但在过程中引入了一些(有用的)噪声

    处理不平衡数据和合成数据创建的一个流行软件包是
    imbrearn
    。这个软件包本身有很多伟大的工作,但更好的是它与
    sklearn
    有多相似,以及两者的协同工作有多好

    IMBRearn
    提供了流行的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.20,
                                                        random_state=123)
    
    sm = SMOTE(random_state=123, ratio=1.0)
    X_train, y_train = sm.fit_sample(X_train, y_train)
    
    您将注意到
    sm
    对象具有
    fit_sample
    方法,并且在实例化它时设置正/负比例(通过
    ratio
    )。结果是在模型拟合期间平衡且可用的数据帧