Prophet拟合模型入门学习

Facebook的Prophet是一款开源的时间序列预测算法,它能处理异常值和部分缺失值,适用于商业分析和数据分析。Prophet基于时间序列分解和机器学习,内置PyStan用于快速拟合,并提供R和Python接口。算法包括趋势项、季节性、节假日效应等组件,通过自动或手动设置变点来适应数据变化。用户可调整参数如变点数量、季节性周期等。Prophet的使用涉及数据预处理、模型训练和预测,其结果包括预测值及置信区间。适用于具有明显趋势或周期性的时间序列预测。

先展示效果:
在这里插入图片描述
在这里插入图片描述

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

Github:https://github.com/facebook/prophet
官方网址:https://facebook.github.io/prophet/
论文名字与网址:Forecasting at scale,https://peerj.com/preprints/3190/
从官网的介绍来看,Facebook 所提供的 prophet 算法不仅可以处理时间序列存在一些异常值的情况,也可以处理部分缺失值的情形,还能够几乎全自动地预测时间序列未来的走势。从论文上的描述来看,这个 prophet 算法是基于时间序列分解和机器学习的拟合来做的,其中在拟合模型的时候使用了 pyStan 这个开源工具,因此能够在较快的时间内得到需要预测的结果。除此之外,为了方便统计学家,机器学习从业者等人群的使用,prophet 同时提供了 R 语言和 Python 语言的接口。从整体的介绍来看,如果是一般的商业分析或者数据分析的需求,都可以尝试使用这个开源算法来预测未来时间序列的走势。

Prophet 的算法原理
Prophet 数据的输入和输出

首先让我们来看一个常见的时间序列场景,黑色表示原始的时间序列离散点,深蓝色的线表示使用时间序列来拟合所得到的取值,而浅蓝色的线表示时间序列的一个置信区间,也就是所谓的合理的上界和下界。prophet 所做的事情就是:

1、输入已知的时间序列的时间戳和相应的值;
2、输入需要预测的时间序列的长度;
3、输出未来的时间序列走势。
4、输出结果可以提供必要的统计指标,包括拟合曲线,上界和下界等。
就一般情况而言,时间序列的离线存储格式为时间戳和值这种格式,更多的话可以提供时间序列的 ID,标签等内容。因此,离线存储的时间序列通常都是以下的形式。其中 date 指的是具体的时间戳,category 指的是某条特定的时间序列 id,value 指的是在 date 下这个 category 时间序列的取值,label 指的是人工标记的标签(‘0’ 表示异常,'1‘ 表示正常,‘unknown’ 表示没有标记或者人工判断不清)。
在这里插入图片描述
在这里插入图片描述
而 fbprophet 所需要的时间序列也是这种格式的,根据官网的描述,只要用 csv 文件存储两列即可,第一列的名字是 ‘ds’, 第二列的名称是 ‘y’。第一列表示时间序列的时间戳,第二列表示时间序列的取值。通过 prophet 的计算,可以计算出 yhat,yhat_lower,yhat_upper,分别表示时间序列的预测值,预测值的下界,预测值的上界。两份表格如下面的两幅图表示。

Prophet 的算法实现
在这里插入图片描述

趋势项模型 [公式]
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在 Prophet 里面,是需要设置变点的位置的,而每一段的趋势和走势也是会根据变点的情况而改变的。在程序里面有两种方法,一种是通过人工指定的方式指定变点的位置;另外一种是通过算法来自动选择。在默认的函数里面,Prophet 会选择 n_changepoints = 25 个变点,然后设置变点的范围是前 80%(changepoint_range),也就是在时间序列的前 80% 的区间内会设置变点。通过 forecaster.py 里面的 set_changepoints 函数可以知道,首先要看一些边界条件是否合理,例如时间序列的点数是否少于 n_changepoints 等内容;其次如果边界条件符合,那变点的位置就是均匀分布的,这一点可以通过 np.linspace 这个函数看出来。

m = Prophet(growth='logistic') 
df['cap'] = 6 
m.fit(df) 
future = m.make_future_dataframe(periods=prediction_length, freq='min') 
future['cap'] = 6

变点的选择(Changepoint Selection)
在这里插入图片描述
对未来的预估(Trend Forecast Uncertainty)

从历史上长度为 [公式] 的数据中,我们可以选择出 [公式] 个变点,它们所对应的增长率的变化量是 [公式] 。此时我们需要预测未来,因此也需要设置相应的变点的位置,从代码中看,在 forecaster.py 的 sample_predictive_trend 函数中,通过 Poisson 分布等概率分布方法找到新增的 changepoint_ts_new 的位置,然后与 changepoint_t 拼接在一起就得到了整段序列的 changepoint_ts。

changepoint_ts_new = 1 + np.random.rand(n_changes) * (T - 1)
changepoint_ts = np.concatenate(
### Prophet模型的主要特征和工作机制 Prophet是一种专门用于时间序列预测的模型,由Facebook开发。其设计允许捕捉时间序列数据中的多种特征,如趋势、季节性和假日效应等,并提供了一种机制来评估预测性能并根据需要进行调整[^1]。 #### 主要特征 1. **趋势性**: - Prophet可以自动识别时间序列中的长期趋势,包括线性和非线性变化。 2. **季节性**: - 支持多周期季节性建模,能够处理每日、每周和每年的重复模式。 3. **节假日效应**: - 可以将特定日期或事件(如节假日)对数据的影响纳入模型中,从而提高预测准确性。 4. **参数可解释性**: - 模型具有高度的可解释性,用户可以直接查看各个成分对总趋势的影响程度[^3]。 5. **灵活性与易用性**: - 提供了直观的接口,使得即使是非专业人员也能够轻松地进行模型训练和预测。 6. **可视化能力**: - 内置强大的绘图功能,便于直接观察预测结果及各组成部分的作用。 7. **健壮性**: - 对缺失值和异常点有较好的容忍度,不需要严格的预处理步骤即可工作。 #### 工作机制 - **建模阶段**: - 使用带有可解释参数的加法模型拟合时间序列数据,其中包含了趋势项、季节项以及节假日项等多个组成部分。 - **预测阶段**: - 在完成模型训练后,可以通过生成未来时间点的数据来进行预测,并利用基准结果衡量现有模型的表现。 - **反馈调整**: - 当检测到模型效果不佳时,支持人工干预以改进模型设置,然后基于反馈进一步优化模型[^2]。 下面是一个简单的Python代码示例,展示如何使用Prophet库创建一个基础的时间序列预测模型: ```python import pandas as pd from prophet import Prophet # 加载示例数据集 df = pd.read_csv('https://mirror.coggle.club/prophet/example_wp_log_peyton_manning.csv') # 定义并训练模型 m = Prophet() m.fit(df) # 推理未来的日期,并进行预测 future = m.make_future_dataframe(periods=365) forecast = m.predict(future) ``` 这段代码首先加载了一个包含两列的数据集:`ds`(日期)和`y`(目标变量),接着定义了一个Prophet实例并对其进行训练,最后为接下来的一年生成了预测值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值