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