Что такое несбалансированное обучение? Как использовать дисбаланс-обучение для различной выборки данных. Введение в пакет 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()
— — —
Почему несбалансированный набор данных был приглашен всем сторонам?
Потому что он всегда брал с собой группу друзей, чтобы сбалансировать ситуацию и убедиться, что все хорошо проводят время!
🙂🙂🙂