prophet模块学习总结-20221228

news2024/12/24 1:04:01

prophet模块的基本介绍及相关用法说明。

文章目录

        • 1.基本介绍
          • Prophet包的特点
        • 2.Prophet 模型介绍
            • 2.1 长期趋势模型
          • 2.2 The Seasonality Function(季节函数)
          • 2.3 The Holiday/Event Function(节日函数)
        • 3.使用示例
          • 3.1 快速开始
          • 3.2 调节参数
        • 4.异常值处理
        • 5.交叉验证和超参数选择
        • 参考链接

1.基本介绍

Prophet是 Facebook 2017 年的工作——高质量且简单易用的时间预测模型。
适用于大规模的时序预测模型。它不仅解决了时序预测的建模问题,还解决了模型的可解释性问题。

Prophet是基于可分解(趋势+季节+节假日)模型的开源库。它让我们可以用简单直观的参数进行高精度的时间序列预测,并且支持自定义季节和节假日的影响

Prophet包的特点
  • 提供了直观易调的参数
  • 大规模的时序预测模型,可解释性强。
  • 灵活性强,易于分解,且在必要时也可以容纳新的成分;
  • 拟合速度快,允许用户进行交互式探索;
  • 测量值不需要有规则的间隔,也不需要对缺失值进行处理
  • 提供了R包和python包,两种语言环境都可以使用

2.Prophet 模型介绍

用于分析和预测周期性数据时,一种强大而简单的方法是加法模型(additive model)

这个想法很简单:将时间序列表示为每日、每周、每季度和每年度等不同时间维度的组合模式,并加以整体趋势。

加法模型可以向我们展示数据的模式/趋势,并根据这些观察结果进行预测。

在这里插入图片描述

(图见:https://mp.weixin.qq.com/s/FaxBq_6ax6rzu7s-8_wpRw)

这是 Facebook 的真实数据集,每一天都有一个点,点的颜色按照星期进行编码,以展示一个星期的周期性。
从这张图中我们可以看到:这个时间序列具有周期性 (weekly、yearly)、趋势变化性 (Trend)、异常点 (outliers) 和节假日效应 (holiday)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mSuopgyQ-1672222719563)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9235)]

其中:

  • g(t)是长时间段的变化趋势;
  • s(t)表示短期或者季节性的变化规律;
  • h(t)表示不规律的假期影响;
  • e(t)误差项表示模型针对特定企业或个人的任何特殊变化;
  • y(t)为预测值。

这类规范类似于广义可加模型 (Generalized additive model,GAM),这是一种非线性的回归模型。

我们可以使用时间序列分解将其分解为趋势、季节性、节假日:

下图显示了一个时间序列的加法模型,它分解为整体趋势、年度趋势和每周趋势。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vvcwPaxt-1672222719564)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9228)]
(图见[https://mp.weixin.qq.com/s/ven_4JbWYFswIkGyhjTcww](https://mp.weixin.qq.com/s/ven_4JbWYFswIkGyhjTcww))

2.1 长期趋势模型
  • logistic growth model(饱和增长:逻辑斯谛增长模型)
    如果预测数据是已达饱和的非线性数据(非线性增长且已达到饱和点,仅根据季节性发生很小的变化),那么建议使用 logistic growth模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-URuX68p7-1672222719564)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9230)]

  • piece-wise linear model(分段线性模型,模块中默认是分段线性模型)
    如果数据呈线性变化,在过去表现出增加、减小的趋势,那么分段线性模型是我们的首选。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r0Hl7R5X-1672222719566)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9239)]

c是趋势变化点,可以进行人工调节。

  • Flat(平滑模型)
    最近,你可以选择flat模式。该模式的长期趋势随着时间的推移没有什么变化,主要调节季节性变化。
2.2 The Seasonality Function(季节函数)

季节函数是随着时间的傅里叶变化。
If you are unfamiliar with Fourier Series, an easy way to think about it is the sum of many successive sines and cosines. Each sine and cosine term is multiplied by some coefficient. This sum can approximate nearly any curve or in the case of Facebook Prophet, the seasonality (cyclical pattern) in our data. All together it looks like this:(不想翻译了,介绍傅里叶的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWAVE4Vk-1672222719567)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9233)]

If the above is difficult to decipher, I recommend this simple breakdown of the Fourier Series or this video on the intuition behind the Fourier series.

季节项表示为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4gr1CxkN-1672222719567)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9232)]

可以对β进行调节,值越大,季节效应越明显;值越小,季节效应越不明显。

2.3 The Holiday/Event Function(节日函数)

节日函数允许根据一年中的重大节日或者事件来调节预估值。
Prophet 允许用户设置过去和未来的假日或者事件,并且设置节假日影响的时间长短。
于是,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ALLiRI8a-1672222719567)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9223)]

z(t)为因节日而引起的变化函数,k值越大,节假日对模型的影响越大;值越小,节假日对模型的影响越小。

3.使用示例

3.1 快速开始
import pandas as pd
# read data from NY times
df = pd.read_csv("https://raw.githubusercontent.com/nytimes/covid-19-data/master/us.csv") 
# engineer new cases
df['new_cases'] = df.cases - df.cases.shift().fillna(0)
# create pandas time series
df.date = pd.to_datetime(df.date)
df.set_index('date',inplace=True)
df['rolling_weekly_avg'] =df.new_cases.rolling(window=7).mean().fillna(0)
# create timeseries readable by fbprophet
ts = pd.DataFrame({'ds':df.index,'y':df.new_cases})  # 时间:新增病例#ts['cap'] = 30000 # unused in linear growth
#ts['floor'] = 0 # unused in linear growth
ts.head()

ts.head()返回
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J7vv4z8L-1672222719568)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9224)]

from fbprophet import Prophet
# instantiate the model and fit the timeseries
prophet = Prophet()
prophet.fit(ts)

# create a future data frame
future = prophet.make_future_dataframe(periods=25)
forecast = prophet.predict(future)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SRFIQzEy-1672222719568)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9227)]

forecast
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nPOI9BCx-1672222719569)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9229)]

forecast列信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zxYqgcZ7-1672222719569)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9237)]

# display the most critical output columns from the forecast
forecast[['ds','yhat','yhat_lower','yhat_upper']].head()
# plot
fig = prophet.plot(forecast)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VoGAL15t-1672222719569)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9234)]

同样,可以添加辅助线来查看发现的趋势变化点。


from fbprophet.plot import add_changepoints_to_plot
a = add_changepoints_to_plot(fig.gca(),prophet,forecast)
fig

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvW1ZhG0-1672222719570)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9236)]

这个结果比较合理,但仍然有微调的空间。

3.2 调节参数

这个是原文的结果,跑到2021-03月
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Eedx8fG-1672222719570)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9231)]

可以看到,在来年确诊人数下降,但模型仍呈上升趋势。

常用参数介绍

参数名中文名含义
changepoint_range突变点的选取范围默认为0.8,即在前80%的数据内确定突变点,过高容易导致过拟合
n_changepoints突变点个数设置突变点个数,若设置30个,则相当于要在突变点的选取范围内平均划分30个突变点
changepoint_prior_scale
seasonality_prior_scale
holidays_prior_scale
seasonality_mode
from fbprophet import Prophet
# instantiate the model and fit the timeseries
prophet = Prophet(weekly_seasonality=False, changepoint_range=1,changepoint_prior_scale=0.75)
prophet.fit(ts)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GdQ1VTdj-1672222719570)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9225)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KwGiKNKt-1672222719571)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p9238)]

这里可以看参数注释: https://www.sktime.org/en/v0.6.0/api_reference/modules/auto_generated/sktime.forecasting.fbprophet.Prophet.html

4.异常值处理

The best way to handle outliers is to remove them - Prophet has no problem with missing data. If you set their values to NA in the history but leave the dates in future, then Prophet will give you a prediction for their values.
最好的方式是移除空值。如果你的历史数据中存在缺失值,而在future数据中给出确实值的日期,那么prophet会给出确实值的预测值😊。

5.交叉验证和超参数选择

  • 交叉验证

prophet可以对时间序列进行交叉验证以衡量历史数据上的预测误差。通过在历史数据中选择一系列cutoff点的方式来进行验证,从起始数据到不同的cutoff点的数据来拟合模型,返回包含真实值y和预测值yhat的dataframe。

# Python
from prophet.diagnostics import cross_validation
df_cv = cross_validation(m, initial='730 days', period='180 days', horizon = '365 days')
df_cv.head()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOEVQb8N-1672222719572)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p11148)]

可以使用performance_metrics工具来计算预测效果(MSE,RMSE,MAE…)

# Python
from prophet.diagnostics import performance_metrics
df_p = performance_metrics(df_cv)
df_p.head()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4jcccfr-1672222719572)(evernotecid://4A2C0413-3745-487E-BADD-865195851786/appyinxiangcom/25370018/ENResource/p11149)]

😌😌😌😉😉😉😏😏😏😩😩😩
交叉验证度量效果可以通过plot_cross_validation_metric函数进行查看。

# Python
from prophet.plot import plot_cross_validation_metric
fig = plot_cross_validation_metric(df_cv, metric='mape')
  • 并行交叉验证
    设置parallel参数实现
  • 超参数调优
    交叉验证用于超参数调优示例
# Python
import itertools
import numpy as np
import pandas as pd

param_grid = {  
    'changepoint_prior_scale': [0.001, 0.01, 0.1, 0.5],
    'seasonality_prior_scale': [0.01, 0.1, 1.0, 10.0],
}

# Generate all combinations of parameters
all_params = [dict(zip(param_grid.keys(), v)) for v in itertools.product(*param_grid.values())]
rmses = []  # Store the RMSEs for each params here

# Use cross validation to evaluate all parameters
for params in all_params:
    m = Prophet(**params).fit(df)  # Fit model with given params
    df_cv = cross_validation(m, cutoffs=cutoffs, horizon='30 days', parallel="processes")
    df_p = performance_metrics(df_cv, rolling_window=1)
    rmses.append(df_p['rmse'].values[0])

# Find the best parameters
tuning_results = pd.DataFrame(all_params)
tuning_results['rmse'] = rmses
print(tuning_results)

# Python
best_params = all_params[np.argmin(rmses)]
print(best_params)

可以用来调节的参数:

  • changepoint_prior_scale
  • seasonality_prior_scale
  • holidays_prior_scale
  • seasonality_mode

也许可以调节的参数:

  • changepoint_range

不可以用来调节的参数:

  • growth
  • changepoints
  • n_changepoints
  • yearly_seasonality
  • weekly_seasonality
  • daily_seasonality
  • holidays
  • mcmc_samples
  • interval_width
  • uncertainty_samples
  • stan_backend

参考链接

官网链接:
https://facebook.github.io/prophet/docs/quick_start.html#python-api

https://www.geeksforgeeks.org/time-series-analysis-using-facebook-prophet/?ref=gcse

https://towardsdatascience.com/time-series-analysis-with-facebook-prophet-how-it-works-and-how-to-use-it-f15ecf2c0e3a

https://zhuanlan.zhihu.com/p/52330017

https://mp.weixin.qq.com/s/ven_4JbWYFswIkGyhjTcww

https://mp.weixin.qq.com/s/9B3KMzR_8PePv2XCq-iO2w

https://mp.weixin.qq.com/s/FaxBq_6ax6rzu7s-8_wpRw

https://mp.weixin.qq.com/s/mFgqV6C8RDzL5KidC1U-jA

https://mp.weixin.qq.com/s/smjRKQ-JntGTwCDCUS61GQ

https://pythondata.com/forecasting-time-series-data-prophet-trend-changepoints/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MetersPhere自动化解决用户登录问题+添加钉钉机器人

MetersPhere自动化解决用户登录问题添加钉钉机器人 现在遇到的问题,做自动化的时候几乎每个接口都需要token,这个token是登录获取的,那我有很多个自动化的场景,如果我每一个场景都加入登录接口,同时执行很多场景的时候…

骨传导耳机有用吗,最好用的骨传导耳机分享

骨传导耳机有没有用这个问题,主要还是看自己需要骨传导耳机的根本需求是什么,骨传导耳机更多的使用场景是在户外运动,但是日常才室内使用或者长时间使用的耳机爱好者,骨传导耳机也能在一定程度上保护听力,下面就分享五…

浅聊OpenHarmony

接触OpenHarmony快一年了,这里简单总结下自己对OpenHarmony的理解,如果有不对的地方,欢迎来讨论。OpenHarmony是什么?了解这个之前我们可以先来看看什么是开源? 一、开源是什么? 开源简单来讲&#xff0c…

阿里云视频点播资源迁移及回溯校验

阿里云视频点播资源迁移及回溯校验一:准备环境1.1、搭建springboot1.2、引入外部包二:表与配置2.1、拉取视频点播文件2.2、建表2.3、yml配置文件三:代码3.1、XML3.2、entity3.3、mapper3.4、Synchronize3.5、视频迁移Controller3.6、视频回溯…

Fedora初始化 | python在Fedora中的初始化搭建

本来是想玩一下ArticlePairMatching-master,结果需要graph-tool工具,这哥们需要c等环境,无法在window中直接安装。 望着不堪重负的win系统,还是安了一个全新的Fedora虚拟机作为实验环境吧。 1. 使用VMWare安装Fedora Fedora的图形…

户外徒步戴什么耳机比较好、最适合户外运动的五款耳机推荐

现在人们对自己的身体状态越来越重视了,无论是怎样的生活,一个健康的身体非常重要,近几年的运动健身热潮的兴起,能看出来人们会花更多的时间去锻炼自己的身体了,与之而来的就是各种健身、运动的蓝牙耳机不断的推陈出新…

2022餐馆设计最新十大排行榜(附餐馆设计案例图片)

随着生活水平的提升,人们对于用餐的环境要求越来越高,对于餐馆设计的要求随之提高,因此在装修时,很多餐饮老板想找一家实力强的餐厅设计公司,那么国内的餐饮设计公司数量庞大,有哪些擅长餐饮设计呢&#xf…

android生成javadoc

生成步骤 菜单 Tools -> Generate JavaDoc! 问题: 1.JavaDoc导出时出现乱码报错 错误: 编码GBK的不可映射字符 菜单 Tools -> Generate JavaDoc,弹出配置面板 在Other command line arguments 栏输入:-encoding utf-8 -charset utf-8 2.提示 程序…

C/S快速开发框架源码 winform快速开发框架源码

C/S系统开发框架源码 C#快速开发框架源码(CS版)00683 源码分享,需要源码学习可私信我。 系统功能: 该框架采用逻辑上的三层模式开发业务处理和数据处理完全分开,采用C#语言和MSSQL进行开发,主要实现了菜…

微信小程序 会议OA项目-其它页面04

目录 1.会议管理 1.1 自定义tabs组件 1.2 会议管理 2.投票管理 3.个人中心 1.会议管理 1.1 自定义tabs组件 文档参考:自定义组件 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/ 新建一个文件夹&#xff1…

尚医通-数据字典-EasyExcel-导入 导出(十四)

目录: (1)EasyExcel-写操作 (2)EasyExcel-读操作 (3)后台系统-数据字典-导出 (4) 后台系统-数据字典-导入 (1)EasyExcel-写操作 往数据字典里…

家用摄像头选择(户内外)

不知道摄像头怎么选?看下面几篇就够了。 1、户外监控摄像头,哪个品牌的比较好? - 知乎 2、【室外篇】家用监控摄像头选购要素及不同场景下高性价比监控摄像头推荐 - 知乎 3、家用摄像头选什么牌子的好? - 知乎 优先选焦距 IP防水防尘&…

超宽带(UWB)开发板BU0/DW1000性能测试

简介 本实验目的是测试NodeMCU-BU01开发板测距的性能。 BU01是基于Decawave的DW1000设计的超宽带(UWB)收发器模组。BU01可以用于双向测距或TWR定位系统中,定位精度可达到10厘米,并支持高达6.8 Mbps的数据速率。 UWB技术是一种使…

“ 1天投200次简历,依旧石沉大海 ” 这届年轻人的“求职焦虑”,如何缓解?

最近在新闻上看到这样一则热议事件:“1天投200次简历”?多方发力,缓解应届生“求职焦虑”。 教育部公布的数据显示,我国2022届全国普通高校毕业生数量为1076万人,而2023届预计达1158万人,同比将增加82万人…

通过webpack配置【程序打包时间】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、webpack打包定义全局常量二、将全局常量设置为当前时间三、在console中输出BUILDTIME前言 大家都是做项目研发的,“打包”、“提测”、“发版”…

低代码-零代码基础教育结合场景

在此次大会上,杭州市学军小学教育集团总校长张军林受邀出席。作为将低代码与校园教学管理成功结合运用的一所数字化小学,校长张军林在会上分享了他的数智化管理思想,并发布了学军小学智慧校园系统—学军大脑2.0。 “学军大脑2.0是基于钉钉宜…

ES6-ES11笔记(2)

笔记 (https://www.bilibili.com/video/BV1uK411H7on?p30&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 1.ES6 1.14集合介绍与API 1.14.1 set常用的api //声明一个set //set 里面的元素是唯一的,会自动去重 let s1 new Set(); //创建 //可以传入可以迭代的数据 let s…

Windows服务器调整TLS1.2加密套件

由于部分服务器默认不支持:TLS1.2加密条件,这会导致谷歌、火狐等浏览器无法访问网站,这种情况下需要调整加密条件。 支持TLS1.2协议的服务器操作系统需要:windows 2008R2 IIS7以上。 注意:微软说明windows 2003、win…

软件测试期末复习(二)试题及答案

文章目录试卷答案试卷 一、选择题(每题 2 分,共 20 分) 1、下面关于软件测试的说法,_______是错误的。 A 软件测试就是程序测试 B 软件测试贯穿于软件定义和开发的整个期间 C 需求规格说明、设计规格说明都是软件测试的对象 D 程序是软件测试的对象 2…

github工具之OA综合利用python

文章目录0x01 下载地址0x02 主要功能0x03 使用方法0x04 参数使用OA v11.6 report_bi.func.php SQL注入漏洞OA v11.6 print.php 任意文件删除漏洞,删除auth.inc.php中OA v11.8 api.ali.php 任意文件上传漏洞OA v11.8 logincheck_code.php登陆绕过漏洞免责声明0x01 下…