Как сделать классификаторы 1-против-остальных в библиотеке XGBoost (не Sklearn)?

Вопрос или проблема

Я работаю с очень большим набором данных, который benefited от продолжения обучения с параметром xgb_model в xgb.train(). Метка (Y) самого набора данных имеет 4 класса и сильно несбалансирована, поэтому я хотел бы сгенерировать PR-кривые для каждой метки, чтобы оценить его производительность, и мне необходимо будет рассматривать каждый класс как отдельную бинарную задачу, используя классификатор один-против-всех. После множества чтений я не нашел эквивалента OneVsRestClassifier из библиотеки sklearn в библиотеке xgboost. Может ли кто-нибудь дать советы по реализации непрерывного обучения классификаторов один-против-всех с использованием библиотеки XGBoost? Заранее спасибо.

Попробуйте использовать обертку sklearn для xgboost для sklearn OneVsRestClassifier.

https://xgboost.readthedocs.io/en/latest/python/python_api.html#module-xgboost.sklearn

Если это не сработает, вы можете создать четыре разных массива меток, в которых образцы принадлежат соответствующему классу, помеченному как 1, а остальные – как 0. Затем, обучаясь на каждом из массивов меток, вы сможете получить результаты для каждого класса.

.

Ответ или решение

Реализация классификаторов "один против всех" с использованием библиотеки XGBoost

Введение

В анализе больших данных, особенно при наличии несбалансированных классов, классическое решение проблемы многоклассовой классификации – использование метода "один против всех" (One-vs-Rest, OvR) – оказывается весьма эффективным. В данном ответе будет объяснено, как реализовать OvR-классификацию с использованием библиотеки XGBoost без применения sklearn.

Подготовка данных

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

  • X: матрица признаков (features)
  • y: вектор меток классов (labels) с 4 уникальными значениями, например [0, 1, 2, 3].

Если ваш набор данных высоко несбалансирован, это может отрицательно сказаться на результате. Можете рассмотреть возможность использования методов обработки несбалансированных данных, таких как oversampling или undersampling.

Реализация 1-vs-Rest классификаторов

Предложенная методика заключается в создании отдельных бинарных задач для каждого класса. Мы будем использовать метод xgb.train() и параметр xgb_model для непрерывного обучения наших моделей.

Шаг 1: Импорт необходимых библиотек

Для начала, импортируем необходимые пакеты:

import xgboost as xgb
import numpy as np
from sklearn.metrics import precision_recall_curve

Шаг 2: Создание бинарных меток

Выделим бинарные метки для каждого класса. Для этого вам потребуется создать 4 различных массива меток:

num_classes = len(np.unique(y))
binary_labels = []

for i in range(num_classes):
    # Создаем бинарный вектор для каждого класса
    binary_y = np.where(y == i, 1, 0)
    binary_labels.append(binary_y)

Шаг 3: Настройка параметров XGBoost

Настройте параметры для обучения моделей, учитывая, что ваши данные имеют 4 класса.

params = {
    'objective': 'binary:logistic',  # Целевая функция
    'eval_metric': 'logloss',         # Метрика
    'scale_pos_weight': len(y) / np.sum(y == 1),  # Учитываем несбалансированность
}

Шаг 4: Обучение моделей

Теперь мы можем обучить отдельные модели для каждого бинарного набора меток, используя цикл:

models = []
for i in range(num_classes):
    dtrain = xgb.DMatrix(X, label=binary_labels[i])

    # Обучаем модель
    model = xgb.train(params, dtrain, num_boost_round=100)

    models.append(model)

Шаг 5: Оценка производительности

Для оценки производительности каждой модели можно использовать PR-кривые (Precision-Recall). Рассчитайте предсказания для каждого класса и визуализируйте PR-кривые:

import matplotlib.pyplot as plt

for i in range(num_classes):
    y_scores = models[i].predict(xgb.DMatrix(X))
    precision, recall, _ = precision_recall_curve(binary_labels[i], y_scores)

    plt.plot(recall, precision, lw=2, label='Класс {}'.format(i))

plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('PR кривые для 1-vs-Rest')
plt.legend(loc='best')
plt.show()

Заключение

Этот подход позволяет вам эффективно применять стратегию "один против всех" с использованием библиотеки XGBoost для многоклассовой классификации. Используя созданные модели, вы сможете производить непрерывное обучение и отслеживание производительности для каждого класса с помощью PR-кривых. Учитывайте, что в XGBoost нет прямой реализации OneVsRestClassifier, но описанная выше методика является мощным и гибким решением для достижения вашей цели.

Оцените материал
Добавить комментарий

Капча загружается...