Facebook时序预测工具Prophet实战分析

Facebook时序预测工具Prophet实战分析引言去年Facebook开源了一套时序预测工具叫做Prophet。Prophet是一个预测时间序列数据的模型。它基于一个自加性模型,用来拟合年、周、季节以及假期等非线性趋势。它在至少有一年历史数据的日常周期性数据,效果最好。Prophet对缺失值,趋势的转变和大量的异常值是有极强的鲁棒性。Prophet中文翻译是:“先知”。名字还是挺贴切的。在看完本篇文章后,你将会知道:

大家好,又见面了,我是你们的朋友全栈君。

引言

去年Facebook开源了一套时序预测工具叫做Prophet。Prophet是一个预测时间序列数
据的模型。 它基于一个自加性模型,用来拟合年、周、季节以及假期等非线性趋势。 它在至少有一年历史数据的日常周期性数据,效果最好。 Prophet对缺失值,趋势的转变和大量的异常值是有极强的鲁棒性。Prophet中文翻译是:“先知”。名字还是挺贴切的。在看完本篇文章后,你将会知道:

  • Prophet有什么亮点
  • Prophet是怎么工作的
  • 如何去使用Prophet

为什么会发布这套工具

预测是一项数据科学任务,是组织内许多活动的核心。 例如,Facebook这样的大型组织必须参与容量规划,以有效分配稀缺资源和目标设置,以便衡量相对于基线的性能。
得到高质量的预测对于任何机器或大多数分析师来说都不是一个简单的问题。 在现实生活中,我做了不少商业预测,归纳总结发现,预测任务有两大核心问题:

  • 完全自动化的预测技术往往都比较“脆弱”,不是太灵活,对一些问题缺乏有效的假设以及启发式的思路
  • 能够得到高质量预测的数据科学家是非常罕见的,因为预测需要丰富的经验以及专业的数据科学技能

在现实生活中,对高质量预测的需求往往要远远超过分析人员可以生产的速度。因此Prophet的出现就是为了让专家和非专家能够更轻松地进行高质量的预测。

很多人在做预测的时候,总会提出这个一个潜在的考虑因素:“规模”。当我数据量很大的时候,计算与存储的开销能满足要求么?其实对于时序预测问题,计算问题可以通过并行执行解决,存储问题可以通过关系型数据库MySQL或数据仓库Hive解决。
Prophet解决的“规模”问题,其实本质上是在完成时序预测任务时面临的各种复杂情况,Prophet能够适用于多种业务场景下的预测。

Prophet的亮点

当你做了很多时序预测任务时,你就会发现,并不是所有的任务都能用一个预测流程来解决。“一招鲜,吃遍天”在数据科学里是行不通的。通过分析平时我们做时序任务时遇到的问题,我们发现给定的时序数据有以下几个特点:

  • 观察值是按每小时或每天或每周或每月给出的一段历史数据
  • 多尺度的周期性:一周七天,一个月30天,12个月等等
  • 提前已知的一些重要假期:各种法定节日或传统节日
  • 数据中存在缺失值或异常值
  • 历史趋势的变化
  • 趋势是非线性变化,达到自然极限或趋于饱和

Prophet通过将全自动预测与在线学习相结合从而保证了该工具能够解决大多数商业业务问题,Prophet工作流程如下图所示:

prophet

相比于目前开源的一些预测工具,Prophet主要有以下两点优势:

  • Prophet能够让你更方便直接地创建一个预测任务,而其他的一些工具包(ARMA,指数平滑)等,这些工具每个有自己的优缺点及参数,即使是优秀的数据分析师想要从众多的模型中选择合适的模型及相应的参数也是够让他头皮发麻的。
  • Prophet是为非专家们”量身定制”的。为什么这么说呢?你利用Prophet可以直接通过修改季节参数来拟合季节性,修改趋势参数来拟合趋势信息,指定假期来拟合假期信息等等。

Prophet是如何工作的

本质上讲,Prophet是由四个组件组成的自加性回归模型

  • 分段线性或逻辑增长曲线趋势。 Prophet通过从数据中选择改变点,自动检测趋势的变化。
  • 用傅里叶级数模拟每年的季节性分量。
  • 用虚拟变量来模拟每周的周期性分量。
  • 用户提供的重要节日列表

Prophet其中最重要的思想就是曲线拟合,这与传统的时序预测算法有很大的不同。

如何使用Prophet

安装

因为Prophet已经发布在PyPI上了,所以我们可以通过pip进行安装:

$ pip install fbprophet

我的是ubuntu16.10版本,软件大小为68.1MB

快速启动

Prophet遵循sklearn模型API。 我们创建一个prophet类的实例,然后调用它的fit和predict方法。
Prophet的输入必须包含两列数据:ds和y,其中ds是时间戳列,必须是时间信息;y列必须是数值,代表我们需要预测的信息。首先我们获取数据:这里我们采用官网给出的Peyton Manning这个维基百科页面日常被访问的数据(下载链接)。

然后我们导入相关库以及数据:

# Python
import pandas as pd
import numpy as np
from fbprophet import Prophet
df = pd.read_csv('example_wp_peyton_manning.csv')
df['y'] = np.log(df['y'])
df.head()
ds y
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
m = Prophet()
m.fit(df);
# Python
future = m.make_future_dataframe(periods=365)
future.tail()
ds
3265 2017-01-15
3266 2017-01-16
3267 2017-01-17
3268 2017-01-18
3269 2017-01-19
# Python
forecast = m.predict(future)
forecast.tail()
ds trend trend_lower trend_upper yhat_lower yhat_upper seasonal seasonal_lower seasonal_upper seasonalities seasonalities_lower seasonalities_upper weekly weekly_lower weekly_upper yearly yearly_lower yearly_upper yhat
3265 2017-01-15 7.189085 6.836460 7.556897 7.529009 8.874259 1.017668 1.017668 1.017668 1.017668 1.017668 1.017668 0.048286 0.048286 0.048286 0.969382 0.969382 0.969382 8.206753
3266 2017-01-16 7.188059 6.834473 7.557350 7.783923 9.237696 1.343707 1.343707 1.343707 1.343707 1.343707 1.343707 0.352298 0.352298 0.352298 0.991409 0.991409 0.991409 8.531766
3267 2017-01-17 7.187033 6.832412 7.557802 7.555636 9.061272 1.132123 1.132123 1.132123 1.132123 1.132123 1.132123 0.119631 0.119631 0.119631 1.012493 1.012493 1.012493 8.319156
3268 2017-01-18 7.186006 6.830079 7.558255 7.456370 8.982307 0.965765 0.965765 0.965765 0.965765 0.965765 0.965765 -0.066664 -0.066664 -0.066664 1.032429 1.032429 1.032429 8.151772
3269 2017-01-19 7.184980 6.827757 7.558474 7.445508 8.889737 0.978710 0.978710 0.978710 0.978710 0.978710 0.978710 -0.072264 -0.072264 -0.072264 1.050973 1.050973 1.050973 8.163690
m.plot(forecast)

这里写图片描述

m.plot_components(forecast)

这里写图片描述

不同业务场景下的预测效果

这一小节,我们基于不同业务场景,看看Prophet的预测效果好不好。

饱和性预测

这里通过制定预测值的上限、下限,从而来进行饱和性预测

#Forecasting Growth
df = pd.read_csv('example_wp_R.csv')
df['y'] = np.log(df['y'])
df.head()
ds y
0 2008-01-30 5.976351
1 2008-01-16 6.049733
2 2008-01-17 6.011267
3 2008-01-14 5.953243
4 2008-01-15 5.910797
# 指定上限df['cap'] = 8.5
df['cap'] = 8.5
m = Prophet(growth='logistic')
m.fit(df)
future = m.make_future_dataframe(periods=1826)
future['cap'] = 8.5
fcst = m.predict(future)
m.plot(fcst)

png

趋势变化点

Prophet能够实现历史趋势变化点的自动检测,并可以通过调整参数适当修正变化。Prophet通过changepoint_prior_scale来调整变化点的趋势程度,值越大,趋势就越灵活。同时Prophet通过参数changepoints来手动指定趋势变化点。

m = Prophet(changepoint_prior_scale=0.5)
forecast = m.fit(df).predict(future)
m.plot(forecast)

png

m = Prophet(changepoint_prior_scale=0.001)
forecast = m.fit(df).predict(future)
m.plot(forecast)

png

m = Prophet(changepoints=['2014-01-01'])
forecast = m.fit(df).predict(future)
m.plot(forecast)

这里写图片描述

Prophet在异常值、缺失值、周期性、季节性、节假日等方面效果也不错,这里就不赘述了。

总结

读了这篇文章,是不是感觉这个Prophet很好用,是不是迫不及待想去试试水?哈哈哈
demo代码:github : Prophe_in_action

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147679.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java中的io流知识总结_java中的io流开发用的多吗

    java中的io流知识总结_java中的io流开发用的多吗通过前面的简单学习,我们已经能够大致了解了关于文件的操作,但是能够明显感受到在执行其他的操作的时候,还是会有一些不方便的地方存在,因此今天我们会学习另外四个IO流来帮助我们对文件进行操作,这四个流分别是缓冲流、转换流、序列化、打印流。好了,废话不多说,我直接开始今天的学习吧!……

    2022年10月20日
    0
  • 5分钟,6行代码教你写爬虫!(python)[通俗易懂]

    5分钟,6行代码教你写爬虫!(python)[通俗易懂]5分钟,6行代码教你写会爬虫!适用人士:对数据量需求不大,简单的从网站上爬些数据。好,不浪费时间了,开始!先来个例子:输入以下代码(共6行)importrequestsfromlxmlimporthtmlurl=’https://movie.douban.com/’#需要爬数据的网址page=requests.Session().get(url)tree=html.f

    2022年6月7日
    47
  • mysql的反引号怎么打出来_sql注入绕过单引号

    mysql的反引号怎么打出来_sql注入绕过单引号反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select*from`users`whereuser_id=1limit0,1;可以正常执行的,这样使用还可以起到分隔符的作用,如下eg:select*from`users`whereuse…

    2025年6月30日
    0
  • 阿里云疯狂促销 公有云之战刚鸣枪

    阿里云疯狂促销 公有云之战刚鸣枪

    2021年9月3日
    64
  • 我的 Java 自学之路[通俗易懂]

    我的 Java 自学之路[通俗易懂]其实在转正之后我就想抽个时间好好的梳理一下我的Java上车之路,但是一直拖到现在,因为有学弟问到,所以也就给了我动力。毕竟答应了人家的事要做到。首先要有相应的背景介绍,不然说个毛线啊,大家不在同一水平,不好参考借鉴。我呢,学校很牛逼,是一所刚过线的二本,自身的成绩在班里也就第8名左右吧(一共60个人),在大二的时候学校开设了Java这门课,我的期末考试…

    2022年7月7日
    19
  • android反编译apk_apk反编译找不到

    android反编译apk_apk反编译找不到反编译代码:1、解压apk得到class.dex2、dex2jar.bat class.dex3、用Javadecompiler查看编译出来的*.jar文件就可以看到代码反编译资源文件:1、apktool.bat d *.apk  APKTool是GOOGLE提供的APK编译工具,需要JAVA运行环境,推荐使用JDK

    2022年9月17日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号