Бустинг (Boosting) - Лена Капаца
Бустинг (Boosting) by Лена Капаца June 15, 2023 Основы

Бустинг – это метод Ансамблевого (Ensemble) обучения, при котором несколько слабых моделей объединяются для создания сильной модели. Основная идея – обучать каждую следующую модель на ошибках предыдущих моделей. Один из популярных алгоритмов бустинга - XGBoost.

XGBoost: пример

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

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import xgboost as xgb

Бостонский датасет из напрямую доступных в scikit-learn убрали из соображений конфиденциальности, однако его все же можно подгрузить с cайта Carnegie Mellon Uneversity. Мы сразу же разделим данные на Предикторы (Predictor Variable)data и Целевую переменную (Target Variable)target:

data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2] # столбец 10

Наш датасет прошел стадию Инжиниринга фичей (Feature Engineering) и, к сожалению, потерял в читаемости: теперь это набор числовых признаков без понятных названий:

Вот какие признаки кроются за числами:

Теперь разделим данные на Тренировочную (Train Data) и тестовую (Test Data) части в пропорции 8 на 2:

X, y = data, target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Обучим модель XGBoost (Extreme Gradient Boosting – "экстримальный градиентный бустинг"), которую "обернули" в название XGBRegressor в мире scikit-learn. Мы используем несколько параметров. n_estimators — число запусков модели (до определенной степени чем больше запусков, тем лучше). Снижая learning_rate, мы можем предотвратить Переобучение (Overfitting). max_depth характеризует, насколько глубокими будут Деревья решений (Decision Tree), из которых и состоит XGBoost.

model = xgb.XGBRegressor(objective ='reg:squarederror', n_estimators=100, learning_rate=0.1, max_depth=3)
model.fit(X_train, y_train)

Сгенерируем объект y_pred с предсказаниями для тестового набора и вычислим при сопоставлении с реальными метками:

y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)

Среднеквадратичная ошибка равна 7.26, что само по себе не очень показательно, хотя модель справляется лучше своих соперниц.

>>> Mean Squared Error: 7.266727280170309

В этой замечательной статье на Kaggle Prasad Perera сравнивает результативность GradientBoostingRegressor (нашей XGBRegressor) с классическим неансамблевым деревом решений (DecisionTreeRegressor), с Методом k-ближайших соседей (KNeighborsRegressor) и другими собратьями. Высокое положение оранжевого Ящика с усами (Boxplot), ответственного за XGBoost, доказывает, что модель "выиграла" у остальных в "амплитуде" MSE и в ее величине в целом.

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

© Лена Капаца. Все права защищены.