公众号:尤而小屋
编辑:Peter
作者:Peter
大家好,我是Peter~
本文是时间序列预测神器Prophet的第三篇:使用Prophet实现突变点预测
在真实的时间序列数据中常常会出现轨迹的突变点,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)