时间序列预测

实时笔记本

你可以在 live session Binder 中运行这个笔记本,或者在 Github 上查看它。

时间序列预测

本示例展示了如何使用 Prophet 和 Dask 进行可扩展的时间序列预测。

Prophet 是一种基于加法模型的时间序列数据预测程序,其中非线性趋势与年、周和日季节性以及节假日效应相拟合。

Forecasting at scale 中所讨论的,大型数据集并不是团队面临的唯一扩展挑战。在这个例子中,我们将重点关注该论文中提到的第三种扩展挑战:

[I]在大多数现实环境中,将创建大量预测,因此需要高效、自动化的方法来评估和比较这些预测,以及检测它们何时可能表现不佳。当进行数百甚至数千次预测时,让机器承担模型评估和比较的繁重工作变得重要,同时高效地利用人类反馈来解决性能问题。

这听起来像是Dask的完美机会。我们将结合使用Prophet和Dask来并行化研究的*诊断*阶段。它并不试图并行化模型本身的训练。

[ ]:
import pandas as pd
from prophet import Prophet

我们将通过 Prophet 快速入门中的示例进行讲解。这些值表示 佩顿·曼宁的维基百科页面 的每日页面浏览量日志。

[ ]:
df = pd.read_csv(
    'https://raw.githubusercontent.com/facebook/prophet/master/examples/example_wp_log_peyton_manning.csv',
    parse_dates=['ds']
)
df.head()
[ ]:
df.plot(x='ds', y='y');

拟合模型只需几秒钟。这里完全没有涉及Dask。

[ ]:
%%time
m = Prophet(daily_seasonality=False)
m.fit(df)

我们可以做出预测。再次强调,这里没有涉及 Dask。

[ ]:
future = m.make_future_dataframe(periods=365)
forecast = m.predict(future)
m.plot(forecast);

并行诊断

Prophet 包含一个 prophet.diagnostics.cross_validation 函数方法,该方法使用 模拟历史预测 来提供模型质量的一些概念。

这是通过在历史数据中选择截止点,并对每个截止点使用截止点之前的数据来拟合模型完成的。然后我们可以将预测值与实际值进行比较。

更多信息请参见 https://facebook.github.io/prophet/docs/diagnostics.html

在内部,cross_validation 生成一系列截止值进行尝试。Prophet 为每一个截止值拟合一个模型并计算一些指标。默认情况下,每个模型是按顺序拟合的,但可以使用 parallel= 关键字并行训练模型。在一台机器上,parallel="processes" 是一个不错的选择。对于大型问题,如果你希望在集群上分发工作,请在通过创建 Client 连接到集群后使用 parallel="dask"

[ ]:
import dask
from distributed import Client, performance_report
import prophet.diagnostics

client = Client(threads_per_worker=1)
client
[ ]:
%%time
df_cv = prophet.diagnostics.cross_validation(
    m, initial="730 days", period="180 days", horizon="365 days",
    parallel="dask"
)

在运行时务必查看 Dask 仪表板。模型在集群上并行拟合。开始时由于需要将模型和数据移动到工作节点,会有一些开销,但之后扩展看起来相当不错。