时间序列预测
内容
实时笔记本
你可以在 live session 中运行这个笔记本,或者在 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 仪表板。模型在集群上并行拟合。开始时由于需要将模型和数据移动到工作节点,会有一些开销,但之后扩展看起来相当不错。