如何正确拆分不平衡数据集以训练和测试集?

How can I properly split imbalanced dataset to train and test set?

我有一个航班延误数据集,并尝试在采样前将该集拆分为训练集和测试集。准时案例约占总数据的 80%,延迟案例约占其中的 20%。

通常在机器学习中,训练集和测试集大小的比率是 8:2。但是数据太不平衡了。所以考虑到极端情况,火车数据大部分是准时情况,测试数据大部分是延迟情况,准确率会很差。

所以我的问题是如何正确地将不平衡的数据集拆分为训练集和测试集?

从 50/50 开始,继续将组数更改为 60/40、70/30、80/20、90/10。宣布所有结果并得出一些结论。在我的一项航班延误预测项目中,我使用了 60/40 数据库并使用 MLP NN 获得了 86.8% 的准确率。

可能只是通过调整训练和测试的比例,您可能无法获得正确的预测和结果。

如果您正在处理不平衡的数据集,您应该尝试重新采样技术以获得更好的结果。在不平衡数据集的情况下,classifier 总是 "predicts" 最常见的 class,而不对特征进行任何分析。

在数据集不平衡的情况下,也使用不同的指标进行性能测量,例如 F1 分数等

请仔细阅读下面的内容link,它会让您更加清楚。

您可以采用两种方法。

  1. 一个简单的:不对数据集进行预处理,而是对数据集进行仔细采样​​,以便 classes 在测试和训练子集中以相同的比例表示。您可以先按 class 拆分,然后从两组中随机抽样。

    import sklearn
    
    XclassA = dataX[0]  # TODO: change to split by class
    XclassB = dataX[1]
    YclassA = dataY[0]
    YclassB = dataY[1]
    
    XclassA_train, XclassA_test, YclassA_train, YclassA_test = sklearn.model_selection.train_test_split(XclassA, YclassA, test_size=0.2, random_state=42)
    
    
    XclassB_train, XclassB_test, YclassB_train, YclassB_test = sklearn.model_selection.train_test_split(XclassB, YclassB, test_size=0.2, random_state=42)
    
    Xclass_train = XclassA_train + XclassB_train
    Yclass_train = YclassA_train + YclassB_train
    
  2. 一个更复杂的,可以说更好的,你可以先尝试平衡你的数据集。为此,您可以使用多种技术之一(欠采样、过采样、SMOTE、AdaSYN、Tomek 链接等)。我建议您查看 imbalanced-learn 包的方法。完成平衡后,您可以使用普通的 test/train 拆分使用典型方法,无需任何额外的中间步骤。

第二种方法不仅从拆分数据的角度来看更好,而且从速度甚至训练模型的能力来看都更好(对于严重不平衡的数据集,不能保证有效)。