Используйте эти методы, чтобы сбалансировать и улучшить производительность
Что такое несбалансированные данные
Несбалансированные данные — это невероятно распространенный случай в приложениях машинного обучения. Несбалансированные данные возникают, когда у вас есть много наблюдений в ваших данных, которые представляют один тип класса и другие классы, которые намного меньше. Примерами этого могут быть мошеннические транзакции по кредитным картам в отношении законных покупок или потенциально спамовые электронные письма в отношении законных электронных писем (также вероятно, что законные электронные письма в наши дни составляют меньшинство).
Что такое вызов?
Проблема, с которой вы столкнетесь с несбалансированными данными, заключается в том, как алгоритмы учатся на ваших данных. Когда вы создаете набор данных для обучения/тестирования, количество наблюдений, представляющих класс меньшинства, будет намного меньше, чем большинство. Алгоритму не хватает данных, чтобы действительно смоделировать то, как будет выглядеть класс меньшинства, и в конечном итоге он чрезмерно смещается в сторону класса большинства. Может быть особенно опасно использовать простую метрику Точность для оценки вашей модели или поиска высокой точности или отзыва по отношению к классу меньшинства. Подробнее о метриках оценки позже.
Методы работы с несбалансированными данными
К счастью, немного подумав и настроив этапы обучения и тестирования, вы сможете справиться с несбалансированными данными; существует множество способов обработки несбалансированных данных. Ниже приведены некоторые (не все) способы, с помощью которых вы можете справиться с этим:
- Выбор алгоритма
- Перекрестная проверка несбалансированных данных
- Генерация синтетических данных
- Выбор правильной метрики производительности
Как узнать, есть ли у меня несбалансированные данные
Одна простая строка кода — это все, что вам нужно для проверки несбалансированных данных. Возьмите свою целевую переменную и используйте следующий код
df['Target'].value_counts() 1 17433 0 5193
Проверив количество элементов, мы можем быстро и легко увидеть, что объектов класса 1
гораздо больше, чем класса 0
.
Выбор алгоритма
Начнем с самого простого способа. В этом примере я буду ссылаться на выбор алгоритма Scikit-Lern и на то, как они обрабатывают несбалансированные данные. Многие из их алгоритмов поддерживают параметр class_weight
, для которого можно установить значение balanced
. Например, RandomForest
, LogisticRegression
, Perceptron
и SVM
поддерживают этот параметр. Согласно документации:
class_weight{"balanced", "balanced_subsample"}, словарь или список словарей, по умолчанию = нет Веса, связанные с классами в form
{class_label: weight}
. Если не указано, предполагается, что все классы имеют вес один. Для задач с несколькими выходами список словарей может быть предоставлен в том же порядке, что и столбцы `y'.
«Сбалансированный» режим использует значения
y
для автоматической корректировки весов обратно пропорционально частотам классов во входных данных какn_samples / (n_classes * np.bincount(y))
Если вы обнаружите, что один из этих классификаторов хорошо работает на этапе выбора модели, вы можете просто продолжить алгоритм.
Сплит-тестирование и перекрестная проверка
Если данные несбалансированы, вам необходимо разделить их таким образом, чтобы сохранить пропорции классов, что также называется расслоением. train_test_split
автоматически по умолчанию разделяет данные с помощью параметра stratify=None
. Чтобы стратифицировать разделение, используйте целевую переменную stratify=y
.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=53, stratify=y)
Так что же означает стратификация? Согласно Википедии:
В статистике стратифицированная выборка — это метод выборки из совокупности, которую можно разделить на подгруппы.
Другими словами, он учитывает размеры подгрупп или классов и учитывает это при разделении.
При выполнении перекрестной проверки для оценки модели следует использовать перекрестную проверку StratifiedKFold
. Это обеспечит выполнение складок за счет сохранения процентного соотношения выборок для каждого класса.
Важное примечание. Этот шаг очень важен. Без этого вы можете получить в тесте нулевые образцы класса меньшинства.
УДАР
Метод передискретизации синтетического меньшинства (SMOTE) использует метод ближайшего соседа для создания новых выборок класса меньшинства. Этот метод применяется только к обучающим данным, а затем тестируется на исходном, нетронутом тестовом разделе. Метод, выбранный здесь, состоит в том, чтобы сначала передискретизировать класс меньшинства, делая его сбалансированным, а затем занижать его, чтобы уменьшить размер и раздувание.
Синтетически генерируя наблюдения меньшинства, похожие, но не идентичны другим наблюдениям меньшинства, мы можем улучшить производительность модели для меньшинства.
Пакет imblearn содержит алгоритм SMOTE и может быть легко интегрирован в пайплайны SKLearn.
Важное примечание. Никогда не выполняйте SMOTE для набора данных test, только для раздела train!
Примечание по реализации. Необходимо импортировать конвейер imblearn
вместо конвейера sklearn, иначе он не будет работать.
from imblearn.pipeline import Pipeline from imblearn.over_sampling import SMOTE from imblearn.under_sampling import RandomUnderSampler pipeline = Pipeline([('prep',column_trans), ('over', SMOTE(random_state=42)), ('under', RandomUnderSampler(random_state=42)), ('clf', clf)])
Подробнее:Для получения дополнительной информации об использовании конвейеров ознакомьтесь с моим сообщением: Использование конвейеров в Sci-kit Learn.
Выбор правильных показателей оценки
Наконец, выбор правильной метрики оценки имеет решающее значение для несбалансированных данных. Если вы полагаетесь на Точность, вы, скорее всего, не добьетесь результатов, о которых думаете. В зависимости от результата, который вы ищете, вы можете просмотреть несколько различных показателей, таких как точность, отзыв и оценка F1. Пожалуйста, посмотрите на мой другой пост: Прекратите использовать точность для оценки ваших моделей классификации.
Заключение
Несбалансированные данные повсюду в реальных приложениях машинного обучения. Легко попасть в ловушку, пропустив несбалансированные данные только для того, чтобы обнаружить, что они работают не так, как вы думаете. К счастью, есть несколько способов справиться с этим, например, выбрать алгоритм, который работает с несбалансированными данными, разделить ваши данные и скрестить -проверка вашей модели послойно с использованием SMOTE для синтетического генерирования данных и, что не менее важно, выбор наилучшей оценочной метрики для желаемого результата. Удачной постройки модели!
Если вам нравится читать такие истории и вы хотите поддержать меня как писателя, подумайте о том, чтобы зарегистрироваться и стать участником Medium. Это 5 долларов в месяц, что дает вам неограниченный доступ к тысячам статей. Если вы зарегистрируетесь по моей ссылке, я получу небольшую комиссию без каких-либо дополнительных затрат для вас.