Оценки вне пакета для градиентного бустинга

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом практическом занятии вы научитесь реализовывать классификатор градиентного бустинга с оценками out-of-bag (OOB) с использованием библиотеки scikit-learn в Python. OOB-оценки - это альтернатива оценкам методом кросс-валидации и могут быть вычислены в режиме реального времени без необходимости повторного подгонки модели. В этом практическом занятии будут рассмотрены следующие этапы:

  1. Генерация данных
  2. Подгонка классификатора с OOB-оценками
  3. Оценка оптимального числа итераций с использованием кросс-валидации
  4. Вычисление оптимального числа итераций для тестовых данных
  5. Построение графиков результатов

Советы по использованию ВМ

После запуска ВМ кликните в верхнем левом углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Генерация данных

Первым шагом является генерация некоторых примеров данных, которые мы можем использовать для обучения и тестирования нашей модели. Мы будем использовать функцию make_classification из модуля sklearn.datasets для генерации случайной задачи бинарной классификации с 3 информативными признаками.

import numpy as np
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, n_features=3, n_informative=3,
                           n_redundant=0, n_classes=2, random_state=1)

Подгонка классификатора с OOB-оценками

Далее мы создадим классификатор градиентного бустинга с OOB-оценками с использованием класса GradientBoostingClassifier из модуля sklearn.ensemble. Мы установим количество оценщиков равным 100 и скорость обучения равной 0,1.

from sklearn.ensemble import GradientBoostingClassifier

params = {
    "n_estimators": 100,
    "learning_rate": 0.1,
    "subsample": 1.0,
    "max_depth": 3,
    "min_samples_leaf": 1,
    "random_state": 1,
    "oob_score": True
}

clf = GradientBoostingClassifier(**params)
clf.fit(X, y)

Оценка оптимального числа итераций с использованием кросс-валидации

Мы можем оценить оптимальное число итераций с использованием кросс-валидации. Мы будем использовать 5-кратную кросс-валидацию и вычислять отрицательный логарифмический лосс для каждого числа итераций.

from sklearn.model_selection import cross_val_score

cv_scores = []
for i in range(1, params['n_estimators'] + 1):
    clf.set_params(n_estimators=i)
    scores = -1 * cross_val_score(clf, X, y, cv=5, scoring='neg_log_loss')
    cv_scores.append(scores.mean())

Вычисление оптимального числа итераций для тестовых данных

Мы также можем вычислить оптимальное число итераций для тестовых данных. Мы вычислим отрицательный логарифмический лосс для каждого числа итераций на тестовых данных.

from sklearn.metrics import log_loss
import matplotlib.pyplot as plt

test_scores = []
for i, y_pred in enumerate(clf.staged_predict_proba(X)):
    score = log_loss(y, y_pred)
    test_scores.append(score)

best_n_estimators = np.argmin(test_scores) + 1

Построение графиков результатов

Наконец, мы можем построить графики результатов, чтобы визуализировать производительность модели для различных чисел итераций. Мы построим график, где по оси y будет отрицательный логарифмический лосс, а по оси x - число итераций.

plt.figure(figsize=(10, 5))
plt.plot(range(1, params['n_estimators'] + 1), cv_scores, label='CV')
plt.plot(range(1, params['n_estimators'] + 1), test_scores, label='Test')
plt.axvline(x=best_n_estimators, color='red', linestyle='--')
plt.xlabel('Number of iterations')
plt.ylabel('Negative log-loss')
plt.legend()
plt.show()

Резюме

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