prophet(3)

1预测饱和减少
logistic增长模型还可以处理饱和最小值,方法与指定最大值的列的方式相同:
在这里插入图片描述
在这里插入图片描述
2趋势突变点
在之前的部分,我们可以发现真实的时间序列数据往往在趋势中存在一些突变点。默认情况下, Prophet 将自动监测到这些点,并对趋势做适当地调整。不过,要是对趋势建模时发生了一些问题,例如:Prophet 不小心忽略了一个趋势速率的变化或者对历史数据趋势变化存在过拟合现象。如果我们希望对趋势的调整过程做更好地控制的话,那么下面将会介绍几种可以使用的方法。
1.Prophet 中的自动监测突变点
Prophet 首先是通过在大量潜在的突变点(变化速率突变)中进行识别来监测突变点的。之后对趋势变化的幅度做稀疏先验(等同于 L1 正则化)——实际上 Prophet 在建模时会存在很多变化速率突变的点,但只会尽可能少地使用它们。以 第一部分中佩顿 · 曼宁的数据为例,默认下, Prophet 会识别出 25 个潜在的突变点(均匀分布在在前 80% 的时间序列数据中)。下图中的竖线指出这些潜在的突变点所在的位置。

在这里插入图片描述
虽然存在很多变化速率可能会突变的点,但由于做了稀疏先验,绝大多数突变点并不会包含在建模过程中。如下图所示,通过观察对每个突变点绘制的速率变化值图,可以发现这一点。
在这里插入图片描述
潜在突变点的数量可以通过设置 n_changepoints 参数来指定,但最好还是利用调整正则化过程来修正。
显著的突变点的位置可以通过以下代码获得:
在这里插入图片描述
在这里插入图片描述
默认情况下,只有在时间序列的前80%才会推断出突变点,以便有足够的长度来预测未来的趋势,并避免在时间序列的末尾出现过度拟合的波动。这个默认值可以在很多情况下工作,但不是所有情况下都可以,可以使用changepoint_range参数进行更改。例如,Python中的m = Prophet(changepoint_range=0.9)。这意味着将在时间序列的前90%处寻找潜在的变化点。
3调整趋势的灵活性
如果趋势的变化被过度拟合(即过于灵活)或者拟合不足(即灵活性不够),可以利用输入参数 changepoint_prior_scale 来调整稀疏先验的程度。默认下,这个参数被指定为 0.05 。

增加这个值,会导致趋势拟合得更加灵活。代码和图如下所示:
在这里插入图片描述
减少这个值,会导致趋势拟合得灵活性降低。代码和图如下所示:
在这里插入图片描述
3.3 指定突变点的位置
如果你希望手动指定潜在突变点的位置而不是利用自动的突变点监测,可以使用 changepoints 参数。

代码和图如下所示:
m = Prophet(changepoints=[‘2014-01-01’])
m.fit(df)
future = m.make_future_dataframe(periods=365)
forecast = m.predict(future)m.plot(forecast);
在这里插入图片描述
4季节性,假期效果和回归量
对假期和特征事件建模
如果需要专门对节假日或者其它的事件进行建模,你就必须得为此创建一个新的dataframe,其中包含两列(节假日 holiday 和日期戳 ds ),每行分别记录了每个出现的节假日。
这个数据框必须包含所有出现的节假日,不仅是历史数据集中还是待预测的时期中的。如果这些节假日并没有在待预测的时期中被注明, Prophet 也会利用历史数据对它们建模,但预测未来时却不会使用这些模型来预测。
注:也就是说,在待预测的日期里,我们也必须指定所有出现的节假日。
你可以在这个数据框基础上再新建两列 lower_window 和 upper_window ,从而将节假日的时间扩展成一个区间 [ lower_window , upper_window ] 。举例来说,如果想将平安夜也加入到 “圣诞节” 里,就设置 lower_window = -1 , upper_window = 0 ;如果想将黑色星期五加入到 “感恩节” 里,就设置 lower_window = 0 , upper_window = 1 。
下面我们创建一个数据框,其中包含了所有佩顿 · 曼宁参加过的决赛日期:
在这里插入图片描述
上述代码中,我们将超级碗的日期既记录在了决赛的日期数据框中,也记录在了超级碗的日期数据框中。这就会造成超级碗日期的效应会在决赛日期的作用下叠加两次。
一旦这个数据框创建好了,就可以通过传入 holidays 参数使得在预测时考虑上节假日效应。这里我们仍以第一部分中佩顿 · 曼宁的数据为例:
在这里插入图片描述
可通过 forecast 数据框,来展示节假日效应:可通过 forecast 数据框,来展示节假日效应:

在这里插入图片描述
在成分分析的图中,如下所示,也可以看到节假日效应。我们可以发现,在决赛日期附近有一个穿透,而在超级碗日期时穿透则更为明显。
fig = m.plot_components(forecast)
在这里插入图片描述
在这里插入图片描述
可以使用 plot_forecast_component(从fbprophet.plot导入)来画出独立的节假日的成分。类似如下代码:
from fbprophet.plot import plot_forecast_componentm.plot_forecast_component(forecast, ‘superbowl’)
在这里插入图片描述
5季节性的傅里叶级数
季节性是用部分傅里叶和估计的。有关完整的细节,请参阅论文,以及维基百科上的这个图,以说明部分傅里叶和如何近似于一个线性周期信号。部分和(order)中的项数是一个参数,它决定了季节性的变化有多快。为了说明这一点, 我们仍似乎用第一部分中佩顿 · 曼宁的数据。每年季节性的默认傅立叶级数是10,这就产生了这样的拟合:
在这里插入图片描述
默认值10通常是合适的,但是当季节性需要适应更高频率的变化时,它们可以增加,并且通常不那么平滑。在实例化模型时,可以为每个内置季节性指定傅立叶级数,这里增加到20:
在这里插入图片描述
可以看到,曲线更加的多变了。增加傅立叶项的数量可以使季节性适应更快的变化周期,但也可能导致过度拟合:N个傅立叶项对应于用于建模周期的2N个变量。
自定义季节性因素
如果时间序列超过两个周期,Prophet将默认适合每周和每年的季节性。对于子日(sub-daily )时间序列,它也将适合每日的季节性。在Python中,可以使用add_seasality方法添加其它季节性(如每月、每季、每小时)。

这个函数的输入是一个名字,季节性的周期,以及季节性的傅里叶order。作为参考,默认情况下,Prophet为周季节性设定的傅立叶order为3,为年季节性设定的为10。add_seasality的一个可选输入是该季节性组件的先验规模。
作为一个例子,我们仍使用佩顿 · 曼宁的数据,但是用每月的季节性替换每周的季节性。每月的季节性将出现在组件图中:
在这里插入图片描述
在这里插入图片描述
6对节假日和季节性设定先验规模
如果发现节假日效应被过度拟合了,通过设置参数 holidays_prior_scale 可以调整它们的先验规模来使之平滑,默认下该值取 10 。
减少这个参数会降低假期效果:
在这里插入图片描述
和之前相比,节假日效应的规模被减弱了,特别是对观测值较少的超级碗而言。类似的,还有一个 seasonality_prior_scale 参数可以用来调整模型对于季节性的拟合程度。
可以通过在节假日的dataframe中包含一个列prior_scale来单独设置先验规模。独立的季节性的先验规模可以作为add_seasonality的参数传递。例如,可以使用以下方法设置每周季节性的先验规模:
m = Prophet()m.add_seasonality( name=‘weekly’, period=7, fourier_order=3, prior_scale=0.1)
7附加的回归量
可以使用add_regressor方法将附加的回归量添加到模型的线性部分。包含回归值的列需要同时出现在拟合数据格式(fit)和预测数据格式(predict)中。例如,我们可以在NFL赛季的周日添加附加的效果。在成分图上,这种效果会出现在“extra_regre_”图中:
在这里插入图片描述
NFL周日也可以使用之前描述的“节假日”的接口,通过创建一个过去和未来NFL周日的list。add_regressor函数为定义附加的线性回归函数提供了一个更通用的接口,特别是它不要求回归函数是二进制指示器。
add_regressor函数具有可选的参数,用于指定先验规模(默认情况下使用节假日先验规模),和指定是否标准化回归量。help(Prophet.add_regressor)可以查看相关参数。
附加的回归量必须要知道历史和未来的日期。因此,它要么是已知未来值(比如nfl_sunday),要么是其他地方已经单独预测出的结果。如果回归量在整个历史中都是不变的,则Prophet会引发一个错误,因为没有任何东西可以fit它。
附加的回归量被放在模型的线性分量中,所以依赖于附加的回归量时间序列作为底层模型的加法或乘法因子。
参考文章:https://blog.csdn.net/anshuai_aw1/article/details/83412058

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值