В машинном обучении работа с несбалансированными наборами данных является распространенной проблемой. Нехватка выборок классов меньшинств может привести к созданию предвзятых моделей, которые с трудом могут точно классифицировать класс меньшинства. SMOTE (метод избыточной выборки синтетического меньшинства) — это популярный метод увеличения данных, который помогает решить эту проблему путем создания синтетических выборок класса меньшинства. В этой статье мы рассмотрим различные методы применения SMOTE на примерах кода, что позволит вам повысить производительность ваших моделей на несбалансированных наборах данных.
Метод 1: SMOTE с использованием библиотеки несбалансированного обучения
Библиотека несбалансированного обучения обеспечивает простую и эффективную реализацию SMOTE. Вот пример того, как его использовать:
from imblearn.over_sampling import SMOTE
# Instantiate SMOTE
smote = SMOTE()
# Perform SMOTE on the feature matrix and target variable
X_resampled, y_resampled = smote.fit_resample(X, y)
Метод 2: SMOTE с собственной реализацией
Вы также можете реализовать SMOTE с нуля, используя NumPy и scikit-learn. Вот фрагмент кода, демонстрирующий этот подход:
import numpy as np
from sklearn.neighbors import NearestNeighbors
def smote(X, y, k_neighbors=5, oversampling_ratio=1.0):
# Find k nearest neighbors for each minority sample
knn = NearestNeighbors(n_neighbors=k_neighbors)
knn.fit(X[y == minority_class])
synthetic_samples = []
for minority_sample in X[y == minority_class]:
# Select k nearest neighbors randomly
neighbors = knn.kneighbors([minority_sample], return_distance=False)[0]
selected_neighbors = np.random.choice(neighbors, int(oversampling_ratio * len(neighbors)), replace=True)
# Generate synthetic samples
for neighbor in selected_neighbors:
alpha = np.random.random()
synthetic_sample = minority_sample + alpha * (X[neighbor] - minority_sample)
synthetic_samples.append(synthetic_sample)
# Append synthetic samples to the original dataset
X_resampled = np.concatenate((X, synthetic_samples))
y_resampled = np.concatenate((y, [minority_class] * len(synthetic_samples)))
return X_resampled, y_resampled
# Usage
X_resampled, y_resampled = smote(X, y, k_neighbors=5, oversampling_ratio=0.5)
Метод 3: адаптивная синтетическая выборка (ADASYN)
ADASYN — это расширение SMOTE, которое динамически регулирует количество синтетических выборок, генерируемых для каждой выборки меньшинства, в зависимости от уровня сложности ее обучения. Вы можете использовать библиотеку несбалансированного обучения для применения ADASYN следующим образом:
from imblearn.over_sampling import ADASYN
# Instantiate ADASYN
adasyn = ADASYN()
# Perform ADASYN on the feature matrix and target variable
X_resampled, y_resampled = adasyn.fit_resample(X, y)
В этой статье мы рассмотрели несколько методов применения SMOTE для избыточной выборки несбалансированных наборов данных. Мы рассмотрели использование библиотеки несбалансированного обучения, реализацию SMOTE с нуля и представили ADASYN как расширение SMOTE. Используя эти методы, вы можете устранить дисбаланс классов и повысить производительность ваших моделей машинного обучения. Не забывайте экспериментировать с различными подходами и точно настраивать параметры, чтобы добиться наилучших результатов для вашей конкретной проблемы.