💡说明

安装

快速开始

饱和预测

趋势变化点

https://facebook.github.io/prophet/docs/trend_changepoints.html

趋势变化点

你可能已经注意到,在本文档的早期例子中,实时序列的轨迹经常会有突然的变化,默认情况下,Prophet会自动检测这些变化点,并允许趋势进行适当的调整。默认情况下,Prophet会自动检测这些变化点,并允许趋势进行适当的调整。然而,如果你希望对这个过程有更精细的控制(例如,Prophet错过了一个速率变化,或者在历史上过度拟合速率变化),那么你可以使用几个输入参数。

Prophet中的检测自动变化点

Prophet通过首先指定大量允许速率变化的潜在变化点来检测变化点。然后,它在率变化的幅度上放一个稀疏的先验(相当于L1正则化)–这本质上意味着Prophet有大量可能的率变化点,但会尽可能少地使用它们。考虑快速开始中的佩顿-曼宁预测。默认情况下,Prophet指定了25个潜在的变化点,这些变化点统一放置在时间序列的前80%。本图中的垂直线表示潜在变化点的位置。

https://facebook.github.io/prophet/static/trend_changepoints_files/trend_changepoints_4_0.png

png

尽管我们有很多地方可能会改变速率,但由于稀疏的先验,这些变化点大部分都没有被使用。我们可以通过绘制每个变化点的速率变化幅度来观察。

https://facebook.github.io/prophet/static/trend_changepoints_files/trend_changepoints_6_0.png

png

潜在的变化点的数量可以通过参数n_changepoints来设置,但这可以通过调整正则化来更好地调整。符号变化点的位置可以用以下方法可视化:

# Rplot(m, forecast) + add_changepoints_to_plot(m)
# Pythonfrom fbprophet.plot import add_changepoints_to_plotfig = m.plot(forecast)a = add_changepoints_to_plot(fig.gca(), m, forecast)

https://facebook.github.io/prophet/static/trend_changepoints_files/trend_changepoints_9_0.png

png

默认情况下,变更点只对时间序列的前80%进行推断,以便有足够的runway 来预测未来的趋势,并避免在时间序列结束时过度拟合波动。这个默认值在很多情况下有效,但不是所有情况,可以使用changepoint_range参数来改变。例如,Python中的m = Prophet(changepoint_range=0.9)或R中的m <- prophet(changepoint.range = 0.9)将把潜在的变化点放在时间序列的前90%。

调整趋势灵活性

If the trend changes are being overfit (too much flexibility) or underfit (not enough flexibility), you can adjust the strength of the sparse prior using the input argument changepoint_prior_scale. By default, this parameter is set to 0.05. Increasing it will make the trend more flexible:

如果趋势变化被过度拟合(灵活性太大)或拟合不足(灵活性不够),可以使用输入参数changepoint_prior_scale调整稀疏先验的强度。默认情况下,这个参数被设置为0.05。增加它将使趋势变得更加灵活。

# Rm <- prophet(df, changepoint.prior.scale = 0.5)forecast <- predict(m, future)plot(m, forecast)
# Pythonm = Prophet(changepoint_prior_scale=0.5)forecast = m.fit(df).predict(future)fig = m.plot(forecast)

https://facebook.github.io/prophet/static/trend_changepoints_files/trend_changepoints_13_0.png

png

减少这个参数会使趋势变得更不灵活。

# Rm <- prophet(df, changepoint.prior.scale = 0.001)forecast <- predict(m, future)plot(m, forecast)
# Pythonm = Prophet(changepoint_prior_scale=0.001)forecast = m.fit(df).predict(future)fig = m.plot(forecast)

https://facebook.github.io/prophet/static/trend_changepoints_files/trend_changepoints_16_0.png

png

在对预测进行可视化时,如果趋势似乎过于拟合或拟合不足,可以根据需要调整该参数。在全自动设置中,请参见交叉验证文档,了解如何调整该参数的建议。

指定变更点的位置

如果你愿意,你可以用changepoints参数手动指定潜在的变化点的位置,而不是使用自动变化点检测。然后,只允许在这些点上进行坡度变化,并采用与之前相同的稀疏规则化。例如,我们可以像自动完成的那样,创建一个点的网格,但是用一些已知可能会发生变化的特定日期来增强这个网格。另一个例子是,可以像这里一样,将变化点完全限制在一小组日期中。

# Rm <- prophet(df, changepoints = c('2014-01-01'))forecast <- predict(m, future)plot(m, forecast)
# Pythonm = Prophet(changepoints=['2014-01-01'])forecast = m.fit(df).predict(future)fig = m.plot(forecast)

https://facebook.github.io/prophet/static/trend_changepoints_files/trend_changepoints_21_0.png

png