Как правильно разделить несбалансированный набор данных для обучения и тестирования?

У меня есть набор данных задержки рейса, и я пытаюсь разделить набор на поезд и проверить набор перед отбором проб. Своевременные случаи составляют около 80% от общего объема данных, а задержанные случаи составляют около 20%.

Обычно в машинном обучении соотношение размера поезда и тестового набора составляет 8:2. Но данные слишком несбалансированы. Таким образом, принимая во внимание крайний случай, большинство данных о поездах являются своевременными, а большинство данных испытаний - задержанными, и точность будет низкой.

Поэтому мой вопрос: как правильно разделить несбалансированный набор данных для обучения и тестирования?

2 ответа

Решение

Вероятно, просто играя с соотношением поезд и тест, вы можете не получить правильный прогноз и результаты.

Если вы работаете с несбалансированным набором данных, вы должны попробовать метод повторной выборки, чтобы получить лучшие результаты. В случае несбалансированных наборов данных классификатор всегда "прогнозирует" наиболее распространенный класс, не выполняя никакого анализа характеристик.

Также используйте различные метрики для измерения производительности, такие как оценка F1 и т. Д. В случае несбалансированного набора данных

Пожалуйста, перейдите по ссылке ниже, это даст вам больше ясности.

Какова правильная процедура для разделения Наборов данных для задачи классификации?

Набор данных о болезни сердца Кливленда - не могу описать класс

Начните с 50/50 и продолжайте менять наборы как 60/40, 70/30, 80/20, 90/10. объявить все результаты и прийти к какому-то выводу. В одной из моих работ по проекту прогнозирования задержек рейсов я использовал базу данных 60/40 и получил 86,8 % точности, используя MLP NN.

Вы можете выбрать два подхода.

  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 пакет. Выполнив балансировку, вы можете использовать обычное разделение тест / поезд, используя стандартные методы, без каких-либо дополнительных промежуточных шагов.

Второй подход лучше не только с точки зрения разделения данных, но также с точки зрения скорости и даже способности обучать модель (что для сильно несбалансированных наборов данных не гарантируется).

Другие вопросы по тегам