Para ler em Português clique aqui (чтобы прочитать на португальском, нажмите здесь)

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

Несбалансированные классы (или, как я люблю говорить, 0 больше, чем 1, или наоборот) — повседневные проблемы любого специалиста по данным, я бы сказал даже самые распространенные, хотя их просто обойти, они крайне важны, для меня решил написать эту статью сегодня, чтобы прояснить все об этом понятии!

Что вы прочтете в этой статье:

  • Что такое несбалансированные классы?;
  • Точность и отзыв;
  • Выявление проблем;
  • Передискретизация;
  • недостаточная выборка;

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

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

Чтобы понять эту концепцию, мы обратимся к примеру:

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

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

Что это влечет за собой? В принципе, наша модель сможет с хорошей точностью обнаруживать покупку реалов, ведь он «изучил» 1 миллион случаев и знает, что делает. С другой стороны, при попытке обнаружить настоящие мошенничества у него может не получиться так хорошо, потому что он только «изучил» 1000 случаев мошенничества, возможно, он не так хорош в прогнозировании такого рода.

Вкратце:

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

Точность и отзыв

Но в конце концов, как мы определяем, что у нас действительно есть проблемы с несбалансированными классами?

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

В любом случае, кто может точно рассказать нам о нашей проблеме? Мы называем этих героев «Метриками оценки» — Точность и полнота.

Точность. Как следует из названия, точность измеряет точность модели. Учитывая общее количество оценок, например 0, сколько из этих оценок правильно предсказала моя модель? Представьте, что у нас есть 100 игральных костей, которые классифицируются как 0, если моя модель попадает в 83 из них, мы говорим, что у нас есть модель с точностью 83%.

Вспомнить: я объясню очень подробно, так как это может быть немного сложнее для понимания. Представьте, что в той же модели у нас всего 100 игральных костей, в этих 50 они классифицируются как 0, а в остальных 50 — как 1. Для них наша модель правильно классифицирует 1 как всего 30. dice и для 0 он неправильно классифицирует в общей сложности 45 отзывов, в основном, это соотношение между теми, кто правильно классифицирован как 1 (или 0, есть также значение отзыва для каждой классификации) путем добавления их к неправильным классификациям из 0. В этом случае у нас есть отзыв 40% (30 разделить на 45 +30).

Выявление проблем:

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

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

Если вы хотите просмотреть полную записную книжку непосредственно в Google Colab с дополнительными пояснениями, нажмите здесь.

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

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

Передискретизация

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

Вот пример:

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

Обратите внимание, что количество данных на «метке 0» было увеличено. Но как?

Простой, создание синтетических данных.

Есть несколько способов сделать это, и конечно в этом есть целая логика, я не буду вдаваться в подробности как работает эта статья.

Форма, которую мы будем использовать, будет называться SMOTE (Synthetic Minority Over-sampling Technique), этот алгоритм автоматизирует все функции для пользователя!

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

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

Применение SMOTE в коде:

# importing SMOTE:
from imblearn.over_sampling import SMOTE
# instantiating SMOTE:
smote = SMOTE()
# applying SMOTE to our data ("training"):
X_values, y_values= smote.fit_sample(X_values, y_values)
# Now just use them in your Machine Learning model

Однако жизнь не усыпана розами, создание синтетических данных может вызвать проблемы!

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

Переобучение. Как следует из названия, «мы слишком много тренируемся». В этом случае наша модель очень хорошо прогнозирует обучающие данные ТОЛЬКО! То есть модель не может хорошо обобщать данные.

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

Недостаточная выборка:

С другой стороны, у нас есть Undersampling, который в основном делает то же самое, что и Oversampling, только наоборот.

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

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

В этом случае мы уменьшаем «метку 1» (или класс 1), чтобы она имела то же количество, что и метка 0.

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

Здесь у нас было меньше точности, но проблема точности и отзыва была решена.

Приложение NearMiss в коде:

# importing SMOTE:
from imblearn.under_sampling import NearMiss
# instantiating SMOTE:
nm = NearMiss()
# applying SMOTE to our data ("training"):
X_values, y_values= nm.fit_sample(X_values, y_values)
# Now just use them in your Machine Learning model

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

Недообучение:Теперь, если на этот раз вместо увеличения данных мы сделали это, чтобы уменьшить их, наша модель теперь меньше «изучит» или что-то в этом роде. Чем меньше данных, тем менее сложным уравнение предсказывает любую классификацию.

Обратите внимание, что в этом новом случае у нас есть общая линия (уравнение). Поскольку для обучения используется мало данных, у нас будет меньше информации при построении модели Machine Learning.

Выводы:

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

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

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

Ссылки

ЛинкедИн

Гитхаб