公众号:尤而小屋 编辑: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
Out3:
<prophet.forecaster.Prophet at 0x784fe27ee9e0>
In 4:
future = m.make_future_dataframe(periods=365) # 指定预测一年的数据
future
实施预测过程:
In 5:
forecast = m.predict(future)
forecast.head()
全部字段信息:
In 6:
forecast.columns # 生成预测数据的全部字段信息
Out6:
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')
In 7:
from prophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), m, forecast)
如果趋势变化出现了过拟合(灵活性过高)或欠拟合(灵活性不足)的情况,你可以通过使用输入参数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)
除了使用自动变点检测之外,还可以使用changepoints参数手动指定潜在变点的位置。
In 11:
m = Prophet(changepoints=['2014-01-01']) # 指定突变点的位置
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。