Введение

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

Описание

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

Методы повторной выборки

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

Передискретизация класса меньшинства

Этот простой и мощный план позволяет получить сбалансированные классы. Он произвольно дублирует наблюдения из приемлемого класса меньшинства, чтобы усилить свой сигнал. Самая простая форма передискретизации — это выборка посредством замены. Передискретизация уместна, когда в нашем наборе данных не так много наблюдений, как ‹10K наблюдений. Риск заключается в том, что если мы дублируем, кроме того, несколько наблюдений, то мы переоснащаемся. Основным недостатком этого метода является то, что он просто добавляет дубликаты предшествующих примеров, что увеличивает возможность переобучения. Для этого мы используем функцию resample функции scikit-learn.

In [34]: train, test = train_test_split(df,
test_size=0.3,
random_state=42)
In [35]: major_class = train[train.Class==0]
minority_class = train[train.Class==1]
upsampled_class = resample(minority_class,
replace=True,
n_samples=len(major_class),
random_state=27)
upsampled_data = pd.concat([major_class, upsampled_class])
In [36]: plt.figure(figsize=(8, 5))
t='Balanced Classes after upsampling.'
upsampled_data.Class.value_counts().plot(kind='bar', title=t)
Out[36]: <matplotlib.axes._subplots.AxesSubplot at 0x1153d0e80>

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

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

In [37]: down_class = resample(major_class,
replace=False,
n_samples=len(minority_class),
random_state=27)
downsampled_data = pd.concat([down_class, minority_class])
In [38]: plt.figure(figsize=(8, 5))
t='Balanced Classes after upsampling.'
downsampled_data.Class.value_counts().plot(kind='bar', title=t)
Out[38]: <matplotlib.axes._subplots.AxesSubplot at 0x1a35e92b70>

Метод передискретизации синтетического меньшинства (SMOTE)

Этот метод был разработан Chawla et al. (2002) как стремление к произвольной передискретизации. Как это работает? Что ж, он объединяет две идеи, которые мы до сих пор объединяли: произвольный срез и k-ближайших соседей. Бесспорно, SMOTE позволяет производить новые данные из класса невозрастных (они не копируют наблюдаемые, как при произвольной передискретизации, а автоматически вычисляют k-ns для этих точек. Синтетические точки добавляются между выбранной точкой Обратите внимание, что imblearn API, который является частью проекта scikit-learn, используется для применения SMOTE в следующем примере;

In [39]: smote = SMOTE(sampling_strategy='minority')
X_smote, y_smote = smote.fit_sample(X_train, y_train)
X_smote = pd.DataFrame(X_smote, columns=X_train.columns )
y_smote = pd.DataFrame(y_smote, columns=['Class'])
In [40]: smote_data = pd.concat([X_smote,y_smote],axis=1)
plt.figure(figsize=(8, 5))
title='Balanced Classes using SMOTE'
smote_data.Class.value_counts().plot(kind='bar', title=title)
Out[40]: <matplotlib.axes._subplots.AxesSubplot at 0x1a36e25080>

Используйте K-кратную перекрестную проверку правильно

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

Создавайте собственные модели

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

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

Для получения более подробной информации посетите: https://www.technologiesinindustry4.com/2021/10/handling-imbalanced-datasets.html

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.