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
所以我们的一个随机时间序列看起来像这样:
一个随机的时间系列
让我们生成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
例如,我们可以使用第一个生成的time-serie运行此函数:
f = run_prophet(series[0]) f.head()
我们可以看到我们对该序列的预测结果:
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))
前面的代码运行时间:12.53分钟,处理器的使用情况一直是这样的:
运行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))
在前面的代码中,我们根据机器的cpu数量启动N个进程,然后每次在cpu之间运行run_prophet函数。
该代码运行时间为3.04分钟,CPU在整个运行时间内的使用情况如下:
多进程中的CPU使用率
所以我们得到了4.12的加速!,这是相当好的!!!,我的机器只有8个CPU,如果我们想运行的更快,我们可以使用一个CPU更多的机器。
结论我们可以看到,使用多处理是一种更快地预测多个时间序列的好方法,在许多问题中,multiprocessing可以帮助减少代码的执行时间。
在现实世界中,我们使用Google Cloud中的大型CPU机器进行多处理,将29000个时间序列的预测从13小时减少到45分钟。
,