此示例显示了使用Prophet和Dask进行可伸缩的时间序列预测。
先知是一种基于附加模型预测时间序列数据的过程,其中非线性趋势与每年,每周和每天的季节性以及假期影响相吻合。
正如大规模预测中所讨论的那样,大型数据集并不是团队遇到的唯一规模挑战挑战。在此示例中,我们将重点关注该论文中确定的第三种缩放挑战:
在最现实的设置中,将创建大量预测,这需要有效,自动化的方法来评估和比较它们,以及检测它们何时可能表现不佳。当做出数百甚至数千个预测时,让机器完成模型评估和比较的艰苦工作,同时有效利用人工反馈来解决性能问题变得非常重要。
对于Dask来说,这似乎是一个绝佳的机会。我们将一起使用先知和达斯克来并行化研究的诊断阶段。它不会试图使模型本身的训练并行化。
# This example currently relies on Prophet master import subprocess subprocess.call([ "pip", "install", "Cython cmdstanpy==0.9.5 pystan numpy pandas matplotlib LunarCalendar convertdate holidays setuptools-git python-dateutil tqdm" ]) subprocess.call([ "pip", "install", "git+https://github.com/facebook/prophet/#egg=fbprophet&subdirectory=python" ])
0
import pandas as pd from fbprophet import Prophet
密谋导入失败。交互式地块将不起作用。
我们将通过先知快速入门逐步介绍该示例。这些值代表Peyton Manning的Wikipedia page的日志每日页面浏览量。
df = pd.read_csv( 'https://raw.githubusercontent.com/facebook/prophet/master/examples/example_wp_log_peyton_manning.csv', parse_dates=['ds'] ) df.head()
ds | ÿ | |
---|---|---|
0 | 2007-12-10 | 9.590761 |
1个 | 2007-12-11 | 8.519590 |
2 | 2007-12-12 | 8.183677 |
3 | 2007-12-13 | 8.072467 |
4 | 2007-12-14 | 7.893572 |
df.plot(x='ds', y='y');
拟合模型需要花费几秒钟的时间。达斯克完全不参与其中。
%%time m = Prophet(daily_seasonality=False) m.fit(df)
CPU时间:用户2.27 s,系统:78.7 ms,总计:2.35 s 挂墙时间:2.35 s
<fbprophet.forecaster。先知位于0x7fbb97dc96d0>
我们可以做出预测。同样,Dask不在这里。
future = m.make_future_dataframe(periods=365) forecast = m.predict(future) m.plot(forecast);
并行诊断
先知包括一种fbprophet.diagnostics.cross_validation
函数方法,该方法使用模拟的历史预测来提供有关模型质量的一些想法。
这是通过在历史记录中选择截止点来完成的,对于每个截止点,仅使用直到该截止点的数据来拟合模型。然后,我们可以将预测值与实际值进行比较。
有关更多信息,请参见https://facebook.github.io/prophet/docs/diagnostics.html。
在内部,cross_validation
生成要尝试的截止值列表。先知适合一个模型,并为每个模型计算一些指标。默认情况下,每个模型都按顺序拟合,但是可以使用parallel=
关键字并行训练模型。在单台机器上parallel="processes"
是一个不错的选择。对于要在集群上分发工作的大型问题,请parallel="dask"
在连接到集群后通过创建来使用Client
。
import dask from distributed import Client, performance_report import fbprophet.diagnostics client = Client(threads_per_worker=1) client
客户
|
簇
|
%%time df_cv = fbprophet.diagnostics.cross_validation( m, initial="730 days", period="180 days", horizon="365 days", parallel="dask" )
INFO:fbprophet:在2010年2月15日00:00:00到2015年1月20日00:00:00之间做出11个带有截止值的预测 INFO:fbprophet:与<客户端:'tcp://127.0.0.1:37445'并行应用进程= 2线程= 2,内存= 8.36 GB>
CPU时间:用户2.15 s,系统:189 ms,总计:2.34 s 挂墙时间:52.5 s
确保正在运行Dask仪表板。这些模型在集群上并行拟合。开始时,必须将模型和数据移交给工作人员会产生一些开销,但是在此之后,扩展看起来非常不错。