Использование XGBoost для прогнозирования временных рядов

Использование XGBoost для прогнозирования временных рядов

XGBoost (eXtreme Gradient Boosting) – это открытый алгоритм, который реализует градиентный бустинг деревьев с дополнительными улучшениями для более высокой производительности и скорости работы. Быстрая способность алгоритма делать точные прогнозы делает его предпочтительной моделью для многих соревнований, таких как соревнование Kaggle.

Основные применения XGBoost – это предсказание классификации, такое как обнаружение мошенничества, или предсказание регрессии, такое как предсказание стоимости жилья. Однако расширение алгоритма XGBoost для прогнозирования временных рядов также возможно. Как это работает? Давайте рассмотрим это подробнее.

 

Прогнозирование временных рядов

 

Прогнозирование в области науки о данных и машинного обучения – это методика, используемая для предсказания будущих числовых значений на основе исторических данных, собранных с течением времени, либо в регулярных, либо в нерегулярных интервалах.

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

Давайте рассмотрим пример временных рядов – ежедневные климатические данные из Kaggle.

import pandas as pd

train = pd.read_csv('DailyDelhiClimateTrain.csv')
test = pd.read_csv('DailyDelhiClimateTest.csv')

train.head()

 

 

Если мы посмотрим на приведенную выше таблицу, каждый признак записывается ежедневно. Столбец “дата” указывает, когда были собраны данные, и каждое наблюдение связано друг с другом.

Прогноз временных рядов часто включает в себя тренд, сезонность и другие закономерности из данных для создания прогноза. Один из простых способов рассмотреть закономерность – это визуализировать их. Например, я визуализирую данные о средней температуре из нашего примера набора данных. 

train["date"] = pd.to_datetime(train["date"])
test["date"] = pd.to_datetime(test["date"])

train = train.set_index("date")
test = test.set_index("date")

train["meantemp"].plot(style="k", figsize=(10, 5), label="train")
test["meantemp"].plot(style="b", figsize=(10, 5), label="test")
plt.title("Mean Temperature Dehli Data")
plt.legend()

 

 

На графике выше легко видеть, что каждый год имеет общую сезонность. Используя эту информацию, мы можем понять, как работают наши данные, и решить, какая модель может подойти для нашей прогностической модели.

Типичные модели прогнозирования включают ARIMA, Vector AutoRegression, Exponential Smoothing и Prophet. Однако мы также можем использовать XGBoost для прогнозирования.

 

Прогнозирование с помощью XGBoost

 

Перед тем, как начать прогнозирование с использованием XGBoost, мы должны сначала установить пакет.

pip install xgboost

 

После установки мы готовим данные для обучения нашей модели. В теории прогнозирование с использованием XGBoost будет основываться на модели регрессии на основе одного или нескольких признаков для прогнозирования будущих числовых значений. Поэтому данные для обучения также должны быть в числовых значениях. Кроме того, чтобы учесть движение времени в нашей модели XGBoost, мы преобразуем временные данные в несколько числовых признаков.

Давайте начнем с создания функции для создания числовых признаков из даты.

def create_time_feature(df):
    df['dayofmonth'] = df['date'].dt.day
    df['dayofweek'] = df['date'].dt.dayofweek
    df['quarter'] = df['date'].dt.quarter
    df['month'] = df['date'].dt.month
    df['year'] = df['date'].dt.year
    df['dayofyear'] = df['date'].dt.dayofyear
    df['weekofyear'] = df['date'].dt.weekofyear
    return df

 

Затем мы применим эту функцию к обучающим и тестовым данным.

train = create_time_feature(train)
test = create_time_feature(test)

train.head()

Требуемая информация теперь полностью доступна. Далее мы определим, что мы хотим предсказать. В этом примере мы прогнозируем среднюю температуру и создаем обучающие данные на основе вышеуказанных данных.

X_train = train.drop('meantemp', axis =1)
y_train = train['meantemp']

X_test = test.drop('meantemp', axis =1)
y_test = test['meantemp']

Я бы все еще использовал другую информацию, такую как влажность, чтобы показать, что XGBoost также может прогнозировать значения с использованием многомерных подходов. Однако на практике мы включаем только данные, которые мы знаем, когда пытаемся сделать прогноз.

Начнем процесс обучения, подгоняя данные в модель. Для данного примера мы не будем делать много оптимизации гиперпараметров, кроме количества деревьев.

import xgboost as xgb

reg = xgb.XGBRegressor(n_estimators=1000)
reg.fit(X_train, y_train, verbose = False)

После процесса обучения давайте посмотрим на важность признаков модели.

xgb.plot_importance(reg)

Три начальных признака, конечно же, полезны для прогнозирования, но временные признаки также вносят свой вклад в прогноз. Давайте попробуем сделать прогноз на тестовых данных и визуализировать их.

test['meantemp_Prediction'] = reg.predict(X_test)

train['meantemp'].plot(style='k', figsize=(10,5), label = 'train')
test['meantemp'].plot(style='b', figsize=(10,5), label = 'test')
test['meantemp_Prediction'].plot(style='r', figsize=(10,5), label = 'prediction')
plt.title('Mean Temperature Dehli Data')
plt.legend()

Как видно из графика выше, прогноз может показаться немного неточным, но все же следует общему тренду. Давайте попробуем оценить модель на основе метрик ошибки.

from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_absolute_percentage_error

print('RMSE: ', round(mean_squared_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))
print('MAE: ', round(mean_absolute_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))
print('MAPE: ', round(mean_absolute_percentage_error(y_true=test['meantemp'],y_pred=test['meantemp_Prediction']),3))

RMSE: 11.514

MAE: 2.655

MAPE: 0.133

Результат показывает, что наш прогноз может иметь ошибку около 13%, а RMSE также показывает небольшую ошибку в прогнозе. Модель можно улучшить с помощью оптимизации гиперпараметров, но мы узнали, как использовать XGBoost для прогнозирования.

Заключение

XGBoost – это алгоритм с открытым исходным кодом, часто используемый для многих задач науки о данных и в соревнованиях Kaggle. Часто встречаются такие случаи использования, как обнаружение мошенничества или прогнозирование цен на жилье, но XGBoost также может быть применен к прогнозированию временных рядов. Используя регрессор XGBoost, мы можем создать модель, способную прогнозировать будущие числовые значения. Cornellius Yudha Wijaya – помощник руководителя по науке о данных и писатель данных. В свободное время, работая на полную ставку в Allianz Indonesia, он любит делиться советами по Python и данным через социальные сети и печатные издания.