我正在研究一个多变量(100 多个变量)多步(t1 到 t30)预测问题,其中时间序列频率为每 1 分钟一次。该问题需要预测 100 多个变量之一作为目标。我很想知道是否可以使用 FB Prophet 的 Python API 来做到这一点。我能够以单变量方式仅使用目标变量和日期时间变量来完成它。任何帮助和方向表示赞赏。请让我知道是否需要对该问题进行任何进一步的输入或澄清。
6 回答
您可以使用add_regressor 方法在 Prophet 中添加其他变量。
例如,如果我们还想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)
predict 方法将使用附加变量进行预测:
forecast = m.predict(df_test.drop(columns="y"))
请注意,附加变量应该具有您未来(测试)数据的值。如果你没有它们,你可以从预测add1
和add2
单变量时间序列开始,然后预测y
和add_regressor
预测的add1
和add2
作为附加变量的未来值。
从文档中我了解到,y
对于 t+1 的预测将仅使用 t+1 处的add1
和add2
的值,而不是它们在 t, t-1, ..., tn 处的值,就像使用y
. 如果这对您很重要,您可以使用滞后创建新的附加变量。
另请参阅此笔记本,其中包含使用天气因素作为预测自行车使用情况的额外回归量的示例。
我很困惑,如果 Prophet 以多变量方式工作,似乎没有一致意见,请参阅此处和此处的 github 问题。从一些评论、queise 的回答和一个不错的 youtube 教程来看,您可以以某种方式解决多变量功能,请参阅此处的视频:https ://www.youtube.com/watch?v=XZhPO043lqU
要对多个因变量进行预测,您需要使用向量自动回归来实现该时间序列。
在 VAR 模型中,每个变量都是其自身过去值和所有其他变量过去值的线性函数。
有关 VAR 的更多信息,请访问https://www.analyticsvidhya.com/blog/2018/09/multivariate-time-series-guide-forecasting-modeling-python-codes/
这可能会迟到,但是如果您在 2019 年阅读本文,您可以使用 LSTM、Keras 实现多变量时间序列。
原问题的答案是肯定的!
这是特定神经先知文档的链接,其中包含如何使用多变量输入的几个示例。对于neuralprophet,这些被称为“滞后回归量”。
https://neuralprophet.com/html/lagged_covariates_energy_ercot.html
您可以使用 timemachines 包通过一行来完成此操作,该包将先知包装为功能形式。确切地说,请参见预言家溜冰者。这是一个使用示例:
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 溜冰者使用先知来预测外生变量,然后再预测您真正关心的变量。
说了这么多,我强烈建议你阅读这篇对先知的批评,并在愤怒使用它之前检查它在Elo 评级中的位置。