基于Streamlit_prophet玩转Prophet时序预测

既然是玩转,就得easy,在通俗搞懂核心原理的基础上,重在实践。
本文首先介绍Prophet模型基本使用,再介绍一个开箱即用的开源项目--Streamlit_prophet,进一步降低Prophet使用门槛(甚至给运营、业务都会用~)
简介 时间序列受4种成分影响:

  • 趋势:宏观、长期、持续性的作用力
  • 周期:比如商品价格在较短时间内,围绕某个均值上下波动;
  • 季节:变化规律相对固定,并呈现某种周期特征;“季节”不一定按年计,每周、每天的不同时段的规律,也可称作季节性。
  • 随机:随机的不确定性,也就是指随机过程 (Stochastic Process)。
4种成分叠加起来就是对整个时序的影响,有加法模型乘法模型
  • 加法模型:相对独立,4个成分间的影响较小;
  • 乘法模型:相互影响更明显;
之前时序文章介绍了AR、MA、ARIMA等传统的时序模型,但用起来较麻烦,需要不断调整d\p\q三个参数,虽然可以通过“无脑”随机搜索交叉验证找出合适的参数,但并不丝滑,就算是优秀的数据分析师都会感觉头皮发麻~(哈哈哈,大佬勿喷)
Prophet,就是为上述场景量身定制的,直接通过参数去调整4种成分,简单易用,效果拉满(闪亮登场~)。
Prophet使用 1、安装
这里的坑比较多(win下安装),网上也有很多爬坑记录,但有一种最简单的方式--conda安装:
conda install pystan conda install prophet

2、使用
基本用法 和scikit-learn的用法风格类似:
from prophet import Prophet import pandas as pddf = pd.read_csv('example_wp_log_peyton_manning.csv')# 0、基本方法 # 创建预测器,拟合数据 m = Prophet() m.fit(df)# 设置预测框 future = m.make_future_dataframe(periods=365) future.tail()# 对未来时间点进行预测,预测给出预测值和置信区间 forecast = m.predict(future) forecast[['ds','yhat','yhat_lower','yhat_upper']].tail()# 画图 fig1 = m.plot(forecast) # 画出分量图 fig2 = m.plot_components(forecast)

引入假期因子
# 1、对【假期和特别活动】进行建模 # 通过 holidays 参数,将假期因素加入模型 playoffs = pd.DataFrame({ 'holiday': 'playoff', '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, }) superbowls = pd.DataFrame({ 'holiday': 'superbowl', 'ds': pd.to_datetime(['2010-02-07', '2014-02-02', '2016-02-07']), 'lower_window': 0, 'upper_window': 1, }) holidays = pd.concat((playoffs, superbowls))# 传入假期时间构建预测器 m = Prophet(holidays=holidays) forecast = m.fit(df).predict(future) fig = m.plot_components(forecast)

引入法定节假日因子
# 2、另外引入【法定节假日】,加入模型(通过add_country_holidays方法) m = Prophet(holidays=holidays) m.add_country_holidays(country_name='US') # CN :中国法定节假日 m.fit(df)forecast = m.predict(future) fig = m.plot_components(forecast)

季节性调整 使用“部分傅里叶和"来估计季节性:
# 3、更改年季节性参数 # 年季节性,默认是10;周季节性,默认是3 # 增加傅立叶项的数量可以使季节性适应更快的变化周期,但也可能导致过度拟合 from prophet.plot import plot_yearly m = Prophet(yearly_seasonality=20).fit(df) a = plot_yearly(m)

Prophet默认:【每周】和【每年】的季节性,可以使用 add_seasonality方法添加其他季节性,比如每月、每季度、每小时:
# 4、指定自定义季节性 # 关闭周季节性,加入月季节性 m = Prophet(weekly_seasonality=False) m.add_seasonality(name='monthly', period=30.5, fourier_order=5) forecast = m.fit(df).predict(future) fig = m.plot_components(forecast)

如果发现假期效应过拟合了,可以通过holidays_prior_scale参数调整(默认是10),降低该参数会减弱假期效应;seasonality_prior_scale,季节效应同理
m = Prophet(holidays=holidays, holidays_prior_scale=0.05).fit(df) forecast = m.predict(future) forecast[(forecast['playoff'] + forecast['superbowl']).abs() > 0][ ['ds', 'playoff', 'superbowl']][-10:]

还有其他用法,不多介绍,可参考个人github上的代码示例,示例来源于Prophet官方文档。
Streamlit_prophet部署 开源项目官方介绍:
Deploy a Streamlit app to train, evaluate and optimize a Prophet forecasting model visually.
可知,streamlit_prophet是构建在streamlit上、基于prophet时序预测模型的应用。。看官方视频介绍,感觉很好用,跑起来~
基于Streamlit_prophet玩转Prophet时序预测
文章图片

1、部署
和本地安装prophet一样,坑很多,但还是基于conda去安装就行。
创建虚拟环境:
conda create -n streamlit_prophetpython=3.8 activate streamlit_prophet

安装streamlit_prophet:
conda install pystan pip install -U streamlit_prophet#启动服务 streamlit_prophet deploy dashboard

本地访问:http://127.0.0.1:8080/ ,浏览器看到如下界面即说明部署成功~
基于Streamlit_prophet玩转Prophet时序预测
文章图片

2、使用介绍
官方自带了一些数据示例,能快速上手;遗憾的是,我们使用只能上传csv文件数据(限制了最大200M),不能直连数仓数据
基于Streamlit_prophet玩转Prophet时序预测
文章图片

基于Streamlit_prophet玩转Prophet时序预测
文章图片

对于数据列有选择、过滤、抽样、清洗模块:
基于Streamlit_prophet玩转Prophet时序预测
文章图片

调整潜在拐点、季节、节假日效应参数:
基于Streamlit_prophet玩转Prophet时序预测
文章图片

模型验证、预测:
基于Streamlit_prophet玩转Prophet时序预测
文章图片

3、模型结果
点击左上角运行预测选项,开始模型预测,左侧参数调整了,模型会自动重跑:
基于Streamlit_prophet玩转Prophet时序预测
文章图片

模型性能指标:
基于Streamlit_prophet玩转Prophet时序预测
文章图片

模型错误分析,第二个图中,离红线越远的点,预测误差越离谱(便于后续模型调整,误差最大时间点,是否考虑剔除异常数据):
基于Streamlit_prophet玩转Prophet时序预测
文章图片

基于Streamlit_prophet玩转Prophet时序预测
文章图片

蓝色阴影是模型预测结果的置信区间(80%),红线是模型估计的趋势:
基于Streamlit_prophet玩转Prophet时序预测
文章图片

更多细节需要小伙伴们自己去尝试~这里不一一展示
小结 Streamlit_prophet是一个能大大简化时序预测的优秀数据产品,对于数据分析师来说非常友好,但最大缺点是不能直连数仓进行预测,有些遗憾~(看开发者后续会不会考虑接入吧)。
但想要用好这类产品(不限于此产品),核心还是在于了解业务、深入理解时序模型、Prophet建模方法
参考:
  1. https://github.com/artefactor...
  2. https://facebook.github.io/pr...
  3. https://github.com/xihuishawp...
欢迎关注个人公众号:DS数说
【基于Streamlit_prophet玩转Prophet时序预测】原文链接:https://mp.weixin.qq.com/s/Kf...

    推荐阅读