【问题标题】:Unbalanced dataset split不平衡的数据集拆分
【发布时间】:2018-08-04 02:42:06
【问题描述】:

不平衡dataset 的最佳技术是什么?

我有一个 dataset 的 11967 个实例,其中正标签的数量是 139 ,负标签的数量是 11828 。

如何拆分dataset进行测试(在技术之前或之后)?

【问题讨论】:

  • 这是什么数据?为什么只是测试? (你做什么训练?)
  • 我不明白你所说的数据类型是什么意思。关于训练,我可以通过欠采样或过采样来处理训练数据,但测试数据也不平衡,所以恐怕也会影响模型的评估。
  • 定义“最佳”。以什么衡量标准?

标签: validation machine-learning classification


【解决方案1】:

处理不平衡数据集的好方法很少:

欠采样:这意味着采用较少数量的多数类(在您的情况下为负标签,以便平衡新数据集)。

过采样:这意味着复制少数类(正标签)的数据以平衡数据集。

还有第三种处理不平衡数据集的方法,即smote。欢迎查看此链接:https://www.analyticsvidhya.com/blog/2016/09/this-machine-learning-project-on-imbalanced-data-can-add-value-to-your-resume/

【讨论】:

    【解决方案2】:

    我建议你应该在 sklearn.model_selection.train_test_split 中使用 stratify 方法。如果你设置这个 statify = 'y' (y 是你的数据集的标签),这将以训练和测试集包含相等百分比的正样本和负样本的方式划分你的数据。这在不平衡的数据集中非常有用。它不是随机划分数据集,而是在将数据集分为两部分时考虑标签。

    这里是示例代码:

     X_train, X_test, y_train, y_test = train_test_split(X,y,test_size =0.2,statify = y)
    

    有关详细信息,请参阅文档: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

    【讨论】:

    • 你拼错了“分层”。复制/粘贴时要小心!
    【解决方案3】:

    使用sklearn分割数据集的标准方法如下:

    #splitting the datasets into training and validation sets (60% training)
    from sklearn.model_selection import train_test_split
    xTrain, xVald, yTrain, yVald = train_test_split(Xs, y, train_size=0.60, random_state = 2)
    

    其中 Xs 和 y 是预测变量和响应变量。

    正如您所提到的,您的数据集的类分布不平衡。此分布不允许您构建预测模型,因为模型将您的罕见事件(阳性水平)视为随机噪声,无法很好地预测新数据集。

    在构建任何预测模型之前,您可能需要对罕见事件进行上采样,以使其在分布中保持平衡。如果您想坚持原始分布,那么您可以运行随机森林模型,该模型也适用于不平衡数据。欲了解更多信息,请参阅以下链接: https://elitedatascience.com/imbalanced-classes

    如果你想对你的数据进行上采样,那么你可以试试这个:

    from sklearn.utils import resample
    # Separate majority and minority classes
    df_majority = df[df.pos_neg==0] #I classified negative class as '0'
    df_minority = df[df.pos_neg==1]
    
    # Upsample minority class
    df_minority_upsampled = resample(df_minority, 
                                     replace=True,       # sample with replacement
                                     n_samples=11828,    # to match majority class
                                     random_state=123)   # reproducible results
    
    # Combine majority class with upsampled minority class
    df_upsampled = pd.concat([df_majority, df_minority_upsampled])
    
    # Display new class counts
    df_upsampled.value_counts()
    # 1    11828
    # 0    11828
    

    【讨论】:

    猜你喜欢
    • 2019-09-25
    • 2019-11-05
    • 2019-12-05
    • 2015-01-28
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2018-09-13
    • 2016-04-02
    相关资源
    最近更新 更多