Facebook开源大规模预测工具Prophet:支持Python和R

简介:

近日,Facebook 宣布开源了一个可以通过 Python 和 R 语言使用的预测工具 Prophet。以下是 Facebook 研究博客对该工具的介绍。

预测(forecasting)是一个数据科学问题,也是很多组织机构内许多活动的核心。比如说,像 Facebook 这样的大型组织必须进行能力规划(capacity planning)以有效地分配稀缺资源和目标配置,以便能基于基准对业绩表现进行测量。不管是对于机器还是对于分析师而言,得出高质量的预测都并非易事。我们已经在创建各种各样的业务预测(business forecasts)的实践中观察到了两大主要主题:

  • 完全自动化的预测技术可能会很脆弱,而且往往非常不灵活,不能整合有用的假设或启发。
  • 能够产生高质量预测的分析师相当少,因为预测是一种需要大量经验的数据科学领域的专业技能。

这两个主题会导致一个结果:对高质量预测的需求往往超出分析师能够得出的预测速度。这个情况是我们创造 Prophet 的动力:我们想要让专家和非专家都能轻松地做出高质量的预测来满足自身的需求。

对于「规模(scale)」的通常考虑涉及到计算和存储,但这些都不是预测的核心问题。我们发现预测大量时间序列(time series)的计算和基础设施问题是相对简单的——通常这些拟合过程可以很容易地并行化,而预测本身也能容易地被存储在 MySQL 这样的关系数据库或 Hive 这样的数据仓库中。据我们观察,「规模」在实践中面临的问题涉及的是由多种预测问题所引入的复杂性(complexity)和在得出预测后如何在大量预测结果中构建信任(trust)。Prophet 已经成为了 Facebook 创建大量可信预测的能力的关键组成部分,这些预测可被用于决策制定甚至用在产品功能中。

Prophet 有什么用?

并非所有的预测问题都可以通过同一种程序(procedure)解决。Prophet 是为我们在 Facebook 所遇到的业务预测任务而优化的,这些任务通常具有以下特点:

  • 对于历史在至少几个月(最好是一年)的每小时、每天或每周的观察
  • 强大的多次的「人类规模级」的季节性:每周的一些天和每年的一些时候
  • 事先知道的以不定期的间隔发生的重要节假日(如,超级碗)
  • 合理数量的缺失的观察或大量异常
  • 历史趋势改变,比如因为产品发布或记录变化
  • 非线性增长曲线的趋势,其中有的趋势达到了自然极限或饱和

我们发现默认设置的 Prophet 能产生往往和经验丰富的预测师得到的一样准确的预测,而所花费的工作却更少。使用 Prophet,如果该预测不令人满意,你也不用局限于一个完全自动化的程序——即使一个没有接受过任何时间序列方法训练的分析师也能够使用各种各样的可轻松解读的参数来改进或调整预测。我们已经发现:通过在特定案例上将自动化预测和分析师参与的预测(analyst-in-the-loop forecasts)结合到一起,它有可能可适用于非常大范围的业务用例。下图给出了我们发现的可以大规模使用的预测过程:

Facebook开源大规模预测工具Prophet:支持Python和R

对于该预测过程的建模阶段,目前仅有有限数量的工具可用。Rob Hyndman 的出色的预测 R 语言的预测软件包(http://robjhyndman.com/software/forecast/)可能是目前最受欢迎的选择,而且谷歌和 Twitter 也都分别发布了带有更加特定的时间序列功能的软件包——CausalImpact(https://google.github.io/CausalImpact/)和 AnomalyDetection(https://github.com/twitter/AnomalyDetection)。就我们所知,在使用 Python 的预测上,还少有开源的软件包可用。

我们常常在许多设置中使用 Prophet 作为预测(forecast)软件包的替代,因为其有如下两个主要优点:

Prophet 让我们可以更加简单直接地创建合理且准确的预测。该预测包包含了许多不同的预测技术(比如 ARIMA、指数平滑等),其中每一个都有它们自己的长处、短处和调整参数。我们发现错误的模型或参数选择往往会导致糟糕的结果,而在这样的选择阵列下,即使是经验丰富的分析师也不太可能能够有效地选择出正确的模型和参数。

Prophet 预测可以通过对非专家而言很直观的方式进行自定义。有关于季节性的平滑参数让你能调整与历史周期之间的接近程度,以及关于趋势的平滑参数让你能调整跟随历史趋势变化的激进程度。对于增长曲线而言,你可以手动设定「capacity」或增长曲线的上限,这能让你注入关于你预测的增长或下降情况的先验信息。最后,你还可以为模型指定没有规律的节假日,比如超级碗、感恩节和黑色星期五的日期。

Prophet 如何工作

本质上讲,Prophet 程序是一个可加性回归模型(additive regression model),它包含 4 个主要组件:

  • 分段线性或者 logistic 增长曲线趋势。通过从数据中选择变化点,Prophet 自动探测趋势变化。
  • 使用傅立叶级数建模每年的季节分量。
  • 使用虚变量(dummy variables)的每周的季节分量。
  • 用户提供的重要节假日列表。

例如,下面是一个特征预测:使用 wikipediatrend 包(https://cran.r-project.org/web/packages/wikipediatrend/index.html)下载的 Peyton Manning 的维基百科页面的查看数量的日志。由于 Peyton Manning 是一名美式橄榄球运动员,你可以看到他每年季节性的重要程度变化,同时每周的周期性也明显存在。最后你看到特定事件(比如他参加的季后赛)也可能被建模了。

Facebook开源大规模预测工具Prophet:支持Python和R

Prophet 将提供一个组分图,用图形描述它所拟合的模型:

Facebook开源大规模预测工具Prophet:支持Python和R

这个组分图更加清晰地展示了与浏览 Peyton Manning 的网页(橄榄球常规赛与季后赛)相关的每年的季节性,以及每周的季节性:(星期日和星期一)比赛当天和比赛之后有更多的访问。你也可以注意到趋势组件自他最近退休以来的下行调整。

Prophet 的重要思想是:通过更好地灵活拟合趋势组分,我们可以更精确地建模季节性,并且有更准确的预测结果。对于这个任务我们更喜欢使用非常灵活的回归模型(有一点像曲线拟合)而不是传统的时序模型,因为前者可以使我们建模更灵活,更容易拟合模型,更优雅地处理丢失数据或离群值。

通过模拟时间序的未来趋势变化,Prophet 默认地会为趋势组分提供不确定的间隔。如果你希望对未来季节性或假期影响的不确定性进行建模,你可以运行数百个 HMC 迭代(花费几分钟),你的预测就将会包括季节性不确定评估。

我们使用 Stan(http://mc-stan.org/)调整 Prophet 模型,并在 Stan 的概率编程语言中实现了 Prophet 流程的核心部分。Stan 对参数的 MAP 优化有着极快的速度( 1 秒),让我们可以选择使用 Hamiltonian Monte Carlo 算法评估不确定的参数,也使得我们能够在多种接口语言上重复使用该拟合程序。目前,我们提供了 Python 和 R 语言的 Prophet 实现。它们有着几乎相同的特征,而且通过提供这两种实现,我们希望该预测方法能够在数据科学社区有更广泛的用途。





本文作者:佚名
来源:51CTO
目录
相关文章
|
1月前
|
缓存 API Python
Python中的装饰器:优雅而强大的函数增强工具
在Python编程中,装饰器是一种强大的工具,可以在不改变原函数代码的情况下,对函数进行增强和扩展。本文将介绍装饰器的基本概念、用法以及实际应用场景,帮助读者更好地理解并运用装饰器提升代码的可维护性和灵活性。
|
1月前
|
存储 开发工具 git
Python中的版本控制和代码协作工具
在Python项目中,版本控制和代码协作是非常重要的。最常用的版本控制工具是Git,而代码协作则通常通过Git配合代码托管平台(如GitHub、GitLab等)来实现。以下是一个基本的流程,说明如何使用Git进行版本控制以及如何通过GitHub进行代码协作。
|
7天前
|
机器学习/深度学习 数据挖掘 计算机视觉
python数据分析工具SciPy
【4月更文挑战第15天】SciPy是Python的开源库,用于数学、科学和工程计算,基于NumPy扩展了优化、线性代数、积分、插值、特殊函数、信号处理、图像处理和常微分方程求解等功能。它包含优化、线性代数、积分、信号和图像处理等多个模块。通过SciPy,可以方便地执行各种科学计算任务。例如,计算高斯分布的PDF,需要结合NumPy使用。要安装SciPy,可以使用`pip install scipy`命令。这个库极大地丰富了Python在科学计算领域的应用。
12 1
|
8天前
|
数据可视化 数据挖掘 Python
Python中数据分析工具Matplotlib
【4月更文挑战第14天】Matplotlib是Python的数据可视化库,能生成多种图表,如折线图、柱状图等。以下是一个绘制简单折线图的代码示例: ```python import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [2, 4, 6, 8, 10] plt.figure() plt.plot(x, y) plt.title('简单折线图') plt.xlabel('X轴') plt.ylabel('Y轴') plt.show() ```
12 1
|
8天前
|
数据采集 SQL 数据可视化
Python数据分析工具Pandas
【4月更文挑战第14天】Pandas是Python的数据分析库,提供Series和DataFrame数据结构,用于高效处理标记数据。它支持从多种数据源加载数据,包括CSV、Excel和SQL。功能包括数据清洗(处理缺失值、异常值)、数据操作(切片、过滤、分组)、时间序列分析及与Matplotlib等库集成进行数据可视化。其高性能底层基于NumPy,适合大型数据集处理。通过加载数据、清洗、分析和可视化,Pandas简化了数据分析流程。广泛的学习资源使其成为数据分析初学者的理想选择。
14 1
|
8天前
|
运维 数据可视化 Python
PYTHON中用PROPHET模型对天气时间序列进行预测与异常检测
PYTHON中用PROPHET模型对天气时间序列进行预测与异常检测
23 1
|
14天前
|
测试技术 开发者 Python
Python中的装饰器:优雅而强大的函数修饰工具
在Python编程中,装饰器是一种强大的工具,用于修改函数或方法的行为。本文将深入探讨Python中装饰器的概念、用法和实际应用,以及如何利用装饰器实现代码的优雅和高效。
|
1月前
|
数据采集 搜索推荐 数据挖掘
使用Python制作一个批量查询搜索排名的SEO免费工具
最近工作中需要用上 Google SEO(搜索引擎优化),有了解过的朋友们应该都知道SEO必不可少的工作之一就是查询关键词的搜索排名。关键词少的时候可以一个一个去查没什么问题,但是到了后期,一个网站都有几百上千的关键词,你再去一个一个查,至少要花费数小时的时间。 虽然市面上有很多SEO免费或者收费工具,但免费的基本都不能批量查,网上免费的最多也就只能10个10个查询,而且查询速度很慢。收费的工具如Ahrefs、SEMrush等以月为单位收费最低也都要上百美刀/月,当然如果觉得价格合适也可以进行购买,毕竟这些工具的很多功能都很实用。今天我给大家分享的这个排名搜索工具基于python实现,当然肯定
40 0
|
1月前
|
XML Shell Linux
性能工具之 JMeter 使用 Python 脚本快速执行
性能工具之 JMeter 使用 Python 脚本快速执行
41 1
性能工具之 JMeter 使用 Python 脚本快速执行
|
1月前
|
数据可视化 数据挖掘 Python
Python中的数据可视化工具Matplotlib简介与实践
在本文中,我们将介绍Python中常用的数据可视化工具Matplotlib,包括其基本概念、常用功能以及实际应用。通过学习Matplotlib,读者可以更好地理解和运用数据可视化技术,提升数据分析与展示的能力。