6 различных методов решения одной из самых распространенных проблем, с которыми вы столкнетесь.

Несбалансированные наборы данных - это основная проблема в каждом сборнике вопросов на собеседовании по машинному обучению.

Начнем с примера:

Представьте, что вы пытаетесь построить модель классификации, и у вас есть два класса: кошки и собаки. К сожалению, ваши данные очень искажены: есть 950 изображений кошек и 50 изображений собак.

Если ваша модель классифицирует каждую картинку как Кошку (тупой, не так ли?), Вы будете точны на 95%! Подумайте об этом на секунду. Распределение в вашем наборе данных очень быстро становится большой проблемой.

Попробуем это исправить.

1. Убедитесь, что вы правильно формулируете проблему.

Есть много ситуаций, когда несбалансированные классы могут открыть возможность взглянуть на проблему по-другому.

Производственные дефекты, мошенничество с кредитными картами, спам в электронной почте. Эти проблемы относятся к той же категории: подавляющее большинство выборок в вашем наборе данных будут представлять нормальный класс, и только несколько аномалий представляют другой класс.

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

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

2. Точность - не лучший показатель для решения этих проблем.

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

Вместо этого, и в зависимости от вашей конкретной проблемы, вам следует обратить внимание на любое из следующего:

  • Точность, отзывчивость, оценка F
  • Матрица путаницы
  • Кривые ROC

3. Соберите больше данных.

Мне всегда нравится начинать здесь.

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

К сожалению, сбор дополнительных данных не всегда возможен. Но иногда это так, и все же многие команды преждевременно прибегают к синтетическому увеличению.

4. Дополните набор данных синтетическими данными.

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

Например, вы можете создавать новые изображения собак, трансформируя уже имеющиеся:

  • Изменение контрастности изображения
  • Выполнение горизонтального сальто
  • Слегка повернуть изображение в обе стороны
  • Добавление шума

Комбинируя эти методы, можно создать множество новых образцов, которые выглядят так же реалистично, как и исходные изображения.

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

5. Выполните повторную выборку набора данных.

Есть три разных способа пересэмплирования набора данных:

  • Передискретизация: сделайте снимки, которые у нас есть, несколько раз.
  • Недостаточная выборка: возьмите некоторые из имеющихся у нас изображений и выбросьте остальные.
  • Комбинируйте оба метода: передискретизируйте один класс, а другой - занижайте.

В качестве примера мы могли бы пересчитать наши данные следующим образом:

  • Используйте каждую фотографию собаки 4 раза. В итоге получится 400 фотографий собак (50 существующих изображений × 4).
  • Используйте любую другую картинку с кошкой. В итоге будет получено 475 изображений кошек (950 существующих изображений ÷ 2).

Имейте в виду, что избыточная или недостаточная выборка вносит систематическую ошибку в ваш набор данных: вы изменяете распределение данных, произвольно изменяя существующие выборки. Это может иметь последствия, поэтому подумайте об этом внимательно.

6. Правильная регулировка веса каждого класса.

Вы можете изменить функцию потерь своей модели, чтобы взвесить каждый класс по-разному, чтобы учесть дисбалансы. Для примера проверьте атрибут sample_weight в функции Kera’s fit ():

Необязательный массив весов для обучающих выборок, используемый для взвешивания функции потерь (только во время обучения).

Зависимое от затрат обучение - это еще один связанный метод, который вы также можете использовать, чтобы штрафовать результат вашей модели в зависимости от веса каждого класса. Я написал краткое введение в обучение с учетом затрат, которое должно помочь.

Заключительное слово

Я обычно думаю об этом по порядку. К настоящему времени систематическое движение вниз по этому списку стало второй натурой.

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