是否可以使用FB Prophet进行多变量多步预测?

时间:2019-02-05 22:54:42

标签: python machine-learning time-series forecasting facebook-prophet

我正在研究一个多变量(100多个变量)多步(t1至t30)预测问题,其中时间序列频率是每1分钟一次。问题需要预测100多个变量之一作为目标。 我很想知道是否可以使用FB Prophet的Python API做到这一点。我能够仅使用目标变量和日期时间变量以单变量方式进行操作。任何帮助和指导表示赞赏。请让我知道在这个问题上是否需要任何进一步的输入或澄清。

5 个答案:

答案 0 :(得分:2)

您可以使用add_regressor method在先知中添加其他变量。

例如,如果我们想同时使用附加变量yadd1的值来预测变量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"))

请注意,其他变量应具有用于您将来(测试)数据的值。如果没有它们,则可以从使用单变量时间序列预测add1add2开始,然后通过y和预测的add_regressor预测add1add2作为附加变量的将来值。

从文档中我了解到,对于t + 1的y的预测将仅使用t + 1处的add1add2的值,而不使用t处的值, t-1,...,tn就像处理y一样。如果这对您很重要,则可以使用滞后时间创建新的其他变量。

另请参阅this notebook,并举例说明在自行车使用量预测中使用天气因素作为额外的回归指标。

答案 1 :(得分:1)

这可能已经晚了,但是,如果您在2019年阅读此书,则可以使用LSTM Keras实施多元时间序列。

答案 2 :(得分:0)

要对多个因变量进行预测,您需要使用向量自动回归实现该时间序列。

在VAR模型中,每个变量都是其自身的过去值和所有其他变量的过去值的线性函数。

有关VAR的更多信息,请访问https://www.analyticsvidhya.com/blog/2018/09/multivariate-time-series-guide-forecasting-modeling-python-codes/

答案 3 :(得分:0)

我很困惑,如果先知以多变量方式工作似乎没有共识,请参见github问题herehere。根据一些评论,询问的答案以及一个不错的youtube教程,您可以以某种方式解决多变量功能,请参见此处的视频:https://www.youtube.com/watch?v=XZhPO043lqU

答案 4 :(得分:0)

您可以使用 timemachines 包在一行代码中完成此操作,该包以函数形式包装了 prophet。请参阅 prophet skaters 以准确。下面是一个使用示例:

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 参数)。它并没有真正解决多变量预测问题。但是你可以使用名为 _recursive 的 facebook skater,在它预测你真正关心的变量之前,先使用先知来预测外生变量。

说了这么多,我强烈建议你阅读先知的critique,并在愤怒使用它之前检查它在Elo ratings上的位置。