Вы работаете со своим набором данных. Вы создаете классификационную модель и сразу получаете точность 95%. «Потрясающе» 👌 думаете вы. Вы погружаетесь немного глубже и обнаруживаете, что 95% данных принадлежат одному классу. Проклятие! что делать??? 🤨🤔

Не волнуйтесь 🤫

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

Разочарование!

Несбалансированные данные могут вызвать у вас много разочарований.

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

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

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

Что такое несбалансированные данные?

Несбалансированные данные обычно относятся к проблемам с классификацией, когда классы не представлены одинаково.

Например, у вас может быть задача классификации двух классов (бинарная) со 100 экземплярами (строками). В общей сложности 80 экземпляров имеют класс 1, а остальные 20 экземпляров — класс 2.

Это несбалансированный набор данных, и соотношение экземпляров класса 1 и класса 2 составляет 80:20 или точнее 4:1.

У вас может возникнуть проблема дисбаланса классов в задачах классификации с двумя классами, а также в задачах классификации с несколькими классами. Большинство техник можно использовать и на том, и на другом.

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

Дисбаланс — обычное дело

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

Есть проблемы, когда дисбаланс классов не просто распространен, он ожидаем. Например, наборы данных, подобные тем, которые характеризуют мошеннические транзакции, несбалансированы. Подавляющее большинство транзакций будет относиться к классу «Без мошенничества», и очень небольшое меньшинство будет к классу «Мошенничество».

Другой пример — наборы данных об оттоке клиентов, где подавляющее большинство клиентов остаются с сервисом (класс «Нет оттока»), а незначительное меньшинство отменяет свою подписку (класс «Отток»).

Когда есть небольшой дисбаланс классов, такой как 4: 1 в приведенном выше примере, это может вызвать проблемы.

Парадокс точности

Парадокс точности — это название точной ситуации во введении к этому посту. 👉🏻

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

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

Положите все на красное!

Что происходит в наших моделях, когда мы тренируемся на несбалансированном наборе данных?

Как вы могли догадаться, причина, по которой мы получаем точность 90% для несбалансированных данных (с 90% случаев в классе 1), заключается в том, что наши модели смотрят на данные и умно решают, что лучше всего всегда делать прогнозы. «Класс-1» и добиться высокой точности.

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

7 тактик для борьбы с несбалансированными тренировочными данными

Теперь мы понимаем, что такое дисбаланс классов и почему он обеспечивает вводящую в заблуждение точность классификации.

1) Попробуйте изменить показатель эффективности

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

Существуют метрики, которые были разработаны, чтобы рассказать вам более правдивую историю при работе с несбалансированными классами.

Дополнительные советы по выбору различных показателей эффективности я даю в статье Точность классификации недостаточна: вы можете использовать больше показателей эффективности.

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

Из этого поста я рекомендую рассмотреть следующие показатели производительности, которые могут дать больше информации о точности модели, чем традиционная точность классификации:

  • Матрица путаницы: разбивка прогнозов на таблицу, показывающую правильные прогнозы (диагональ) и типы сделанных неверных прогнозов (какие классы были присвоены неверным прогнозам).
  • Точность: показатель точности классификатора.
  • Отзыв: мера полноты классификаторов.
  • Оценка F1 (или F-оценка): средневзвешенное значение точности и полноты.

Я бы также посоветовал вам обратить внимание на следующее:

  • Каппа (или каппа Коэна): точность классификации, нормированная дисбалансом классов в данных.
  • Кривые ROC. Как и точность и полнота, точность делится на чувствительность и специфичность, и модели можно выбирать на основе пороговых значений баланса этих значений.

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

Все еще не уверены? Начните с каппа, это даст вам лучшее представление о том, что происходит, чем точность классификации.

2) Можете ли вы собрать больше данных?

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

Можете ли вы собрать больше данных? Найдите секунду и подумайте, можете ли вы собрать больше данных по своей проблеме.

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

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

3) Попробуйте передискретизировать свой набор данных

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

Это изменение называется выборкой вашего набора данных, и есть два основных метода, которые вы можете использовать для выравнивания классов:

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

Эти подходы часто очень просты в реализации и быстро работают. Они являются отличной отправной точкой.

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

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

Некоторые практические правила

  • Подумайте о тестировании недостаточной выборки, когда у вас много данных (десятки или сотни тысяч экземпляров или более).
  • Рассмотрите возможность тестирования избыточной выборки, когда у вас мало данных (десятки тысяч записей или меньше).
  • Рассмотрите возможность тестирования случайных и неслучайных (например, стратифицированных) схем выборки.
  • Рассмотрите возможность тестирования различных коэффициентов повторной выборки (например, вам не нужно нацеливаться на коэффициент 1:1 в задаче бинарной классификации, попробуйте другие коэффициенты).

4) Попробуйте создать синтетические образцы

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

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

Существуют систематические алгоритмы, которые можно использовать для создания синтетических образцов. Самый популярный из таких алгоритмов называется SMOTE или Synthetic Minority Over-sampling Technique.

Как следует из названия, SMOTE — это метод передискретизации. Он работает путем создания синтетических образцов из второстепенного класса вместо создания копий. Алгоритм выбирает два или более похожих экземпляра (используя меру расстояния) и возмущает экземпляр по одному атрибуту за раз на случайную величину в пределах разницы с соседними экземплярами.

Узнайте больше о SMOTE, см. оригинальную статью 2002 года под названием SMOTE: Synthetic Minority Over-sampling Technique.

Существует ряд реализаций алгоритма SMOTE, например:

  • В Python взгляните на модуль UnbalancedDataset. Он предоставляет ряд реализаций SMOTE, а также различные другие методы повторной выборки, которые вы можете попробовать.
  • В R пакет DMwR обеспечивает реализацию SMOTE.
  • В Weka вы можете использовать Контролируемый фильтр SMOTE.

5) Попробуйте оштрафованные модели

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

Штрафная классификация налагает дополнительные затраты на модель за допущение ошибок классификации в классе меньшинства во время обучения. Эти штрафы могут привести к тому, что модель будет уделять больше внимания классу меньшинств.

Часто обработка штрафов или весов классов зависит от алгоритма обучения. Существуют оштрафованные версии алгоритмов, такие как оштрафованные-SVM и оштрафованные-LDA.

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

Использование пенализации желательно, если вы привязаны к определенному алгоритму и не можете выполнить повторную выборку или получаете плохие результаты. Это еще один способ «сбалансировать» классы. Настройка матрицы штрафов может быть сложной. Скорее всего, вам придется попробовать различные схемы штрафов и посмотреть, что лучше всего подходит для вашей проблемы.

6) Попробуйте другую точку зрения

Существуют области исследований, посвященные несбалансированным наборам данных. У них есть свои алгоритмы, меры и терминология.

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

Два из них, которые вы могли бы рассмотреть, — это обнаружение аномалий и обнаружение изменений.

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

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

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

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

5) Попробуйте разные алгоритмы

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

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

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

Если вы сомневаетесь, попробуйте несколько популярных алгоритмов дерева решений, таких как C4.5, C5.0, CART и Random Forest.

Например, код R с использованием деревьев решений: «Нелинейная классификация в R с деревьями решений».

Пример использования CART в Python и scikit-learn можно найти в статье Испачкайте руки с помощью Scikit-Learn Now.

Спасибо