XGBoost в машинном обучении
XGBoost или Gradient Boosting – это алгоритм машинного обучения, который проходит циклы для итеративного добавления моделей в набор. В этой статье я познакомлю вас с алгоритмом XGBoost в машинном обучении.
Цикл алгоритма XGBoost начинается с инициализации всего с помощью уникальной модели, прогнозы которой могут быть довольно простыми.
Процесс алгоритма XGBoost:
- Во-первых, мы используем текущий набор для создания прогнозов для каждого наблюдения в наборе данных. Чтобы сделать прогноз, мы добавляем прогнозы всех моделей в набор.
- Эти прогнозы используются для вычисления функции потерь.
- Затем мы используем функцию потерь, чтобы соответствовать новой модели, которая будет добавлена в набор. В частности, мы определяем параметры модели так, чтобы добавление этой новой модели к набору уменьшало потери.
- Наконец, мы добавляем новую модель в набор и…
- затем снова повторяем описанные выше действия!
Алгоритм XGBoost в действии
Я начну с загрузки данных обучения и проверки в X_train, X_valid, y_train и y_valid. Набор данных, который я использую здесь, можно легко скачать отсюда.
import pandas as pd from sklearn.model_selection import train_test_split # Read the data data = pd.read_csv('melb_data.csv') # Select subset of predictors cols_to_use = ['Rooms', 'Distance', 'Landsize', 'BuildingArea', 'YearBuilt'] X = data[cols_to_use] # Select target y = data.Price # Separate data into training and validation sets X_train, X_valid, y_train, y_valid = train_test_split(X, y)
Теперь вы узнаете, как использовать алгоритм XGBoost. Здесь нам нужно импортировать API scikit-learn для XGBoost (xgboost.XGBRegressor). Это позволяет нам создавать и настраивать модель, как в scikit-learn. Как вы увидите в выходных данных, класс XGBRegressor имеет множество настраиваемых параметров:
from xgboost import XGBRegressor my_model = XGBRegressor() my_model.fit(X_train, y_train)
Результат:
XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
colsample_bynode=1, colsample_bytree=1, gamma=0,
importance_type='gain', learning_rate=0.1, max_delta_step=0,
max_depth=3, min_child_weight=1, missing=None, n_estimators=100,
n_jobs=1, nthread=None, objective='reg:linear', random_state=0,
reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
silent=None, subsample=1, verbosity=1)
Теперь нам нужно сделать прогнозы и оценить нашу модель:
from sklearn.metrics import mean_absolute_error predictions = my_model.predict(X_valid) print("Mean Absolute Error: " + str(mean_absolute_error(predictions, y_valid)))
Результат:
Mean Absolute Error: 280355.04334039026
Настройка параметров
XGBoost имеет несколько функций, которые могут существенно повлиять на точность и скорость обучения. Первое, что вам нужно понять:
n_estimators
n_estimators указывает количество раз, когда нужно пропустить цикл моделирования, описанный выше. Это равно количеству моделей, которые мы включаем в набор.
- Слишком низкое значение приводит к недостаточной подгонке, что приводит к неточным прогнозам на основе данных обучения и данных тестирования.
- Слишком высокое значение приводит к переобучению, что приводит к точным предсказаниям по обучающим данным, но неточным предсказаниям по тестовым данным (что для нас важно).
Обычно значения лежат в диапазоне от 100 до 1000, хотя все во многом зависит от параметра learning_rate, описанного ниже. Вот код для установки количества моделей в наборе:
my_model = XGBRegressor(n_estimators=500) my_model.fit(X_train, y_train)
Результат:
XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
colsample_bynode=1, colsample_bytree=1, gamma=0,
importance_type='gain', learning_rate=0.1, max_delta_step=0,
max_depth=3, min_child_weight=1, missing=None, n_estimators=500,
n_jobs=1, nthread=None, objective='reg:linear', random_state=0,
reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
silent=None, subsample=1, verbosity=1)
early_stopping_rounds
early_stopping_rounds позволяет автоматически находить идеальное значение для n_estimators. Ранняя остановка приводит к остановке итерации модели, когда оценка валидации перестает улучшаться, даже если мы не сильно останавливаемся для n_estimators. Рекомендуется установить высокое значение n_estimators, а затем использовать early_stopping_rounds, чтобы найти оптимальное время для остановки итерации.
Поскольку случайная вероятность иногда приводит к единственному раунду, в котором оценки проверки не улучшаются, вы должны указать число для количества ходов прямого ухудшения, которое необходимо разрешить, прежде чем останавливаться. Установка Early_stopping_rounds = 5 – разумный выбор. В этом случае мы останавливаемся после 5 последовательных раундов ухудшения оценок валидации. Теперь давайте посмотрим, как можно использовать Early_stopping:
my_model = XGBRegressor(n_estimators=500) my_model.fit(X_train, y_train, early_stopping_rounds=5, eval_set=[(X_valid, y_valid)], verbose=False)
Результат:
XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
colsample_bynode=1, colsample_bytree=1, gamma=0,
importance_type='gain', learning_rate=0.1, max_delta_step=0,
max_depth=3, min_child_weight=1, missing=None, n_estimators=500,
n_jobs=1, nthread=None, objective='reg:linear', random_state=0,
reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
silent=None, subsample=1, verbosity=1)
learning_rate
Вместо того, чтобы получать общие прогнозы, просто складывая прогнозы каждой компонентной модели, мы можем умножить прогнозы каждой модели на небольшое число перед их сложением.
Это означает, что каждое дерево, которое мы добавляем в набор, помогает нам меньше. Таким образом, мы можем установить высокое значение для n_estimators без переобучения. Если мы используем раннее отключение, соответствующее количество деревьев будет определено автоматически. Теперь давайте посмотрим, как мы можем использовать learning_rate в алгоритме XGBoost:
my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05) my_model.fit(X_train, y_train, early_stopping_rounds=5, eval_set=[(X_valid, y_valid)], verbose=False)
Результат:
XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
colsample_bynode=1, colsample_bytree=1, gamma=0,
importance_type='gain', learning_rate=0.05, max_delta_step=0,
max_depth=3, min_child_weight=1, missing=None, n_estimators=1000,
n_jobs=1, nthread=None, objective='reg:linear', random_state=0,
reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
silent=None, subsample=1, verbosity=1)
n_jobs
В больших наборах данных, где исполнение является важным фактором, вы можете использовать параллелизм для быстрого построения моделей. Обычно параметр n_jobs устанавливается равным количеству ядер на вашем компьютере. Для небольших наборов данных это не поможет.
Получившаяся модель будет не лучше, поэтому микрооптимизация времени подгонки обычно просто отвлекает. Но она очень полезна в больших наборах данных, где вы потратите много времени на ожидание команды соответствия. Теперь давайте посмотрим, как использовать этот параметр в алгоритме XGBoost:
my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05, n_jobs=4) my_model.fit(X_train, y_train, early_stopping_rounds=5, eval_set=[(X_valid, y_valid)], verbose=False)
Результат:
XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
colsample_bynode=1, colsample_bytree=1, gamma=0,
importance_type='gain', learning_rate=0.05, max_delta_step=0,
max_depth=3, min_child_weight=1, missing=None, n_estimators=1000,
n_jobs=4, nthread=None, objective='reg:linear', random_state=0,
reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
silent=None, subsample=1, verbosity=1)
XGBoost – ведущая программная библиотека для работы со стандартными табличными данными с тонкой настройкой параметров, с помощью которой вы можете обучать очень точные модели. Надеюсь, вам понравилась эта статья об алгоритме XGBoost в машинном обучении.