SMOTE для устранения дисбаланса классов с Python
Устранение дисбаланса классов в машинном обучении с помощью SMOTE
Набор данных является несбалансированным, если классы не представлены примерно одинаково. В этой статье я познакомлю вас со SMOTE в машинном обучении, и расскажу, как справиться с дисбалансом классов с помощью языка программирования Python.
Введение в дисбаланс классов
Люди делали попытки справиться с несбалансированными наборами данных в таких областях, как мошеннические телефонные звонки, управление телекоммуникациями, классификация текста и обнаружение разливов нефти на спутниковых снимках.
Производительность обычно оценивается с использованием точности прогнозирования. Однако такой подход не годится, если данные несбалансированы или стоимость различных ошибок сильно различается.
Сообщество машинного обучения подошло к проблеме несбалансированности классов двумя способами. Во-первых, на обучающие примеры следует выделить отдельные расходы. А второй – повторная выборка исходного набора данных либо путем передискретизации класса меньшинства, либо путем дополнительной выборки класса большинства.
SMOTE для устранения классового дисбаланса
Со SMOTE, мы предлагаем подход с передискретизацией, при котором класс меньшинства подвергается передискретизации путем создания «синтетических» примеров, а не путем передискретизации с заменой.
Используя SMOTE, класс меньшинства подвергается передискретизации путем взятия каждой выборки класса меньшинства и введения синтетических примеров с линейными сегментами. Например, если необходимая передискретизация составляет 200%, выбираются только два соседа из пяти ближайших соседей, и выборка создается в направлении каждого из них.
SMOTE с использованием Python
Используя SMOTE, синтетические выборки генерируются следующим образом: берем разницу между рассматриваемым вектором признаков и его ближайшим соседом. Умножаем эту разницу на случайное число от 0 до 1 и добавляем его к рассматриваемому вектору признаков.
Это вызывает выбор случайной точки на отрезке линии между двумя конкретными объектами. Такой подход фактически вынуждает класс меньшинства принимать более общие решения.
Теперь давайте посмотрим, как использовать SMOTE для устранения дисбаланса классов с помощью языка программирования Python. Я начну с импорта необходимых библиотек Python:
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from time import time from collections import Counter from imblearn.over_sampling import SMOTE from sklearn.datasets import make_classification
Теперь давайте проклассифицируем данные перед использованием SMOTE:
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, n_classes=2, weights=[0.2, 0.8], class_sep=0.95, random_state=0) plt.figure(figsize=(12, 8)) plt.title('Repartition before SMOTE') plt.scatter(X[y==1][:, 0], X[y==1][:, 1], label='class 1') plt.scatter(X[y==0][:, 0], X[y==0][:, 1], label='class 0') plt.legend() plt.grid(False) plt.show()
Теперь посмотрим, что мы получим после использования SMOTE:
smt = SMOTE() X_smote, y_smote = smt.fit_resample(X, y) plt.figure(figsize=(12, 8)) plt.title('Repartition after SMOTE') plt.scatter(X_smote[y_smote==1][:, 0], X_smote[y_smote==1][:, 1], label='class 1') plt.scatter(X_smote[y_smote==0][:, 0], X_smote[y_smote==0][:, 1], label='class 0') plt.legend() plt.grid(False) plt.show()
Надеюсь, вам понравилась эта статья о SMOTE, посвященная проблеме устранения дисбаланса классов с помощью языка программирования Python.