机器学习笔记⼆-----------------Prophet(时间序列模型)的复杂
例程笔。。。
⼀,重要参数的意义说明
1, Prophet()模型参数说明
Prophet()参数说明
growth: ‘linear‘’或’logistic’⽤来规定线性或逻辑曲线趋势'.(默认‘linear’)
changepoints: 指定潜在改变点,如果不指定,将会⾃动选择潜在改变点。例如:changepoints=['2014-01-01']指定2014-01-01这⼀天是潜在的changepoints。(默认None)
n_changepoints: 表⽰changepoints的数量⼤⼩,如果changepoints指定,该传⼊参数将不会被使⽤。如果 changepoints不指定,将会从输⼊的历史数据前80%中选取25个(个数由n_changepoints传⼊参数决定)潜在改变点。(默认25)
changepoint_range: Proportion of history in which trend changepoints will be estimated. Defaults to 0.8
for the first 80%. Not ud if `changepoints` is specified.Not ud if input `changepoints` is supplied.估计趋势变化点的历史⽐例。如果指定了
`changepoints`,则不使⽤。(默认0.8)
scores
yearly_asonality: 指定是否分析数据的年季节性,如果为True, 默认取傅⾥叶项为10,最后会输
出,yearly_trend,yearly_upper,yearly_lower等数据。(默认auto)
weekly_asonality: 指定是否分析数据的周季节性,如果为True,默认取傅⾥叶项10,最后会输
出,weekly_trend,weekly_upper,weekly_lower等数据。(默认auto)
daily_asonality: 指定是否分析数据的天季节性,如果为True,默认取傅⾥叶项为10,最后会输出,daily _trend, daily _upper, daily _lower等数据。(默认auto)
2006年高考试题
holidays: 传⼊pd.dataframe 格式的数据。这个数据包含有holiday列 (string)和ds(date类型)和可选列lower_window和
upper_window来指定该⽇期的lower_window或者upper_window范围内都被列为假期。lower_window=-2将包括前2天的⽇期作为假期。(默认None)
asonality_mode: 'additive' (default) or 'multiplicative'.季节模型。(默认additive)
asonality_prior_scale: 调节季节性组件的强度。值越⼤,模型将适应更强的季节性波动,值越⼩,越抑制季节性波动。(默认10)
holidays_prior_scale:调节节假⽇模型组件的强度。值越⼤,该节假⽇对模型的影响越⼤,值越⼩,节假⽇的影响越⼩。(默认10)
changepoint_prior_scale: 增长趋势模型的灵活度。调节”changepoint”选择的灵活度,值越⼤选择的”changepoint”越多,使模型对历史数据的拟合程度变强,然⽽也增加了过拟合的风险。(默认0.05)
mcmc_samples: If 0, will do 采样,⽤于获得预测未来的不确定性。若⼤于0,将做mcmc样本的全贝叶斯推理,如果为0,将做最⼤后验估计。(默认0)
interval_width:衡量未来时间内趋势改变的程度。表⽰预测未来时使⽤的趋势间隔出现的频率和幅度与历史数据的相似度,值越⼤越相似。当mcmc_samples = 0时,该参数仅⽤于增长趋势模型的改变程度,当mcmc_samples > 0时,该参数也包括了季节性趋势改变的程度。(默认0.8)
uncertainty_samples: ⽤于估计不确定性区间的模拟抽取数。(默认1000)
2、 make_future_dataframe()参数说明
def make_future_dataframe(lf, periods, freq='D', include_history=True):
periods: 向前预测步数
freq: ’H’、 'D' or 'M'.预测单位⼩时为’H’,天为’D’,⽉为’M’
一月英文缩写
include_history: 是否包含历史数据的预测,保持默认就好。
⼆,Prophet(时间序列模型)可调节参数⽰例
1,Prophet 中的⾃动变化点检测范围
need you nowProphet 通过⾸先指定允许速率变化的⼤量潜在变化点来检测变化点。然后它对速率变化的幅度进⾏稀疏先验(相当于 L1 正则化)——这本质上意味着 Prophet 有⼤量可能的地⽅可以改变速率,但会尽可能少地使⽤它们。默认情况下,Prophet 指定了 25 个潜在的变化点,它们均匀地放置在时间序列的前 80% 中。使⽤上节中的第⼀个例⼦说明。
可以使⽤参数设置潜在变化点的数量n_changepoints,但通过调整正则化可以更好地调整。意义变化点的位置可以通过以下⽅式可视化:
from prophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
betterintimea = add_changepoints_to_a(), m, forecast)
默认情况下,仅为时间序列的前 80% 推断变化点,以便有⾜够的跑道来预测未来趋势并避免在时间序列结束时过度拟合波动。此默认值适⽤于许多情况,但不是全部,并且可以使⽤changepoint_range参数进⾏更改。python中更改该参数的⽅法为:
m = Prophet(changepoint_range=0.9)
备注:
由于pycharm 对该算法的可视化显⽰很差,所以需要在linux下安装jupyter,并使其⽀持多个虚拟环境,
可以借鉴以下的教程进⾏配置
估计趋势变化点的历史⽐例。如果指定了 `changepoints`,则不使⽤。(默认0.8)
2,调整趋势灵活性
如果趋势变化过拟合(灵活性太⼤)或⽋拟合(灵活性不够),可以使⽤输⼊参数调整稀疏先验的强度changepoint_prior_scale。默认情况下,此参数设置为 0.05。增加它将使趋势更加灵活:
m = Prophet(changepoint_prior_scale=0.5)
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)
可通过 forecast 数据框,来展⽰节假⽇效应:
# 看⼀下假期的最后10⾏数据
forecast[(forecast['playoff'] + forecast['superbowl']).abs() > 0][
['ds', 'playoff', 'superbowl']][-10:]
三,季节性,假期效果和回归量
1,对假期和特征事件建模
1.1 ⾃定义指定⽇期的⽅法
如果需要专门对节假⽇或者其它的事件进⾏建模,你就必须得为此创建⼀个新的dataframe,其中包含两列(节假⽇ holiday 和⽇期戳ds ),每⾏分别记录了每个出现的节假⽇。这个数据框必须包含所有出现的节假⽇,不仅是历史数据集中还是待预测的时期中的。如果这些节假⽇并没有在待预测的时期中被注明, Prophet 也会利⽤历史数据对它们建模,但预测未来时却不会使⽤这些模型来预测。
注:也就是说,在待预测的⽇期⾥,我们也必须指定所有出现的节假⽇。
你可以在这个数据框基础上再新建两列 lower_window 和 upper_window ,从⽽将节假⽇的时间扩展成⼀个区间 [ lower_window , upper_window ] 。举例来说,如果想将平安夜也加⼊到 “圣诞节” ⾥,就设置 lower_window = -1 , upper_window = 0 ;如果想将⿊⾊星期五加⼊到 “感恩节” ⾥【感恩节的第⼆天是⿊⾊星期五】,就设置 lower_window = 0 , upper_window = 1 。
下⾯我们创建⼀个数据框,其中包含了所有佩顿 · 曼宁参加过的决赛⽇期:
#季后赛
playoffs = pd.DataFrame({
'holiday': 'playoff',
'ds': pd.to_datetime(['2008-01-13', '2009-01-03', '2010-01-16',
'2010-01-24', '2010-02-07', '2011-01-08',
'2013-01-12', '2014-01-12', '2014-01-19',
'2014-02-02', '2015-01-11', '2016-01-17',
'2016-01-24', '2016-02-07']),
'lower_window': 0,
'upper_window': 1,
})
#超级碗
superbowls = pd.DataFrame({
'holiday': 'superbowl',
'ds': pd.to_datetime(['2010-02-07', '2014-02-02', '2016-02-07']),
'lower_window': 0,
'upper_window': 1,
})
#节⽇是两个的节假⽇的叠加
holidays = pd.concat((playoffs, superbowls))
上述代码中,我们将超级碗的⽇期既记录在了决赛的⽇期数据框中,也记录在了超级碗的⽇期数据框中。这就会造成超级碗⽇期的效应会在决赛⽇期的作⽤下叠加两次。(意味着两个强效应的叠加)
节⽇效果可以在forecast数据框中看到。使⽤下述代码
forecast[(forecast['playoff'] + forecast['superbowl']).abs() > 0][
['ds', 'playoff', 'superbowl']][-10:]
⼀旦这个数据框创建好了,就可以通过传⼊ holidays 参数使得在预测时考虑上节假⽇效应。这⾥我们仍以第⼀部分中佩顿 · 曼宁的数据为例:
import pandas as pd
import numpy as np
from fbprophet import Prophet
df = pd.read_csv('example_wp_log_peyton_manning.csv')
#专门对节假⽇或者其它的事件进⾏建模,你就必须得为此创建⼀个新的dataframe
#其中包含两列(节假⽇ holiday 和⽇期戳 ds )
#季后赛
playoffs = pd.DataFrame({
'holiday': 'playoff',
'ds': pd.to_datetime(['2008-01-13', '2009-01-03', '2010-01-16',
'2010-01-24', '2010-02-07', '2011-01-08',
sport是什么意思'2013-01-12', '2014-01-12', '2014-01-19',
'2014-02-02', '2015-01-11', '2016-01-17',
'2016-01-24', '2016-02-07']),
'lower_window': 0,
'upper_window': 1,
出国学习})
#超级碗
伤害英文superbowls = pd.DataFrame({
'holiday': 'superbowl',
dutch wife'ds': pd.to_datetime(['2010-02-07', '2014-02-02', '2016-02-07']),
'lower_window': 0,
'upper_window': 1,
})
holidays = pd.concat((playoffs, superbowls))#季后赛和超级碗⽐赛特别⽇期
lipinm = Prophet(holidays=holidays)#指定节假⽇参数,其它参数以默认值进⾏训练
m.fit(df)#对过去数据进⾏训练
future = m.make_future_dataframe(freq='D',periods=365)#建⽴数据预测框架,数据粒度为天,预测步长为⼀年forecast =m.predict(future)
print(forecast)
m.plot(forecast).show()#绘制预测效果图
m.plot_components(forecast).show()#绘制成分趋势图