您可能已经在本文档的早期示例中注意到,实际时间序列经常在其轨迹中发生突变。 默认情况下,Prophet 将自动检测这些变化点,并将允许趋势进行适当的调整。 但是,如果您希望更精细地控制此过程(例如,Prophet 错过了速率变化,或者过度拟合了历史记录中的速率变化),则可以使用几个输入参数。

Prophet 中的自动变化点检测

Prophet 通过首先指定大量潜在的变化点来检测变化点,在该点允许速率更改。 然后,它在速率变化的幅度上施加一个稀疏先验(等效于 L1 正则化) - 这实际上意味着 Prophet 有大量可能可以更改速率的位置,但会尽可能少地使用它们。 考虑快速入门中的 Peyton Manning 预测。 默认情况下,Prophet 指定 25 个潜在的变化点,这些变化点均匀地放置在时间序列的前 80% 中。 此图中的垂直线指示放置潜在变化点的位置

png

即使我们有很多可以改变速率的地方,但由于稀疏先验,大多数这些变化点都未使用。 我们可以通过绘制每个变化点的速率变化幅度来看到这一点

png

潜在变化点的数量可以使用参数 n_changepoints 设置,但最好通过调整正则化来调整。 显着变化点的位置可以使用以下方法可视化

1
2
# R
plot(m, forecast) + add_changepoints_to_plot(m)
1
2
3
4
# Python
from prophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), m, forecast)

png

默认情况下,仅对时间序列的前 80% 推断变化点,以便为向前投影趋势留出足够的空间,并避免过度拟合时间序列末尾的波动。 此默认设置适用于许多情况,但并非所有情况都适用,可以使用 changepoint_range 参数进行更改。 例如,Python 中的 m = Prophet(changepoint_range=0.9) 或 R 中的 m <- prophet(changepoint.range = 0.9) 会将潜在变化点放置在时间序列的前 90% 中。

调整趋势灵活性

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

1
2
3
4
# R
m <- prophet(df, changepoint.prior.scale = 0.5)
forecast <- predict(m, future)
plot(m, forecast)
1
2
3
4
# Python
m = Prophet(changepoint_prior_scale=0.5)
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

png

减少它会使趋势不那么灵活

1
2
3
4
# R
m <- prophet(df, changepoint.prior.scale = 0.001)
forecast <- predict(m, future)
plot(m, forecast)
1
2
3
4
# Python
m = Prophet(changepoint_prior_scale=0.001)
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

png

在可视化预测时,如果趋势似乎过度拟合或欠拟合,可以根据需要调整此参数。 在完全自动化的设置中,请参阅关于交叉验证的文档,以获取有关如何调整此参数的建议。

指定变化点的位置

如果您愿意,而不是使用自动变化点检测,您可以使用 changepoints 参数手动指定潜在变化点的位置。 然后,只允许在这些点进行斜率更改,并具有与以前相同的稀疏正则化。 例如,可以像自动完成那样创建点网格,然后使用已知可能发生更改的一些特定日期来扩充该网格。 作为另一个示例,变化点可以完全限制为一小组日期,如此处所做的那样

1
2
3
4
# R
m <- prophet(df, changepoints = c('2014-01-01'))
forecast <- predict(m, future)
plot(m, forecast)
1
2
3
4
# Python
m = Prophet(changepoints=['2014-01-01'])
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

png

在 GitHub 上编辑