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

37

我正在处理一个多元(100+变量)多步骤(t1到t30)的预测问题,时间序列频率为每1分钟。这个问题要求预测100+个变量中的一个作为目标。我想知道是否可以使用FB Prophet的Python API来解决这个问题。我已经能够以单变量方式使用目标变量和日期时间变量。非常感谢任何帮助和指导。如有进一步的输入或澄清需要,请告知。


原问题的答案是肯定的!这里有一个链接,其中包含特定的神经预言文档,其中有几个示例说明如何使用多变量输入。对于神经预言,这些被称为“滞后回归器”。https://neuralprophet.com/html/lagged_covariates_energy_ercot.html - Purnajyoti Bhaumik
您还可以使用“未来回归器” https://neuralprophet.com/html/future-regressors.html - Purnajyoti Bhaumik
8个回答

58

你可以使用add_regressor方法在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的参数是训练数据框中附加变量的列名。{{}}
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,然后使用add_regressor和预测的add1和add2作为附加变量的未来值来预测y。
从文档中了解到,t+1时刻y的预测仅使用t+1时刻add1和add2的值,而不是它们在t、t-1、...、t-n时刻的值,就像它对y所做的那样。如果这对您很重要,您可以创建具有滞后的新附加变量。
请参见此笔记本,其中提供了一个使用天气因素作为额外回归变量进行自行车使用预测的示例。

谢谢。这真的很有帮助。不过我有一个关于这个的问题。我按照你的说明操作了,使用Train_Test_Split创建了训练测试数据,并注意到它选择了随机数据,包括最后一行。我原本打算预测数据集的后半部分。。。。这样做预测是否是一个好方法?或者,我应该按索引拆分数据?@queise - John Doe
我对你关于Prophet不使用回归器的过去值的评论感到困惑。根据文档:“额外的回归器必须在历史和未来日期都已知。”尽管我无法在任何地方找到任何规范/澄清。 - aze45sq6d
@aze45sq6d:我的理解是,确实需要回归变量的过去值,但仅在训练期间使用。对于预测,它只使用t+1时刻的值,而不像单变量时间序列那样使用过去的值。 - queise
有趣的是,在阅读了您的帖子后,我实际上通过将滞后变量添加到模型中作为回归器进行了测试。然而,由于Prophet模型似乎是这样设置的,因此回归器的滞后值包括在训练和测试集中,并包含在拟合步骤中。如果有一种方法可以分离用于训练和预测的数据(并处理由于添加了大量额外特征而导致的维度变化),那么我会非常感兴趣!但是假设没有办法做到这一点(1) - aze45sq6d
我测试了滞后期长达8个单位(从1个滞后到8个滞后),随着滞后期的增加,我的预测误差也增加了。所以我猜有两种可能:
  • 我在实现中犯了错误,Prophet算法感到困惑(在拟合步骤中包括回归器的滞后期而不是将拟合与预测分开)
  • 它已经在预测步骤中使用了回归器的过去值,Prophet算法感到困惑。
- aze45sq6d

4

4
我感到困惑,似乎没有达成共识,关于Prophet是否可以以多元方式工作,可以在github的问题这里这里看到。 根据一些评论、queise的回答和一个很好的youtube教程,你可以通过某种方法解决多元功能,视频链接在这里:https://www.youtube.com/watch?v=XZhPO043lqU

1
目标时间序列是单变量的,但您可以使用多个回归器。 - M . Franklin

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设置为任何您想要的值。这是使用的步数。现在要小心了,因为当Prophet说多元时,他们实际上是指预先已知的变量(a参数)。它并没有真正解决多元预测问题。但是,您可以使用名为_recursive的Facebook Skater来使用Prophet在预测您真正关心的变量之前预测外生变量。
话虽如此,我强烈建议您阅读Prophet的批评,并在使用之前检查其在Elo评级上的位置。

0

可能有点晚了,但如果你在2019年阅读这篇文章,你可以使用LSTM和Keras实现多元时间序列。


0

VAR 是一种纯经济计量模型,但在阅读了大量关于预测的文献后,我发现 VAR 也无法捕捉趋势。所以我们的预测不是很准确,但 VAR 仍然是多变量分析的重要模型。我认为 Prophet 并不适用于多元变量,而应该使用像 RF、XGBOOST 和 NNET 等 ML 模型……但请记住,如果你想捕捉趋势,一定要确保哪种模型更好。否则就选择深度学习。


0

0

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接