簡體   English   中英

如何正確拆分不平衡數據集以訓練和測試集?

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

我有一個航班延誤數據集,並嘗試在采樣前將數據集拆分為訓練集和測試集。 准時案例約占總數據的 80%,延遲案例約占其中的 20%。

通常在機器學習中訓練集和測試集大小的比例是 8:2。 但是數據太不平衡了。 所以考慮到極端情況,大部分訓練數據是准時情況,大部分測試數據是延遲情況,准確性會很差。

所以我的問題是如何正確分割不平衡的數據集來訓練和測試集?

可能只是通過使用訓練和測試的比率,您可能無法獲得正確的預測和結果。

如果您正在處理不平衡的數據集,您應該嘗試重新采樣技術以獲得更好的結果。 在不平衡數據集的情況下,分類器總是“預測”最常見的類,而不對特征進行任何分析。

在數據集不平衡的情況下,還可以使用不同的指標來衡量性能,例如 F1 分數等

請通過下面的鏈接,它會讓你更清楚。

為分類問題拆分數據集的正確程序是什么?

克利夫蘭心臟病數據集——無法描述類

從 50/50 開始,然后繼續將組更改為 60/40、70/30、80/20、90/10。 宣布所有結果並得出一些結論。 在我的一項航班延誤預測項目中,我使用了 60/40 數據庫並使用 MLP NN 獲得了 86.8% 的准確率。

您可以采用兩種方法。

  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包的方法。 完成平衡后,您可以使用典型方法使用普通的測試/訓練拆分,而無需任何額外的中間步驟。

第二種方法不僅從拆分數據的角度來看更好,而且從速度甚至訓練模型的能力(對於嚴重不平衡的數據集不能保證工作)的角度來看都更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM