时间序列预测神器Prophet【教程3】:突变点预测

情感   2024-11-27 12:30   中国  

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

大家好,我是Peter~

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

时间序列预测神器Prophet【教程1】:极简入门案例

时间序列预测神器Prophet【教程2】:饱和预测

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

导入库

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')

读取数据

读取在线数据:

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]:

m = Prophet()
m.fit(df)
09:18:15 - cmdstanpy - INFO - Chain [1] start processing
09:18:16 - cmdstanpy - INFO - Chain [1] done processing

Out[3]:

<prophet.forecaster.Prophet at 0x784fe27ee9e0>

3.2 构建预测数据

In [4]:

future = m.make_future_dataframe(periods=365)  # 指定预测一年的数据
future

实施预测过程:

In [5]:

forecast = m.predict(future)
forecast.head()

全部字段信息:

In [6]:

forecast.columns  # 生成预测数据的全部字段信息

Out[6]:

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]:

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]:

m = Prophet(changepoint_prior_scale=0.5)  # 默认值
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

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

In [9]:

m = Prophet(changepoint_prior_scale=0.001)   
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

增加值的效果:

In [10]:

m = Prophet(changepoint_prior_scale=1)   
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

5 指定突变点位置

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

In [11]:

m = Prophet(changepoints=['2014-01-01'])  #  指定突变点的位置
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

尤而小屋
尤而小屋,一个温馨且有爱的小屋🏡 小屋主人,一手代码谋求生存,一手掌勺享受生活,欢迎你的光临~
 最新文章