Некоторые из пакетов временных рядов, которые вы могли бы добавить в свой арсенал

Прогнозирование временных рядов — это метод в области статистики для анализа исторических данных с временным компонентом и создания прогноза на его основе.

Некоторыми классическими примерами методов прогнозирования временных рядов являются скользящее среднее, ARIMA и экспоненциальное сглаживание. Эти методы использовались в течение длительного времени и до сих пор полезны из-за того, насколько легко пользователям объяснить результат, хотя и с менее точным предсказанием.

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

Нужен ли вам классический подход или модель, основанная на машинном обучении, многие разработали пакеты Python для доступа ко всем этим методам. Некоторые из известных пакетов — Statsmodel, pmdarima и sktime. Однако модель прогнозирования не ограничивается только теми, которые я перечислил выше, потому что многие отличные пакеты заслуживают внимания.

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

1. СтатистикаПрогноз

StatsForecast — это пакет Python, который предоставляет набор одномерных моделей прогнозирования временных рядов. Уникальность StatsForecast заключается в том, что модель обеспечивает быстрое обучение и оптимизирована для высокоточных моделей. Кроме того, пакет предлагает несколько тестов, которые мы могли бы использовать при обучении различных моделей.

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

pip install statsforecast

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

from statsforecast.utils import generate_series
synthetic_panel = generate_series(n_series=1, freq = 'M')
synthetic_panel.head()

Набор данных содержит функцию даты («ds») и числовые функции, которые мы хотим спрогнозировать («y»). Кроме того, индекс имеет индекс «unique_id», который улучшит скорость обучения в соответствии с StatsForecast.

Затем я бы разделил набор данных на обучающие и тестовые данные. Я бы взял последние 6 наблюдений за тестовые данные, а остальные были назначены в качестве обучающих данных.

Y_train_df = synthetic_panel[:-6]
Y_test_df = synthetic_panel[-6:]

Когда набор данных будет готов, мы можем попытаться разработать нашу модель прогнозирования. Первым шагом является импорт модели, которую мы хотим использовать. В нашем примере мы будем использовать AutoARIMA (модель ARIMA с автоматическим обучением параметров) и экспоненциальное сглаживание (ETS).

from statsforecast import StatsForecast
from statsforecast.models import AutoARIMA, ETS

Затем мы настроим модель и передадим ей несколько параметров. Параметр, который мы передаем, — это продолжительность сезона (используя 12 из-за 12 месяцев в году) и модель «ЗМЗ» для ETS для оптимальной настройки модели. Кроме того, я установил переменную горизонта как длину нашего прогноза.

season_length = 12
horizon = len(Y_test_df)
models = [
AutoARIMA(season_length=season_length),
ETS(season_length=season_length, model='ZMZ')
]
model = StatsForecast(
df=Y_train_df,
models=models,
freq='M',
n_jobs=-1)

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

%time
Y_hat_df = model.forecast(horizon).reset_index()
Y_hat_df.head()

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

fig, ax = plt.subplots(1, 1, figsize = (20, 7))
Y_hat_df = Y_test_df.merge(Y_hat_df, how='left', on=['unique_id', 'ds'])
plot_df = pd.concat([Y_train_df, Y_hat_df]).set_index('ds')
plot_df[['y', 'AutoARIMA', 'ETS']].plot(ax=ax, linewidth=2)
ax.set_title('Forecast Synthetic Data', fontsize=22)
ax.set_ylabel('Number', fontsize=20)
ax.set_xlabel('Timestamp [t]', fontsize=20)
ax.legend(prop={'size': 15})
ax.grid()

Как видно из изображения выше, шаблон данных прогноза достаточно близок к фактическим данным. Оба предсказания приводят к предсказаниям, которые пересекаются с основной истиной.

Есть так много моделей, которые вы можете примерить с помощью StatsForecast; Предлагаю вам зайти на эту страницу.

2. ПьяФ

PyAF или Python Automatic Forecasting — это пакет Python с открытым исходным кодом для автоматической разработки моделей прогнозирования временных рядов (одномерных или с экзогенными данными). Модель была построена на основе Scikit-Learn и Pandas, поэтому ожидайте знакомые API. Пакет также предлагает различные модели для максимально возможного использования в нескольких линиях.

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

pip install pyaf

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

horizon = len(Y_test_df)
import pyaf.ForecastEngine as autof
#set up the model engine
lEngine = autof.cForecastEngine()
# get the best time series model for test prediction
lEngine.train(iInputDS = Y_train_df, iTime = 'ds', iSignal = 'y', iHorizon = horizon)

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

forecast_df= lEngine.forecast(Y_train_df, horizon)

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

Давайте соберем только критическую информацию и сравним ее визуально.

forecast_df.plot.line('ds', ['y' , 'y_Forecast','y_Forecast_Lower_Bound', 'y_Forecast_Upper_Bound'], grid = True, figsize=(12, 8))

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

3. Нейронный пророк

NeuralProphet — это пакет Python для разработки модели временных рядов на основе Facebook Prophet, но с архитектурой нейронной сети. Пакет основан на PyTorch и может быть легко использован с минимальным количеством строк.

Начнем с установки пакета.

pip install neuralprophet

Если вам нужна интерактивная визуализация в Jupyter Notebook, мы можем установить ее, используя следующий код.

pip install neuralprophet[live]

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

train = Y_train_df.reset_index(drop = True)
test = Y_test_df.reset_index(drop = True)

Затем мы инициируем модель Neural Prophet.

from neuralprophet import NeuralProphet
m = NeuralProphet()

Затем мы будем обучать модель, используя следующий код.

metrics = m.fit(train, freq='M', validation_df=Y_test_df, progress='plot')

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

metrics.tail(1)

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

forecast = m.predict(train)
fig = m.plot(forecast)

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

forecast = m.predict(test)
m = m.highlight_nth_step_ahead_of_each_forecast(1)
fig = m.plot(forecast)

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

Как и в случае с Prophet, мы могли бы получить компонент NeuralProphet Forecast, используя следующий код.

fig_param = m.plot_parameters()

Разложение покажет тенденцию и сезонность наших тренировочных данных, что также имеет решающее значение для нашего понимания.

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

Заключение

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

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

  1. СтатистикаПрогноз
  2. ПйАФ
  3. NeuralProphet

Я надеюсь, что это помогает!

Заходите ко мне в Социальные сети, чтобы обсудить более подробно или задать вопросы.

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