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

时间:2019-07-27 06:34:52

标签: python machine-learning train-test-split

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

通常,机器的机器学习与测试集大小之比为8:2。但是数据太不平衡了。因此,考虑到极端情况,大多数火车数据属于准时情况,而大多数测试数据属于延误情况,因此准确性会很差。

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

3 个答案:

答案 0 :(得分:1)

可能只是通过训练与测试的比率进行操作,您可能无法获得正确的预测和结果。

如果您正在处理不平衡的数据集,则应尝试重新采样技术以获得更好的结果。如果数据集不平衡,分类器将始终“预测”最常见的类,而无需对特征进行任何分析。

在数据集不平衡的情况下,也可以使用不同的度量标准来衡量性能,例如F1得分等

请通过下面的链接,它将使您更加清楚。

What is the correct procedure to split the Data sets for classification problem?

Cleveland heart disease dataset - can’t describe the class

答案 1 :(得分:0)

从50/50开始,然后将设置更改为60 / 40、70 / 30、80 / 20、90 / 10。声明所有结果并得出结论。在我的航班延误预测项目中,我使用60/40数据库,使用MLP NN获得了86.8%的准确度。

答案 2 :(得分:0)

您可以采用两种方法。

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

    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软件包的方法。完成平衡后,您可以使用典型方法使用普通的测试/训练拆分,而无需任何其他中间步骤。

第二种方法不仅从分割数据的角度来看更好,而且从训练模型的速度甚至能力(对于严重失衡的数据集不能保证正常工作)来说都是更好的选择。