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

Posted

技术标签:

【中文标题】是否可以使用 FB Prophet 进行多元多步预测?【英文标题】:Is it possible to do multivariate multi-step forecasting using FB Prophet? 【发布时间】:2019-06-29 20:31:01 【问题描述】:

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

【问题讨论】:

原问题的答案是肯定的!这是特定神经先知文档的链接,其中包含如何使用多变量输入的几个示例。对于神经先知,这些被称为“滞后回归量”。 neuralprophet.com/html/lagged_covariates_energy_ercot.html 你也可以使用'future regressors'neuralprophet.com/html/future-regressors.html 【参考方案1】:

原问题的答案是肯定的!

这里是特定神经先知文档的链接,其中包含如何使用多变量输入的几个示例。对于神经先知,这些被称为“滞后回归量”。

https://neuralprophet.com/html/lagged_covariates_energy_ercot.html

【讨论】:

【参考方案2】:

您可以使用 timemachines 包通过一行来完成此操作,该包将先知包装成一种功能形式。确切地说,请参阅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 滑板,在它预测出你真正关心的变量之前,使用先知来预测外生变量。

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

【讨论】:

【参考方案3】:

我很困惑,如果 Prophet 以多变量方式工作,似乎没有协议,请参阅 github 问题 here 和 here。从一些 cmets、queise 的回答和一个不错的 youtube 教程来看,您可以以某种方式解决多变量功能,请参阅此处的视频:https://www.youtube.com/watch?v=XZhPO043lqU

【讨论】:

目标时间序列是单变量的,但你可以使用多个回归器【参考方案4】:

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

例如,如果我们想同时使用附加变量 add1add2 的值来预测变量 y

让我们首先创建一个示例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"))

请注意,附加变量应该具有您未来(测试)数据的值。如果你没有它们,你可以先用单变量时间序列预测add1add2,然后用add_regressor 预测y 和预测的add1add2 作为附加的未来值变量。

根据文档,我了解到y 对 t+1 的预测将仅使用 add1add2 在 t+1 的值,而不是它们在 t、t-1、.. ., 和y 一样。如果这对您很重要,您可以使用滞后创建新的附加变量。

另请参阅this notebook,其中示例使用天气因素作为预测自行车使用量的额外回归量。

【讨论】:

谢谢。这真的很有帮助。不过,我对此有一个疑问。我听从了你的指示。并使用 Train_Test_Split 创建训练测试数据,并注意到它从包括最后一行在内的所有数据中获取随机数据。我打算预测数据集的后半部分......这会是一个很好的预测方法吗?或者我应该按索引拆分数据.....@queise【参考方案5】:

这可能会迟到,但是如果您在 2019 年阅读此内容,您可以使用 LSTM、Keras 实现多变量时间序列。

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

以上是关于是否可以使用 FB Prophet 进行多元多步预测?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理keras中多元LSTM中的多步时间序列预测

第十届“泰迪杯”数据挖掘挑战赛B题:电力系统负荷预测分析 ARIMAAutoARIMALSTMProphet多元Prophet 实现

第十届“泰迪杯”数据挖掘挑战赛B题:电力系统负荷预测分析 ARIMAAutoARIMALSTMProphet多元Prophet 实现

Prophet 的参数说明

如何告诉先知不要预测负值

在 R 中使用 broom 和 dplyr 进行“多步”回归