我有一个航班延误数据集,并尝试在采样之前将数据集拆分为训练集和测试集。准时病例约占总数据的 80%,延迟病例约占总数据的 20%。
通常在机器学习中,训练集和测试集大小的比例为 8:2。但数据太不平衡了。因此考虑到极端情况,火车数据大部分是准时情况,而测试数据大部分是延误情况,准确性会很差。
所以我的问题是如何正确分割不平衡的数据集来训练和测试集?
可能仅通过调整训练和测试的比例,您可能无法获得正确的预测和结果。
如果您正在处理不平衡的数据集,您应该尝试重新采样技术以获得更好的结果。如果数据集不平衡,分类器总是“预测”最常见的类别,而不对特征进行任何分析。
在数据集不平衡的情况下,还可以使用不同的指标进行性能测量,例如 F1 分数等
请浏览以下链接,它会让您更清楚。
从 50/50 开始,继续将组数更改为 60/40、70/30、80/20、90/10。宣布所有结果并得出一些结论。在我的一项航班延误预测项目中,我使用了 60/40 数据库,并使用 MLP NN 获得了 86.8% 的准确率。
您可以采取两种方法。
一个简单的方法:不对数据集进行预处理,而是对数据集进行仔细采样,以便两个类在测试和训练子集中以相同的比例表示。您可以通过首先按类别拆分,然后从两组中随机采样来完成此操作。
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
一个更复杂、可以说更好的方法,您可以首先尝试平衡您的数据集。为此,您可以使用多种技术之一(欠采样、过采样、SMOTE、AdaSYN、Tomek 链接等)。我建议您查看
imbalanced-learn
包的方法。完成平衡后,您可以使用典型方法进行普通测试/训练分割,无需任何额外的中间步骤。第二种方法更好,不仅从分割数据的角度来看,而且从训练模型的速度甚至能力来看(这对于严重不平衡的数据集并不能保证有效)。
我建议您应该使用 SMOTE 进行过采样或欠采样,或者在分割之前对数据进行洗牌并使用分层 K 折叠交叉验证,这有助于确保每个折叠具有相同比例的类