前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >时间序列神器Prophet: 如何实现突变点预测

时间序列神器Prophet: 如何实现突变点预测

原创
作者头像
皮大大
发布2024-11-22 13:52:07
发布2024-11-22 13:52:07
15600
代码可运行
举报
文章被收录于专栏:时序预测
运行总次数:0
代码可运行

公众号:尤而小屋 编辑:Peter 作者:Peter

大家好,我是Peter~

本文是时间序列预测神器Prophet的第三篇:使用Prophet实现突变点预测

在真实的时间序列数据中常常会出现轨迹的突变点,Prophet会自动检测这些点

导入库

代码语言:python
代码运行次数:0
复制
import numpy as np
import pandas as pd
import os
import datetime 
import time
import re
np.random.seed(42)   

import plotly_express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import matplotlib.pyplot as plt
%matplotlib inline
# 设置支持中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] 
# 设置图像标题字体
plt.rcParams['axes.unicode_minus'] = False
import seaborn as sns
sns.set_theme(style="darkgrid")

import statsmodels.api as sm
import statsmodels.formula.api as smf
from statsmodels.tsa.stattools import adfuller
from sklearn.metrics import r2_score,mean_squared_error,mean_squared_log_error

from prophet import Prophet 

import warnings
warnings.filterwarnings('ignore')

读取数据

读取在线数据:

代码语言:python
代码运行次数:0
复制
df = pd.read_csv("https://raw.githubusercontent.com/facebook/prophet/main/examples/example_wp_log_peyton_manning.csv")
# df.to_csv("data.csv",index=False)  # 保存到本地
df

自动预测突变点

默认情况下,只有在时间序列的前80%才会推断出突变点;但是可以通过参数changepoint_range进行设置,例如,Python中的m = Prophet(changepoint_range=0.9)。这意味着将在时间序列的前90%处寻找潜在的突变点。

搭建模型

In 3:

代码语言:python
代码运行次数:0
复制
m = Prophet()
m.fit(df)
09:18:15 - cmdstanpy - INFO - Chain [1] start processing
09:18:16 - cmdstanpy - INFO - Chain [1] done processing

Out3:

代码语言:python
代码运行次数:0
复制
<prophet.forecaster.Prophet at 0x784fe27ee9e0>

3.2 构建预测数据

In 4:

代码语言:python
代码运行次数:0
复制
future = m.make_future_dataframe(periods=365)  # 指定预测一年的数据
future

实施预测过程:

In 5:

代码语言:python
代码运行次数:0
复制
forecast = m.predict(future)
forecast.head()

全部字段信息:

In 6:

代码语言:python
代码运行次数:0
复制
forecast.columns  # 生成预测数据的全部字段信息

Out6:

代码语言:python
代码运行次数:0
复制
Index(['ds', 'trend', 'yhat_lower', 'yhat_upper', 'trend_lower', 'trend_upper',
       'additive_terms', 'additive_terms_lower', 'additive_terms_upper',
       'weekly', 'weekly_lower', 'weekly_upper', 'yearly', 'yearly_lower',
       'yearly_upper', 'multiplicative_terms', 'multiplicative_terms_lower',
       'multiplicative_terms_upper', 'yhat'],
      dtype='object')

3.3 模型可视化

In 7:

代码语言:python
代码运行次数:0
复制
from prophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), m, forecast)

4 调整趋势的灵活性

如果趋势变化出现了过拟合(灵活性过高)或欠拟合(灵活性不足)的情况,你可以通过使用输入参数changepoint_prior_scale来调整稀疏先验的强度。默认情况下,这个参数被设置为0.05,增加它的值会使趋势更加灵活。

In 8:

代码语言:python
代码运行次数:0
复制
m = Prophet(changepoint_prior_scale=0.5)  # 默认值
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

减少这个值,会导致趋势拟合得灵活性降低:

In 9:

代码语言:python
代码运行次数:0
复制
m = Prophet(changepoint_prior_scale=0.001)   
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

增加值的效果:

In 10:

代码语言:python
代码运行次数:0
复制
m = Prophet(changepoint_prior_scale=1)   
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

5 指定突变点位置

除了使用自动变点检测之外,还可以使用changepoints参数手动指定潜在变点的位置。

In 11:

代码语言:python
代码运行次数:0
复制
m = Prophet(changepoints=['2014-01-01'])  #  指定突变点的位置
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导入库
  • 读取数据
  • 自动预测突变点
    • 搭建模型
    • 3.2 构建预测数据
    • 3.3 模型可视化
  • 4 调整趋势的灵活性
  • 5 指定突变点位置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档