时间序列预测算法对比(利用Prophet并行预测多个时间序列)

时间序列预测算法对比(利用Prophet并行预测多个时间序列)(1)

Facebook Prophet库是预测时间序列的一个很好的工具,因为它非常简单易用,预测结果非常好!但不是并行运行所有进程,所以基本上如果您希望预测多个timeseries,那么所有进程都可能花费大量时间,这就是我们如何使用Python中的multiprocessing包显著减少预测进程时间的方法。

生成时间序列

我们要产生500个随机的时间序列,这个帖子的目的不是评估Prophet 预测的有效性,而是要完成这个任务的时间。

所以我写了一个函数,在一个时间段之间生成随机时间序列:

import pandas as pd import numpy as np def rnd_timeserie(min_date, max_date): time_index = pd.date_range(min_date, max_date) dates = (pd.DataFrame({'ds': pd.to_datetime(time_index.values)}, index=range(len(time_index)))) y = np.random.random_sample(len(dates))*10 dates['y'] = y return dates

时间序列预测算法对比(利用Prophet并行预测多个时间序列)(2)

所以我们的一个随机时间序列看起来像这样:

时间序列预测算法对比(利用Prophet并行预测多个时间序列)(3)

一个随机的时间系列

让我们生成500个序列

series = [rnd_timeserie('2018-01-01','2018-12-30') for x in range(0,500)]

我们已经创建了我们的时间序列,现在是时候运行Prophet 了。

使用Prophet 进行预测

让我们创建一个简单的Prophet模型,让我们定义一个调用的函数run_prophet,它采用时间序列并使机器学习模型与数据拟合,然后我们可以使用该机器学习模型预测接下来的90天。

from fbprophet import Prophet def run_prophet(timeserie): model = Prophet(yearly_seasonality=False,daily_seasonality=False) model.fit(timeserie) forecast = model.make_future_dataframe(periods=90, include_history=False) forecast = model.predict(forecast) return forecast

时间序列预测算法对比(利用Prophet并行预测多个时间序列)(4)

例如,我们可以使用第一个生成的time-serie运行此函数:

f = run_prophet(series[0]) f.head()

我们可以看到我们对该序列的预测结果:

时间序列预测算法对比(利用Prophet并行预测多个时间序列)(5)

Prophet输出

运行500个时间序列

现在让我们为500个时间序列添加一个计时器和运行prophet,不使用任何multiprocessing 工具,我使用tqdm,这样我可以检查进度

start_time = time.time() result = list(map(lambda timeserie: run_prophet(timeserie), tqdm(series))) print("--- %s seconds ---" % (time.time() - start_time))

时间序列预测算法对比(利用Prophet并行预测多个时间序列)(6)

前面的代码运行时间:12.53分钟,处理器的使用情况一直是这样的:

时间序列预测算法对比(利用Prophet并行预测多个时间序列)(7)

运行Prophet的处理器用法

现在,让我们将multiprocessing添加到我们的代码中,这里的思想是为每个时间序列预测启动进程,这样我们可以在执行列表映射时并行运行run_prophet函数。

为此,我们将使用Pool of process

该 Pool对象提供了一种方便的方法,可以跨多个输入值并行执行函数,将输入数据分布到各个进程(数据并行性)。

from multiprocessing import Pool, cpu_count p = Pool(cpu_count()) predictions = list(tqdm(p.imap(run_prophet, series), total=len(series))) p.close() p.join() print("--- %s seconds ---" % (time.time() - start_time))

时间序列预测算法对比(利用Prophet并行预测多个时间序列)(8)

在前面的代码中,我们根据机器的cpu数量启动N个进程,然后每次在cpu之间运行run_prophet函数。

该代码运行时间为3.04分钟,CPU在整个运行时间内的使用情况如下:

时间序列预测算法对比(利用Prophet并行预测多个时间序列)(9)

多进程中的CPU使用率

所以我们得到了4.12的加速!,这是相当好的!!!,我的机器只有8个CPU,如果我们想运行的更快,我们可以使用一个CPU更多的机器。

结论

我们可以看到,使用多处理是一种更快地预测多个时间序列的好方法,在许多问题中,multiprocessing可以帮助减少代码的执行时间。

在现实世界中,我们使用Google Cloud中的大型CPU机器进行多处理,将29000个时间序列的预测从13小时减少到45分钟。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页