云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

百度云_mac连接远程服务器_代金券

小七 141 0

基于Facebook-Prophet和apachespark的细粒度时间序列预测

试试这个数据库里的时间序列预测笔记本时间序列预测的进步使零售商能够做出更可靠的需求预测。现在的挑战是及时地以一种允许企业对产品库存进行精确调整的粒度来生成这些预测。利用Apache Spark™ 而Facebook Prophet,越来越多面临这些挑战的企业发现,他们可以克服以往解决方案的可扩展性和准确性限制。在这篇文章中,我们将讨论时间序列预测的重要性,可视化一些样本时间序列数据,然后构建一个简单的模型来展示Facebook Prophet的使用。一旦您对构建单个模型感到满意,我们将把Prophet与ApacheSpark的魔力结合起来™ 向您展示如何一次培训数百个模型,使我们能够以迄今为止很少达到的粒度级别为每个单独的产品商店组合创建精确的预测。准确及时的预测现在比以往任何时候都更加重要为了更好地预测产品和服务的需求,提高时间序列分析的速度和准确性是零售商成功的关键。如果在一家商店里放置了太多的产品,货架和储藏室的空间会变得紧张,产品可能会过期,零售商可能会发现他们的财务资源被库存所束缚,从而无法利用制造商或消费模式转变带来的新机遇。如果商店里摆放的产品太少,顾客可能无法购买他们需要的产品。这些预测错误不仅会直接导致零售商的收入损失,而且随着时间的推移,消费者的挫败感可能会将客户推向竞争对手。新的期望要求更精确的时间序列预测方法和模型一段时间以来,企业资源计划(ERP)系统和第三方解决方案为零售商提供了基于简单时间序列模型的需求预测能力。但随着技术的进步和行业压力的加大,许多零售商正寻求超越以往可用的线性模型和更传统的算法。新的功能,如Facebook Prophet所提供的功能,正从数据科学界涌现出来,各公司正在寻求将这些机器学习模型应用于其时间序列预测需求的灵活性。这种从传统预测解决方案中脱颖而出的趋势要求零售商等不仅在需求预测的复杂性方面发展内部专业知识,而且在有效分配所需的工作方面,以便及时生成数十万甚至数百万个机器学习模型。幸运的是,我们可以使用Spark来分发这些模型的培训,这样不仅可以预测产品和服务的总体需求,还可以预测每个位置每种产品的独特需求。时间序列数据中需求季节性的可视化为了演示使用Prophet为单个商店和产品生成精细的需求预测,我们将使用来自Kaggle的公开可用数据集。它包含10家不同商店的50种商品的5年日销售数据。首先,让我们看看所有产品和商店的总体年度销售趋势。正如你所看到的,产品销售总额逐年增长,但没有明显的迹象表明产品销售趋于平稳。其次,通过每月查看相同的数据,我们可以看到,同比上升趋势并不是每个月都在稳步推进。相反,我们看到了一个明显的季节性模式,即夏季的高峰,冬季的低谷。使用Databricks Collaborative Notebook的内置数据可视化功能,我们可以通过将鼠标移到图表上来查看每个月数据的价值。在工作日的水平上,销售高峰出现在周日(工作日0),紧接着是周一(工作日1)的大幅下降,然后在本周余下的时间里稳步回升。从Facebook Prophet上的简单时间序列预测模型开始正如上面的图表所示,我们的数据显示了销售的一年比一年上升的趋势,以及年度和每周的季节性模式。Prophet正是为了解决这些数据中的重叠模式。Facebook Prophet遵循scikit learn API,因此任何有sklearn经验的人都应该很容易学会它。我们需要传入一个2列的pandas DataFrame作为输入:第一列是日期,第二列是要预测的值(在我们的例子中是sales)。一旦我们的数据采用了正确的格式,构建模型就很容易了:将熊猫作为pd导入从fbprophet导入Prophet#实例化模型并设置参数模型=先知(间隔宽度=0.95,growth='linear',daily_seasonality=假,每周_季节性=真,年度_季节性=真,季节性_mode='multipleative')#根据历史数据拟合模型模型.拟合(历史记录)现在我们已经根据数据拟合了模型,让我们用它来构建一个90天的预测。在下面的代码中,我们使用prophet的make_future_dataframe方法定义了一个数据集,其中包括历史日期和90天以后的日期:未来的概率=model.make_future_数据帧(周期=90,freq='d',包括历史=真)#对数据集进行预测预测值_pd=模型.预测(未来)就这样!我们现在可以使用Prophet内置的.plot方法来可视化我们的实际数据和预测数据,以及对未来的预测。正如您所看到的,我们前面介绍的每周和季节性需求模式实际上反映在预测结果中。预测图=模型.绘图(forecast_pd,xlabel='date',ylabel='sales')显示器(图)这个可视化有点忙。BartoszMikulski提供了一个很好的分类,值得一看。简而言之,黑点代表我们的实际值,深蓝色线代表我们的预测值,浅蓝色带代表我们(95%)的不确定性区间。与Prophet和Spark并行训练数百个时间序列预测模型现在,我们已经演示了如何构建一个单一的时间序列预测模型,我们可以使用apachespark的强大功能来加倍努力。我们的目标不是为整个数据集生成一个预测,而是为每个产品-商店组合生成数百个模型和预测,作为一个连续操作执行这些操作将非常耗时。以这种方式建立模型可以让一个杂货连锁店,例如,创建一个精确的预测,他们应该为他们的桑达斯基店订购的牛奶量不同于克利夫兰商店所需的牛奶量,根据这些地点的不同需求量。如何使用Spark数据帧来分布时间序列数据的处理数据科学家经常使用诸如apachespark这样的分布式数据处理引擎来处理训练大量模型的挑战。通过利用Spark集群,集群中的单个worker节点可以与其他worker节点并行训练模型的子集,从而大大减少训练整个时间序列模型集合所需的总时间。当然,在工人节点(计算机)集群上的培训模型需要更多的云基础设施,这是有代价的。但是,随着随需应变云资源的轻松可用性,公司可以快速地提供所需的资源,培训其模型,并以同样快的速度释放这些资源,从而使它们能够实现大规模的可扩展性,而无需对物理资产作出长期承诺。在Spark中实现分布式数据处理的关键机制是数据帧。通过将数据加载到Spark DataFrame中,数据将分布在集群中的worker中。这使得这些工作人员能够以并行的方式处理数据的子集,从而减少执行工作所需的总时间。当然,每个工作人员都需要访问其工作所需的数据子集。通过将键值上的数据分组(在本例中是存储和项的组合),我们将这些键值的所有时间序列数据聚集到一个特定的worker节点上。存储项目历史记录.groupBy('商店','商品')# . . .我们在这里共享groupBy代码是为了强调它如何使我们能够高效地并行地训练许多模型,尽管在下一节中,在我们为数据设置并应用UDF之前,它不会真正发挥作用。利用pandas用户定义函数(udf)的功能随着时间序列数据按存储和项目正确分组,我们现在需要为每个组训练一个模型。为此,我们可以使用pandas用户定义函数(UDF),它允许我们对数据帧中的每一组数据应用自定义函数。这个UDF不仅将为每个组训练一个模型,还将生成一个表示该模型预测的结果集。但是,虽然函数将在独立于其他组的数据帧中对每个组进行训练和预测,但从每个组返回的结果将方便地收集到单个生成的数据帧中。这将允许我们生成门店商品级别的预测,但将我们的结果作为单个输出数据集呈现给分析师和经理。正如您在下面的Python代码中看到的,构建UDF相对简单。UDF是用pandas_UDF方法实例化的,该方法标识它将返回的数据的模式以及它期望接收的数据类型。紧接着,我们定义了执行UDF工作的函数。在函数定义中,我们实例化我们的模型,对其进行配置并使其适合它接收到的数据。模型进行预测,数据作为函数的输出返回。@pandas_udf(结果图,PandasudType.GROUPED_映射)定义预测存储项(历史记录):#实例化模型,配置参数模型=先知(间隔宽度=0.95,growth='linear',daily_seasonality=假,每周海洋