Прогнозирование временных рядов с помощью statsmodels и Prophet

Прогнозирование временных рядов с помощью statsmodels и Prophet

Исходный узел: 1996963
Прогнозирование временных рядов с помощью statsmodels и Prophet
Изображение на jcomp on Freepik
 

Временные ряды — это уникальный набор данных в области науки о данных. Данные записываются по частоте времени (например, ежедневно, еженедельно, ежемесячно и т. д.), и каждое наблюдение связано с другим. Данные временных рядов полезны, когда вы хотите проанализировать, что происходит с вашими данными с течением времени, и создать прогнозы на будущее. 

Прогнозирование временных рядов — это метод создания прогнозов на будущее на основе исторических данных временных рядов. Существует множество статистических методов прогнозирования временных рядов, таких как АРИМА or Экспоненциальное сглаживание.

Прогнозирование временных рядов часто встречается в бизнесе, поэтому специалисту по данным полезно знать, как разработать модель временного ряда. В этой статье мы узнаем, как прогнозировать временные ряды, используя два популярных пакета Python для прогнозирования; статмодели и Пророк. Давайте углубимся в это.

Ассоциация статистические модели Пакет Python — это пакет с открытым исходным кодом, предлагающий различные статистические модели, включая модель прогнозирования временных рядов. Давайте попробуем пакет с примером набора данных. В этой статье будет использоваться Временные ряды цифровой валюты данные из Kaggle (CC0: Public Domain). 

Давайте очистим данные и посмотрим на набор данных, который у нас есть.

import pandas as pd df = pd.read_csv('dc.csv') df = df.rename(columns = {'Unnamed: 0' : 'Time'})
df['Time'] = pd.to_datetime(df['Time'])
df = df.iloc[::-1].set_index('Time') df.head()

 

Прогнозирование временных рядов с помощью statsmodels и Prophet
 

Допустим, в нашем примере мы хотим спрогнозировать переменную close_USD. Давайте посмотрим, как данные меняются со временем.

import matplotlib.pyplot as plt plt.plot(df['close_USD'])
plt.show()

 

Прогнозирование временных рядов с помощью statsmodels и Prophet
 

Давайте построим модель прогноза на основе наших данных выше. Перед моделированием давайте разделим данные на обучающие и тестовые данные.

# Split the data
train = df.iloc[:-200] test = df.iloc[-200:]

 

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

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

from statsmodels.tsa.arima.model import ARIMA #sample parameters
model = ARIMA(train, order=(2, 1, 0)) results = model.fit() # Make predictions for the test set
forecast = results.forecast(steps=200)
forecast

 

Прогнозирование временных рядов с помощью statsmodels и Prophet
 

В нашем примере выше мы используем модель ARIMA из statsmodels в качестве модели прогнозирования и пытаемся предсказать следующие 200 дней.

Хороший ли результат модели? Попробуем их оценить. При оценке модели временных рядов обычно используется график визуализации для сравнения фактического и прогнозного показателей с регрессионными показателями, такими как средняя абсолютная ошибка (MAE), среднеквадратическая ошибка (RMSE) и MAPE (средняя абсолютная ошибка в процентах).

from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as np #mean absolute error
mae = mean_absolute_error(test, forecast) #root mean square error
mse = mean_squared_error(test, forecast)
rmse = np.sqrt(mse) #mean absolute percentage error
mape = (forecast - test).abs().div(test).mean() print(f"MAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")
print(f"MAPE: {mape:.2f}%")

 

MAE: 7956.23 RMSE: 11705.11 MAPE: 0.35%

 

Оценка выше выглядит нормально, но давайте посмотрим, как она выглядит, когда мы визуализируем ее.

plt.plot(train.index, train, label='Train')
plt.plot(test.index, test, label='Test')
plt.plot(forecast.index, forecast, label='Forecast')
plt.legend()
plt.show()

 

Прогнозирование временных рядов с помощью statsmodels и Prophet
 

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

Может быть, будет лучше, если мы попробуем использовать другую модель вне statsmodels. Давайте попробуем знаменитый пакет пророков из Facebook.

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

Давайте попробуем пакет Prophet. Во-первых, нам нужно установить пакет.

pip install prophet

 

После этого мы должны подготовить наш набор данных для обучения модели прогнозирования. У Prophet есть особое требование: столбец времени должен быть назван как «ds», а значение — как «y».

df_p = df.reset_index()[["Time", "close_USD"]].rename( columns={"Time": "ds", "close_USD": "y"}
)

 

Когда наши данные готовы, давайте попробуем создать прогноз на основе данных.

import pandas as pd
from prophet import Prophet model = Prophet() # Fit the model
model.fit(df_p) # create date to predict
future_dates = model.make_future_dataframe(periods=365) # Make predictions
predictions = model.predict(future_dates) predictions.head()

 

Прогнозирование временных рядов с помощью statsmodels и Prophet
 

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

model.plot(predictions)

 

Прогнозирование временных рядов с помощью statsmodels и Prophet
 

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

Также возможно изучить компоненты прогноза с помощью следующей функции.

model.plot_components(predictions)

 

Прогнозирование временных рядов с помощью statsmodels и Prophet
 

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

Можно ли также оценить модель Пророка? Абсолютно. Prophet включает диагностическое измерение, которое мы можем использовать: перекрестная проверка временных рядов. Метод использует часть исторических данных и каждый раз подбирает модель, используя данные вплоть до точки отсечки. Затем Пророк сравнивал предсказания с реальными. Попробуем использовать код.

from prophet.diagnostics import cross_validation, performance_metrics # Perform cross-validation with initial 365 days for the first training data and the cut-off for every 180 days. df_cv = cross_validation(model, initial='365 days', period='180 days', horizon = '365 days') # Calculate evaluation metrics
res = performance_metrics(df_cv) res

 

Прогнозирование временных рядов с помощью statsmodels и Prophet
 

В приведенном выше результате мы получили результат оценки из фактического результата по сравнению с прогнозом в каждый прогнозируемый день. Также можно визуализировать результат с помощью следующего кода.

from prophet.plot import plot_cross_validation_metric
#choose between 'mse', 'rmse', 'mae', 'mape', 'coverage' plot_cross_validation_metric(df_cv, metric= 'mape')

 

Прогнозирование временных рядов с помощью statsmodels и Prophet
 

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

Прогнозирование является одним из распространенных случаев, которые происходят в бизнесе. Одним из простых способов разработки модели прогнозирования является использование пакетов statsforecast и Prophet Python. В этой статье мы узнаем, как создать модель прогноза и оценить ее с помощью statsforecast и Prophet.
 
 
Корнелиус Юдха Виджая является помощником менеджера по науке о данных и автором данных. Работая полный рабочий день в Allianz Indonesia, он любит делиться советами по Python и данным в социальных сетях и в печатных СМИ.
 

Отметка времени:

Больше от КДнаггетс