Можно ли делать многомерное многоступенчатое прогнозирование с помощью FB Prophet?

Я работаю над многомерной (более 100 переменных) многоступенчатой ​​(от t1 до t30) задачей прогнозирования, где частота временных рядов составляет каждую 1 минуту. Задача требует спрогнозировать одну из более чем 100 переменных в качестве цели. Мне интересно узнать, можно ли это сделать с помощью Python API FB Prophet. Я смог сделать это одномерным способом, используя только целевую переменную и переменную datetime. Любая помощь и направление приветствуются. Пожалуйста, дайте мне знать, нужны ли какие-либо дополнительные комментарии или пояснения по этому вопросу.


person Abhishek Arora    schedule 05.02.2019    source источник


Ответы (5)


Вы можете добавить дополнительные переменные в Prophet с помощью метода add_regressor .

Например, если мы хотим предсказать переменную y, используя также значения дополнительных переменных add1 и add2.

Давайте сначала создадим образец df:

import pandas as pd
df = pd.DataFrame(pd.date_range(start="2019-09-01", end="2019-09-30", freq='D', name='ds'))
df["y"] = range(1,31)
df["add1"] = range(101,131)
df["add2"] = range(201,231)
df.head()
            ds  y   add1 add2
0   2019-09-01  1   101 201
1   2019-09-02  2   102 202
2   2019-09-03  3   103 203
3   2019-09-04  4   104 204
4   2019-09-05  5   105 205

и разделить поезд и тест:

df_train = df.loc[df["ds"]<"2019-09-21"]
df_test  = df.loc[df["ds"]>="2019-09-21"]

Перед обучением прогнозиста мы можем добавить регрессоры, использующие дополнительные переменные. Здесь аргумент add_regressor - это имя столбца дополнительной переменной в обучающей df.

from fbprophet import Prophet
m = Prophet()
m.add_regressor('add1')
m.add_regressor('add2')
m.fit(df_train)

Затем метод прогнозирования будет использовать дополнительные переменные для прогнозирования:

forecast = m.predict(df_test.drop(columns="y"))

Обратите внимание, что дополнительные переменные должны иметь значения для ваших будущих (тестовых) данных. Если у вас их нет, вы можете начать с прогнозирования add1 и add2 с помощью одномерных временных рядов, а затем прогнозировать y с add_regressor и прогнозируемыми add1 и add2 в качестве будущих значений дополнительных переменных.

Из документации я понимаю, что прогноз y для t + 1 будет использовать только значения add1 и add2 в t + 1, а не их значения в t, t-1, ..., t-n, как это делается с y. Если это важно для вас, вы можете создать новые дополнительные переменные с лагами.

См. Также этот блокнот с примером использование погодных факторов в качестве дополнительных регрессоров в прогнозе использования велосипедов.

person queise    schedule 09.11.2019
comment
Спасибо. Это действительно полезно. Однако у меня есть вопрос по этому поводу. Я выполнил твои инструкции. И использовал Train_Test_Split для создания данных Train Test и заметил, что он взял случайные данные из всех данных, включая последнюю строку. Я намеревался спрогнозировать вторую половину набора данных ... Было бы это хорошим способом сделать прогноз. Или мне следует разбить данные по индексам ..... @queise - person John Doe; 04.04.2020

Я запутался, похоже, нет согласия, работает ли Prophet многовариантным образом, см. Проблемы с github здесь и здесь. Судя по некоторым комментариям, ответу queise и хорошему руководству по YouTube, вы можете каким-то образом обойти многомерную функциональность, см. Видео здесь: https://www.youtube.com/watch?v=XZhPO043lqU

person NeStack    schedule 30.09.2020

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

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

для получения дополнительной информации о VAR перейдите на https://www.analyticsvidhya.com/blog/2018/09/multivariate-time-series-guide-forecasting-modeling-python-codes/

person Zeeshan    schedule 08.02.2019

Это может быть поздно, однако, если вы читаете это в 2019 году, вы можете реализовать многомерные временные ряды, используя LSTM, Keras.

person Riyaj    schedule 07.09.2019

Вы можете сделать это одной строкой, используя пакет timemachines, который обертывает prophet в функциональной форме. Чтобы быть точным, см. пророк фигуристов. Вот пример использования:

from timemachines.skatertools.data import hospital_with_exog
from timemachines.skatertools.visualization.priorplot import prior_plot
import matplotlib.pyplot as plt
k = 11
y, a = hospital_with_exog(k=k, n=450, offset=True)
f = fbprophet_exogenous
err2 = prior_plot(f=f, k=k, y=y, n=450, n_plot=50)
print(err2)
plt.show()

Обратите внимание, что вы можете установить k как угодно. Это количество шагов вперед, которые нужно использовать. Теперь будьте осторожны, потому что, когда пророк говорит о многомерном, они на самом деле ссылаются на заранее известные переменные (аргумент a). На самом деле он не касается многомерного прогнозирования. Но вы можете использовать скейтер facebook под названием _recursive, чтобы использовать prophet для предсказания экзогенных переменных, прежде чем он предсказывает ту, которая вам действительно небезразлична.

Сказав все это, я настоятельно рекомендую вам прочитать этот критический анализ пророка, а также проверить его позицию. на рейтингах Эло, прежде чем использовать его в гневе.

person Peter Cotton    schedule 04.05.2021