Boosting в Машинном обучении простыми словами

Фото: 🇸🇮 Janko Ferlič / Unsplash
Фото: 🇸🇮 Janko Ferlič / Unsplash

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

XGBoost: пример

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

Бостонский датасет из напрямую доступных в 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) и, к сожалению, потерял в читаемости: теперь это набор числовых признаков без понятных названий:

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

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

  • 0 – уровень преступности на душу населения по городам;
  • 1 – доля земель под жилую застройку, зонированных под участки свыше 25 000 кв.м.;
  • 2 – доля акров неторгового бизнеса на город;
  • 3 – фиктивная переменная реки Чарльз (1, если участок граничит с рекой; 0 в противном случае);
  • 4 – концентрация оксидов азота (частей на 10 миллионов);
  • 5 – среднее количество комнат в жилом помещении;
  • 6 – доля жилых единиц, построенных до 1940 г.;
  • 7 – взвешенные расстояния до пяти центров занятости Бостона;
  • 8 – индекс доступности к радиальным магистралям;
  • 9 – полная ставка налога на имущество за 10 000 долларов США;
  • 10 – Средняя стоимость домов, занимаемых владельцами, в 1000 долларов.

Теперь разделим данные на Тренировочную (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 и в ее величине в целом.

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

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

Подари чашку кофе дата-сайентисту ↑
Подари чашку кофе дата-сайентисту ↑