- Вопрос или проблема
- 1. Можете ли вы собрать больше данных?
- 2. Попробуйте изменить вашу метрику производительности:
- 3. Повторная выборка вашего набора данных
- 4. Генерация синтетических образцов
- 5. Попробуйте разные алгоритмы
- Ответ или решение
- Проблема несбалансированных данных
- Основные рекомендации
- Заключение
Вопрос или проблема
У меня есть модель, которая выполняет бинарную классификацию.
Мой набор данных сильно несбалансирован, поэтому я подумал, что мне следует отбалансировать его с помощью недовыборки перед обучением модели. Итак, сбалансировать набор данных, а затем случайным образом разделить его. Это правильный подход? Или мне следует сбалансировать также тестовый и обучающий наборы данных?
Я попробовал сбалансировать только весь набор данных, и у меня точность на обучающем наборе составила 80%, но на тестовом наборе я получил 30% точности. Это кажется неправильным?
Но я также не думаю, что следует балансировать тестовый набор, потому что это может считаться смещением.
Какой правильный способ сделать это?
Спасибо
ОБНОВЛЕНИЕ: У меня 400 000 образцов, 10% из которых – единицы, а 90% – нули. Я не могу получить больше данных. Я пытался сохранить весь набор данных, но не знаю, как его разделить на обучающий и тестовый наборы. Нужно ли, чтобы распределение в обучающем и тестовом наборах было одинаковым?
Лучший способ – собрать больше данных, если это возможно.
Отбор образцов всегда следует проводить на обучающем наборе данных. Если вы используете Python, scikit-learn предлагает множество полезных пакетов, которые помогут вам с этим. Случайный отбор – очень плохой вариант для разделения. Попробуйте стратифицированный отбор. Это пропорционально делит ваш класс между обучающим и тестовым наборами.
Проводите оверсэмплинг, недосэмплинг или гибридные техники на обучающем наборе. Если вы используете scikit-learn и логистическую регрессию, есть параметр, называемый class-weight. Установите его на balanced.
Выбор метрики оценки также играет очень важную роль в выборе модели. Точность никогда не помогает при несбалансированном наборе данных. Попробуйте площадь под ROC-кривой или точность и полноту в зависимости от вашей необходимости. Хотите ли вы придать большее значение уровню ложных срабатываний или ложных отрицаний?
Ваша проблема очень распространена, и многие ученые-данные сталкиваются с подобными вопросами.
В этом блоге автор очень хорошо объясняет, что делать. Вот основные моменты:
1. Можете ли вы собрать больше данных?
2. Попробуйте изменить вашу метрику производительности:
Точность – это не метрика, которую следует использовать при работе с несбалансированными наборами данных. Мы видели, что она вводит в заблуждение.
Существуют метрики, специально разработанные, чтобы показать более правдивую картину при работе с несбалансированными классами.
Точность: Мера точности классификатора.
Полнота: Мера полноты классификатора.
F1 Score (или F-оценка): Взвешенное среднее точности и полноты.
3. Повторная выборка вашего набора данных
Вы можете изменить набор данных, который используете для построения своей предсказательной модели, чтобы получить более сбалансированные данные.
Это изменение называется выборкой вашего набора данных, и существует два основных метода, которые вы можете использовать, чтобы уравнять классы:
-
Вы можете добавить копии экземпляров из недостаточно представленного класса, называемое оверсэмплингом (или более формально выборкой с возвращением), или
-
Вы можете удалить экземпляры из чрезмерно представленного класса, называемое недосэмплингом.
4. Генерация синтетических образцов
Простым способом генерации синтетических образцов является случайный отбор атрибутов из экземпляров в меньшинственном классе.
5. Попробуйте разные алгоритмы
Как всегда, я настоятельно рекомендую не использовать ваш любимый алгоритм для каждой задачи. Вам следует хотя бы периодически проверять различные типы алгоритмов для данной задачи.
Все зависит от вашей цели. Вы нацелены на точность или полноту?
Вы правы, распределение ваших обучающих данных (всегда в зависимости от модели и гиперпараметров) повлияет на вашу модель соответственно. Предоставление обучающего набора, где большинство экземпляров (т.е. 90%) помечены как 0
, вероятно, приведет к тому, что в тестовом наборе большинство из них будут помечены как 0
. Поэтому, если кто-то хочет обнаружить 1
, следует изменить выборку, чтобы их было больше. Существует множество способов сделать это, помимо изменения вашего обучающего распределения. Во-первых, оверсэмплинг, недосэмплинг или даже лучше, использование ансамблевых моделей, где каждая модель может содержать все 1
и некоторые 0
. Во-вторых, можно подстраивать в зависимости от выбранного классификатора различные гиперпараметры, которые отвечают за ограничение большинства классов.
Как упомянуто в большинстве ответов, существует множество способов борьбы с искажёнными данными. Я просто хотел бы подчеркнуть, что SMOTE – один из рекомендуемых способов устранения этой искаженности.
Ответ или решение
Разделение данных на обучающую и тестовую выборки в случае несбалансированных наборов данных — это часто возникающая проблема в области машинного обучения. Давайте подробно рассмотрим, как правильно подходить к этой задаче с целью построения эффективной модели бинарной классификации.
Проблема несбалансированных данных
Вы указали, что у вас есть 400 000 образцов, где всего 10% являются положительными классами (1), а 90% — отрицательными (0). Когда данные сильно несбалансированы, модели машинного обучения могут демонстрировать высокую точность на обучающей выборке, но низкую точность на тестовой выборке из-за смещения в сторону доминирующего класса.
Основные рекомендации
-
Сбор дополнительных данных: Если есть возможность, лучше всего получать больше данных. Это может помочь достичь более сбалансированного распределения классов.
-
Стратифицированное разделение: Вместо случайного деления данных на обучающую и тестовую выборки, используйте стратифицированное разделение. Это обеспечивает пропорциональное распределение классов в обеих выборках. В Python можно использовать функцию
train_test_split
из библиотекиscikit-learn
с параметромstratify
.from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y)
-
Балансировка обучающей выборки:
- Oversampling: Используйте методы, такие как SMOTE (Synthetic Minority Over-sampling Technique), чтобы увеличить количество примеров из меньшинства, путем создания синтетических образцов.
- Undersampling: Уменьшите количество примеров из большинства, чтобы сбалансировать классы. Однако при этом есть риск потери информации.
-
Использование весов классов: Многие алгоритмы машинного обучения, такие как логистическая регрессия или случайные леса, позволяют настраивать веса классов, чтобы модель уделяла больше внимания меньшинству. В
scikit-learn
это можно сделать с помощью параметраclass_weight='balanced'
. -
Изменение метрик оценки: Избегайте использования точности (accuracy) как основной метрики в несбалансированных наборах данных. Для таких случаев лучше использовать:
- Precision (точность): доля правильных положительных предсказаний среди всех положительных предсказаний.
- Recall (полнота): доля правильных положительных предсказаний среди всех реальных положительных случаев.
- F1 Score: гармоническое среднее между точностью и полнотой.
-
Проба различных алгоритмов: Не зацикливайтесь на одном алгоритме. Пробуйте разные модели с различными гиперпараметрами и оценочными метриками.
Заключение
Ваш подход к балансировке данных на этапе подготовки выборки является правильным, но важно осуществлять его только на обучающей выборке. Тестовая выборка должна оставаться представительной для реальных данных, поэтому её не следует подвергать изменениям через балансировку. Используя стратифицированное разделение и методы балансировки только на обучающей выборке, а также корректные метрики оценки, вы получите более точное и надежное представление о работе вашей модели.
Если у вас есть дополнительные вопросы или необходима более глубокая помощь, не стесняйтесь обращаться!