Facebook时间序列预测算法模型-prophet

prophet(先知)是Facebook开源的一个时间序列预测算法。其是基于时间序列分解和机器学习的拟合来做的,其中在拟合模型的时候使用了pyStan这个开源工具,因此能够在较快的时间内得到需要预测的结果。prophet的算法里面考虑了四项,分别为:趋势项、季节项、剩余项和节假日效应。

其中为趋势项,表示时间序列在非周期上面的变化趋势。为周期项或季节项,代表节假日项,表示在当天是否存在节假日。表示误差项或者剩余项。Prophet算法就是通过拟合这几项,最后累加起来就得到了时间序列的预测值。

下面简要介绍一下Prophet算法的使用方法:

# Python

import pandas aspd

from fbprophetimport Prophet

# 读入数据集

df = pd.read_csv(‘CSV_file.csv’)

# 拟合模型

m = Prophet()

m.fit(df)

# 构建待预测日期数据框,periods = 365 代表除历史数据的日期外再往后推 365 天

future = m.make_future_dataframe(periods=365)

# 预测数据集

forecast =m.predict(future)

# 展示预测结果

m.plot(forecast);

# 预测的成分分析绘图,展示预测中的趋势、周效应和年度效应

m.plot_components(forecast);

2,饱和预测

默认情况下, Prophet使用线性模型进行预测。Prophet可使用 logistic 增长趋势模型进行预测,同时指定承载能力。

df[‘cap’] = 25

df[‘floor’] = 23

m =Prophet(growth=‘logistic’)

m.fit(df)

3,趋势突变点

3.1 Prophet中的自动检测突变点

Prophet首先是通过在大量潜在的突变点中进行识别来监测突变点。之后对趋势变化的幅度做稀疏先验。潜在突变点的数量可以通过设置 n_changepoints 参数来指定。

fromfbprophet.plot import add_changepoints_to_plot

m = Prophet(changepoint_range=0.9)

fig =m.plot(forecast)

a =add_changepoints_to_plot(fig.gca(), m, forecast)

3.2 调整趋势的灵活性

如果趋势的变化被过度拟合或者拟合不足,可以利用输入参数 changepoint_prior_scale 来调整稀疏先验的程度。默认这个参数被指定为0.05。

m =Prophet(changepoint_prior_scale=0.001)

3.3指定突变点的位置

手动指定潜在突变点的位置而不是利用自动的突变点监测,可以使用changepoints参数

m = Prophet(changepoints=[‘2020-12-10’])

4,季节性,假期效果和回归量

4.1对假期和特征事件建模

如果需要专门对节假日或者其它的事件进行建模,你就必须得为此创建一个新dataframe,这个数据框必须包含所有出现的节假日,不仅是历史数据集中还是待预测的时期中的。

holidays = pd.DataFrame({

‘holiday’: ’ holidays ',

‘ds’:pd.to_datetime([‘2008-01-13’, ‘2009-01-03’, ‘2010-01-16’,

​ ‘2010-01-24’, ‘2010-02-07’, ‘2011-01-08’,

​ ‘2013-01-12’, ‘2014-01-12’, ‘2014-01-19’,

​ ‘2014-02-02’, ‘2015-01-11’, ‘2016-01-17’,

​ ‘2016-01-24’, ‘2016-02-07’]),

‘lower_window’: 0,

‘upper_window’: 1,

})

一旦这个数据框创建好了,就可以通过传入 holidays 参数使得在预测时考虑上节假日效应

m = Prophet(holidays=holidays)

可通过 forecast 数据框,来展示节假日效应:

forecast[(forecast[‘playoff’]).abs() > 0]

4.2 季节性的傅里叶级数

采用傅里叶级数近似于一个线性周期信号。部分和(order)中的项数是一个参数,它决定了季节性的变化有多快。默认值10通常是合适的,但是当季节性需要适应更高频率的变化时,可以增加。

m = Prophet(yearly_seasonality=20)

4.3 自定义季节性因素

如果时间序列超过两个周期,Prophet将默认适合每周每年的季节性。对于子日(sub-daily )时间序列,它也将适合每日的季节性。可以使用add_seasality方法添加其它季节性。

m =Prophet(weekly_seasonality=False)

m.add_seasonality(name=‘monthly’,period=30.5, fourier_order=5)

4.4 对节假日和季节性设定先验规模

如果发现节假日效应被过度拟合了,通过设置参数 holidays_prior_scale 可以调整它们的先验规模来使之平滑,默认下该值取10。减少这个参数会降低假期效果:

m =Prophet(holidays=holidays, holidays_prior_scale=0.05)

seasonality_prior_scale参数可以用来调整模型对于季节性的拟合程度。

m.add_seasonality(name=‘weekly’, period=7, fourier_order=3, prior_scale=0.1)

4.5 附加的回归量

可以使用add_regressor方法将附加的回归量添加到模型的线性部分。

m = Prophet()

m.add_regressor(‘nfl_sunday’)

5,乘法季节性

默认情况下,Prophet能够满足附加的季节性,这意味着季节性的影响是加到趋势中得到了最后的预报。

Prophet可以通过设置seasonality_mode='multiplicative’来建模乘法季节性

m =Prophet(seasonality_mode=‘multiplicative’)

乘法模型,有:forecast[‘yhat’] = forecast[‘trend’] * (1+forecast[‘multiplicative_terms’]) + forecast[‘additive_terms’]

6,预测区间

默认情况下, Prophet 的返回结果中会包括预测值yhat的预测区间。当然,预测区间的估计需建立在一些重要的假设前提下。在预测时,不确定性主要来源于三个部分:趋势中的不确定性、季节效应估计中的不确定性和观测值的噪声影响。

6.1趋势的不确定性

预测中,不确定性最大的来源就在于未来趋势改变的不确定性。预测区间的宽度(默认下,是 80% )可以通过设置 interval_width 参数来控制:

m =Prophet(interval_width=0.95)

由于预测区间估计时假定未来将会和过去保持一样的变化频率和幅度,而这个假定可能并不正确,所以预测区间的估计不可能完全准确。

6.2季节的不确定性

默认情况下,Prophet只会返回趋势中的不确定性和观测值噪声的影响。必须使用贝叶斯取样的方法来得到季节效应的不确定性,可通过设置 mcmc.samples 参数(默认下取0)来实现。

m =Prophet(mcmc_samples=500)

7,异常值

Prophet虽能够处理历史数据中的异常值,但仅仅是将它们与趋势的变化拟合在一起,认为未来也会有类似的趋势变化。处理异常值最好的方法是移除它们,Prophet是能够处理缺失数据的。如果在历史数据中某行的值为空(NA),但是在待预测日期数据框future中仍保留这个日期,那么Prophet依旧可以给出该行的预测值。

# 将2021年一年的数据设为缺失

df.loc[(df[‘ds’]> ‘2021-01-01’) & (df[‘ds’] < ‘2022-01-01’), ‘y’] = None

model =Prophet().fit(df)

model.plot(model.predict(future));

最好的解决方法就是移除这些异常值

8,非日数据

8.1子日数据

future =m.make_future_dataframe(periods=300, freq=‘H’)

8.2有规则间隔的数据

如果数据集只有每天早上6点之前的观测值,解决方案是只对有历史数据的时间窗进行预测。这里,这意味着限制未来dataframe的时间。

future2 =future.copy()

future2 =future2[future2[‘ds’].dt.hour < 6]

fcst =m.predict(future2)

8.3月数据

可以使用Prophet来匹配每月的数据。然而,Prophet的基本模型是连续时间的,这意味着如果将模型与每月的数据相匹配,然后要求每天的预测,可能会得到奇怪的结果。当使用Prophet拟合月度数据时,可以通过在make_future_dataframe中传入频率参数只做月度的预测。

future =m.make_future_dataframe(periods=120, freq=‘M’)

fcst =m.predict(future)

9,诊断

Prophet包含时间序列交叉验证功能,以测量使用历史数据的预测误差。通过在历史记录中选择截止点来完成

fromfbprophet.diagnostics import cross_validation

df_cv =cross_validation(m, initial=‘730 days’, period=‘180 days’, horizon = ‘365days’)

initial代表了一开始的时间是多少,period代表每隔多长时间设置一个cutoff,horizon代表每次从cutoff往后预测多少天。

Facebook时间序列预测算法模型-prophet相关推荐

  1. 解读:一种来自Facebook团队的大规模时间序列预测算法(附github链接)

    写在前面 下面这篇文章的内容主要是来自Facebook团队的论文<Forecast at Scale>,这篇论文介绍了一种时间序列预测算法Prophet,该算法结合了时间序列分解以及机器学 ...

  2. 时间序列预测专项——基于Prophet的业务预测

    时间序列预测专项 基于Prophet的业务预测 1. 趋势模型 1.1 饱和增长模型 1.2 分段线性模型 1.3 变点自动选择 2. 季节模型 3. 节假日模型 4. Prophet模型参数解读 5 ...

  3. 预测算法模型_如何测量预测模型或算法的准确性第1部分。

    预测算法模型 在开发预测模型和算法时,无论是线性回归模型还是ARIMA模型 ,重要的是量化模型对未来观测的适应程度. 计算模型的正确性的最简单方法之一是使用预测值和实际值之间的误差. 从那里开始,有几 ...

  4. 时间序列预测 | Python实现Prophet、ARIMA、LSTM时间序列数据预测

    时间序列预测 | Python实现Prophet.ARIMA.LSTM时间序列数据预测 目录 时间序列预测 | Python实现Prophet.ARIMA.LSTM时间序列数据预测 数据描述 特征工程 ...

  5. 【Mo 人工智能技术博客】时间序列预测——DA-RNN模型

    时间序列预测--DA-RNN模型 作者:梅昊铭 1. 背景介绍 传统的用于时间序列预测的非线性自回归模型(NRAX)很难捕捉到一段较长的时间内的数据间的时间相关性并选择相应的驱动数据来进行预测.本文将 ...

  6. porphet论文_Facebook 时间序列预测算法 Prophet 的研究

    Prophet 简介 Facebook 去年开源了一个时间序列预测的算法,叫做 fbprophet,它的官方网址与基本介绍来自于以下几个网站: 从官网的介绍来看,Facebook 所提供的 proph ...

  7. python 时间序列prophet 模型分析_手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码)...

    原标题:手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码) 作者:ANKIT CHOUDHARY:翻译:王雨桐:校对:丁楠雅: 本文约3000字,建议阅读12分钟. 本文将通过 ...

  8. 手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码)

    作者:ANKIT CHOUDHARY 翻译:王雨桐 校对:丁楠雅 本文约3000字,建议阅读12分钟. 本文将通过拆解Prophet的原理及代码实例来讲解如何运用Prophet进行时间序列预测. 简介 ...

  9. 大数据毕业设计 LSTM时间序列预测算法 - 股票预测 天气预测 房价预测

    文章目录 0 简介 1 基于 Keras 用 LSTM 网络做时间序列预测 2 长短记忆网络 3 LSTM 网络结构和原理 3.1 LSTM核心思想 3.2 遗忘门 3.3 输入门 3.4 输出门 4 ...

最新文章

  1. win10显示隐藏文件_如何在Mac上显示隐藏文件?苹果mac显示隐藏文件夹方法
  2. python多进程编程常用到的方法
  3. 【第7章】 使用函数和模块来重用你的代码
  4. Ubuntu12.04 root用户登录设置
  5. window tool
  6. PHP笔记-表格及分页功能
  7. PHP学习总结(10)——PHP入门篇之自定义网站根目录
  8. python ghost.py使用笔记
  9. 算法48---原子的数量【栈】
  10. sass用法快速入门
  11. kaggle数据集下载
  12. 图片放大以后不清晰怎么办?
  13. 数字化到底有什么用?
  14. Oracle练习题(三)
  15. 上传文件连接失败问题
  16. 猿创征文|【C++游戏引擎Easy2D】炫酷动画来这学,位移动画构造函数让节点执行动画
  17. 多相位图像插值算法(Lanczos、sinc)
  18. ff14最新服务器人数,FF14第一波转服过后 现各服务器人口状况
  19. 2022第七届少儿模特明星盛典全国总决赛 圆满落幕
  20. 【毕业设计】基于stm32的迷你示波器 - 单片机 嵌入式 物联网

热门文章

  1. 和自己对话--陶渊明《饮酒》
  2. excel中sumproduct()的用法
  3. 掘金万亿母婴市场,宝宝树价值在哪里? | 一点财经
  4. Python课程设计:Python语言实现自动组卷评卷考试系统
  5. 部署Adobe Reader 9.41
  6. 递归遍历文件夹,递归解压,压缩文件,写解压和压缩过程的日志,
  7. 《汇编语言程序设计》 可执行文件
  8. Deepin中使用Windows字体
  9. MDT2013 8456 Task Sequence详解
  10. QT:颜色拾取器的实现