Балансировка классов в машинном обучении
При использовании алгоритма машинного обучения очень важно обучить модель на наборе данных с почти таким же количеством выборок. Это называется сбалансированным классом. Нам нужны сбалансированные классы для обучения модели, но, если классы не сбалансированы, нам нужно использовать метод балансировки классов перед использованием алгоритма машинного обучения. Итак, в этой статье я расскажу вам, что такое балансировка классов и как реализовать методы балансировки классов с помощью Python.
Что такое балансировка классов?
В машинном обучении балансировка классов означает балансировку классов с несбалансированными выборками. Перед использованием алгоритма машинного обучения важно избежать дисбаланса классов, потому что наша конечная цель – обучить модель машинного обучения, которая хорошо обобщается для всех возможных классов, предполагая, что у нас есть двоичный набор данных с равным количеством выборок.
Итак, перед использованием алгоритма машинного обучения очень важно посмотреть на распределение классов, чтобы исправить проблемы балансировки классов. Например, давайте посмотрим, как мы можем обнаружить несбалансированные классы, создав несбалансированный набор данных с помощью функции make_classification в библиотеке Scikit-learn в Python:
from sklearn.datasets import make_classification nb_samples = 1000 weights = (0.95, 0.05) x, y = make_classification(n_samples=nb_samples, n_features=2, n_redundant=0, weights=weights, random_state=1000) print(x[y==0].shape) print(x[y==1].shape)
результат:
(946, 2)
(54, 2)
Как и ожидалось, первый класс является доминирующим. Чтобы сбалансировать классы этого типа набора данных, у нас есть два метода предотвращения дисбаланса классов в машинном обучении:
- Повторная выборка с заменой
- Передискретизация SMOTE
Теперь давайте рассмотрим оба этих метода балансировки классов, чтобы увидеть, как мы можем сбалансировать классы, прежде чем использовать какой-либо алгоритм машинного обучения.
Передискретизация с заменой:
В методе передискретизации с заменой мы передискретизируем набор данных, ограниченный второстепенным классом, до тех пор, пока не достигнем желаемого количества выборок в обоих классах. Поскольку мы работаем с заменой, ее можно повторять n раз. Но результирующий набор данных будет содержать точки данных, выбранные из 54 возможных значений (согласно нашему примеру). Вот как мы можем использовать передискретизацию с техникой замены с помощью Python:
numpy as np from sklearn.utils import resample x_resampled = resample(x[y==1], n_samples=x[y==0].shape[0], random_state=1000) x_ = np.concatenate((x[y==0], x_resampled)) y_ = np.concatenate((y[y==0], np.ones(shape=(x[y==0].shape[0],), dtype=np.int32))) print(x_[y_==0].shape) print(x_[y_==1].shape)
результат:
(946, 2)
(946, 2)
Передискретизация SMOTE:
Передискретизация SMOTE – один из самых надежных подходов, который призван предотвратить дисбаланс классов. Он расшифровывается как «Техника передискретизации синтетического меньшинства». Этот метод разработан специально для создания новых образцов, соответствующих второстепенным классам. Чтобы реализовать технику передискретизации SMOTE для балансировки классов, мы можем использовать библиотеку несбалансированного обучения, в которой есть много алгоритмов для такого рода проблем. Вот как можно реализовать передискретизацию SMOTE для балансировки классов с помощью Python:
from imblearn.over_sampling import SMOTE smote = SMOTE(random_state=1000) x_, y_ = smote.fit_sample(x, y) print(x_[y_==0].shape) print(x_[y_==1].shape)
результат:
(946, 2)
(946, 2)
Резюме
И передискретизация с заменой, и передискретизация SMOTE – очень полезные методы для предотвращения дисбаланса классов в машинном обучении. Повторная выборка с методом замены используется для увеличения количества выборок, но результирующее распределение будет таким же, как значения, взятые из существующего набора. При этом, передискретизация SMOTE генерирует такое же количество выборок с учетом соседей. Надеюсь, вам понравилась эта статья о том, как избежать дисбаланса классов в машинном обучении и о реализации методов балансировки классов с использованием Python.