Что такое несбалансированное обучение? Как использовать дисбаланс-обучение для различной выборки данных. Введение в пакет Python для изучения дисбаланса.

imbalanced-learn – это пакет Python, предназначенный для решения проблемы несбалансированных наборов данных в машинном обучении. Несбалансированные наборы данных относятся к ситуациям, когда классы (категории или метки) в данных не представлены одинаково, что приводит к смещению производительности модели.

История

Как упоминалось выше, пакет Balanced-Learn был разработан для решения проблем, связанных с несбалансированными наборами данных в машинном обучении. Вот краткая история упаковки:

Происхождение. Пакет Balanced-Learn впервые был выпущен как проект с открытым исходным кодом в 2016 году. Он был разработан исследователями из Университета Бретань-Юг во Франции в рамках работы над классификацией несбалансированных данных. . Цель состояла в том, чтобы предоставить обширную библиотеку инструментов и методов для решения проблемы дисбаланса классов.

Версия 0.1. Первоначальная версия несбалансированного обучения была сосредоточена на предоставлении нескольких методов повторной выборки, включая методы передискретизации и недостаточной выборки, чтобы сбалансировать распределение классов в несбалансированных наборах данных. Он представил основные классы, такие как RandomOverSampler, RandomUnderSampler и SMOTE, которые широко используются для устранения дисбаланса классов.

Версия 0.2 и выше. В последующих версиях пакета были представлены более продвинутые методы и алгоритмы передискретизации, такие как BorderlineSMOTE, ADASYN и варианты SMOTE, такие как SVMSMOTE. Эти новые методы были направлены на улучшение качества синтетических образцов, созданных для меньшинства.

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

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

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

Доступные методы

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

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

  • Случайная избыточная выборка: случайным образом дублируются примеры из класса меньшинства, чтобы сбалансировать распределение классов.
  • SMOTE (Техника передискретизации синтетического меньшинства): создает синтетические выборки для класса меньшинства путем интерполяции между соседними экземплярами одного и того же класса.
  • BorderlineSMOTE: вариант SMOTE, который фокусируется на пограничных выборках, то есть выборках, близких к границе решения.
  • SVMSMOTE: вариант SMOTE, использующий классификатор SVM для создания синтетических образцов.
  • ADASYN (адаптивная синтетическая выборка): создает синтетические выборки для класса меньшинств на основе плотности различных классов.
  • Случайная недостаточная выборка: случайным образом удаляются примеры из класса большинства, чтобы сбалансировать распределение классов.
  • Сгруппировать центроиды: занижает выборку класса большинства путем кластеризации выборок класса большинства и сохранения только центроидов.
  • Связи Томека: удаляются образцы, образующие связи Томека, которые представляют собой пары образцов из разных классов, являющихся ближайшими соседями друг друга.
  • NearMiss: удаляет образцы из класса большинства в зависимости от их расстояния до образцов класса меньшинства.

Методы ансамбля

  • Сбалансированный классификатор случайного леса. Классификатор ансамбля, сочетающий случайные леса с методами балансировки для обработки несбалансированных наборов данных.
  • Классификатор EasyEnsemble: ансамблевый классификатор, который создает несколько сбалансированных подмножеств набора данных и обучает классификатор на каждом подмножестве.
  • Классификатор RUSBoost: ансамблевый классификатор, который сочетает в себе случайную недостаточную выборку и повышение.

Экономичное обучение

  • Сбалансированный SVC (классификатор опорных векторов): вариант SVC, который учитывает веса классов для обработки несбалансированных данных.
  • Сбалансированная логистическая регрессия: вариант логистической регрессии, в котором для балансировки классов применяются веса классов.
  • Сбалансированные деревья решений: классификаторы деревьев решений, которые включают веса классов для устранения дисбаланса классов.

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

Функции

Некоторые ключевые функции несбалансированного обучения:

imblearn.over_sampling.RandomOverSampler:
случайным образом дублирует примеры из класса меньшинства, чтобы сбалансировать распределение классов.

imblearn.over_sampling.SMOTE:
Генерирует синтетические выборки для класса меньшинства, используя метод передискретизации синтетического меньшинства (SMOTE).

imblearn.over_sampling.BorderlineSMOTE:
вариант SMOTE, который фокусируется на пограничных образцах для создания синтетических данных.

imblearn.over_sampling.SVMSMOTE:
вариант SMOTE, использующий классификатор SVM для создания синтетических образцов.

imblearn.over_sampling.ADASYN:
генерирует синтетические выборки для класса меньшинств с использованием алгоритма Adaptive Synthetic Sampling (ADASYN).

imblearn.under_sampling.RandomUnderSampler:
случайным образом удаляет примеры из большинства классов, чтобы сбалансировать распределение классов.

imblearn.under_sampling.ClusterCentroids:
неполная выборка класса большинства путем кластеризации выборок класса большинства и сохранения только центроидов.

imblearn.under_sampling.TomekLinks:
удаляет образцы, образующие ссылки Tomek, которые представляют собой пары образцов из разных классов, являющихся ближайшими соседями друг друга.

imblearn.under_sampling.NearMiss:
удаляет образцы из класса большинства в зависимости от их расстояния до примеров класса меньшинства.

imblearn.ensemble.BalancedRandomForestClassifier:
ансамблевый классификатор, сочетающий случайные леса с методами балансировки для обработки несбалансированных наборов данных.

imblearn.ensemble.EasyEnsembleClassifier:
ансамблевый классификатор, который создает несколько сбалансированных подмножеств набора данных и обучает классификатор на каждом подмножестве.

imblearn.ensemble.RUSBoostClassifier:
ансамблевый классификатор, который сочетает в себе случайную недостаточную выборку и повышение.

imblearn.metrics.geometric_mean_score:
вычисляет среднее геометрическое чувствительности (отзыва) и специфичности, показатель, подходящий для несбалансированных наборов данных.

imblearn.metrics.classification_report_imbalanced:
предоставляет модифицированную версию classification_report scikit-learn для несбалансированных наборов данных.

imblearn.combine.SMOTEENN:
комбинированный метод выборки, в котором применяются как SMOTE, так и редактируемые ближайшие соседи (ENN).

imblearn.combine.SMOTE-Tomek:
комбинированный метод выборки, который применяет удаление ссылок SMOTE и Tomek.

imblearn.under_sampling.CondensedNearestNeighbour:
метод недостаточной выборки, который выбирает только информативные выборки из класса большинства.

Монтаж

imbalanced-learn в настоящее время доступен в репозиториях PyPi, и вы можете установить его через pip:

pip install -U imbalanced-learn

Пакет выпущен также на платформе Anaconda Cloud:

conda install -c conda-forge imbalanced-learn

Пример

В этом примере мы увидим различное использование параметра sample_strategy для разных семейств сэмплеров (т. е. избыточная выборка, недостаточная выборка или методы очистки).

Создать несбалансированный набор данных

Во-первых, мы создадим несбалансированный набор данных из набора данных радужной оболочки.

from sklearn.datasets import load_iris

from imblearn.datasets import make_imbalance

iris = load_iris(as_frame=True)

sampling_strategy = {0: 10, 1: 20, 2: 47}
X, y = make_imbalance(iris.data, iris.target, sampling_strategy=sampling_strategy)

Заговор

import matplotlib.pyplot as plt

fig, axs = plt.subplots(ncols=2, figsize=(10, 5))
autopct = "%.2f"
iris.target.value_counts().plot.pie(autopct=autopct, ax=axs[0])
axs[0].set_title("Original")
y.value_counts().plot.pie(autopct=autopct, ax=axs[1])
axs[1].set_title("Imbalanced")
fig.tight_layout()

Использование sampling_strategy в алгоритмах передискретизации

sample_strategy может быть задано с плавающей запятой.

import numpy as np

# select only 2 classes since the ratio make sense in this case
binary_mask = np.bitwise_or(y == 0, y == 2)
binary_y = y[binary_mask]
binary_X = X[binary_mask]

from imblearn.under_sampling import RandomUnderSampler

sampling_strategy = 0.8
rus = RandomUnderSampler(sampling_strategy=sampling_strategy)
X_res, y_res = rus.fit_resample(binary_X, binary_y)
ax = y_res.value_counts().plot.pie(autopct=autopct)
_ = ax.set_title("Under-sampling")

Для методов избыточной выборки

from imblearn.over_sampling import RandomOverSampler

ros = RandomOverSampler(sampling_strategy=sampling_strategy)
X_res, y_res = ros.fit_resample(binary_X, binary_y)
ax = y_res.value_counts().plot.pie(autopct=autopct)
_ = ax.set_title("Over-sampling")

sample_strategy как str

sample_strategy может быть задан как строка, указывающая класс, на который нацелена повторная выборка.

sampling_strategy = "not minority"

fig, axs = plt.subplots(ncols=2, figsize=(10, 5))
rus = RandomUnderSampler(sampling_strategy=sampling_strategy)
X_res, y_res = rus.fit_resample(X, y)
y_res.value_counts().plot.pie(autopct=autopct, ax=axs[0])
axs[0].set_title("Under-sampling")

sampling_strategy = "not majority"
ros = RandomOverSampler(sampling_strategy=sampling_strategy)
X_res, y_res = ros.fit_resample(X, y)
y_res.value_counts().plot.pie(autopct=autopct, ax=axs[1])
_ = axs[1].set_title("Over-sampling")

С методом очистки,

from imblearn.under_sampling import TomekLinks

sampling_strategy = "not minority"
tl = TomekLinks(sampling_strategy=sampling_strategy)
X_res, y_res = tl.fit_resample(X, y)
ax = y_res.value_counts().plot.pie(autopct=autopct)
_ = ax.set_title("Cleaning")

sampling_strategy as a dict

Когда sample_strategy является словарем, ключи соответствуют целевым классам. Значения соответствуют желаемому количеству выборок для каждого целевого класса.

fig, axs = plt.subplots(ncols=2, figsize=(10, 5))

sampling_strategy = {0: 10, 1: 15, 2: 20}
rus = RandomUnderSampler(sampling_strategy=sampling_strategy)
X_res, y_res = rus.fit_resample(X, y)
y_res.value_counts().plot.pie(autopct=autopct, ax=axs[0])
axs[0].set_title("Under-sampling")

sampling_strategy = {0: 25, 1: 35, 2: 47}
ros = RandomOverSampler(sampling_strategy=sampling_strategy)
X_res, y_res = ros.fit_resample(X, y)
y_res.value_counts().plot.pie(autopct=autopct, ax=axs[1])
_ = axs[1].set_title("Under-sampling")

sampling_strategy as a list

Когда sample_strategy представляет собой список, этот список содержит целевые классы.

sampling_strategy = [0, 1, 2]
tl = TomekLinks(sampling_strategy=sampling_strategy)
X_res, y_res = tl.fit_resample(X, y)
ax = y_res.value_counts().plot.pie(autopct=autopct)
_ = ax.set_title("Cleaning")

sample_strategy как вызываемый

При вызове функция принимает y и возвращает dict.

def ratio_multiplier(y):
    from collections import Counter

    multiplier = {1: 0.7, 2: 0.95}
    target_stats = Counter(y)
    for key, value in target_stats.items():
        if key in multiplier:
            target_stats[key] = int(value * multiplier[key])
    return target_stats


X_res, y_res = RandomUnderSampler(sampling_strategy=ratio_multiplier).fit_resample(X, y)
ax = y_res.value_counts().plot.pie(autopct=autopct)
ax.set_title("Under-sampling")
plt.show()

— — —

Почему несбалансированный набор данных был приглашен всем сторонам?

Потому что он всегда брал с собой группу друзей, чтобы сбалансировать ситуацию и убедиться, что все хорошо проводят время!

🙂🙂🙂