prophet中文翻译(四)

发布时间 2023-05-17 09:33:03作者: 明天OoO你好

趋势变化点

你可能已经在文档的前面示例中注意到,实时时间序列经常会在其轨迹中出现突然的变化。默认情况下,Prophet将自动检测这些变化点,并使趋势适应相应的变化。然而,如果你希望对这个过程有更精细的控制(例如,Prophet错过了一个速率变化,或者在历史数据中过度拟合了速率变化),那么你可以使用几个输入参数来实现这一点。

Prophet中的自动变点检测


Prophet通过首先指定大量的"潜在变点"来检测变点,这些潜在变点表示速率允许改变的位置。然后,Prophet在速率变化的幅度上施加了稀疏先验(相当于L1正则化),这意味着Prophet有很多可能的速率变化位置,但会尽可能少地使用它们。以快速开始章节中的Peyton Manning预测为例,默认情况下,Prophet在时间序列的前80%均匀放置了25个潜在变点。以下图中的垂直线表示潜在变点的位置:

image

尽管我们有很多可能发生速率变化的位置,但由于稀疏先验的存在,大部分这些变点是没有被使用的。我们可以通过绘制每个变点处速率变化的幅度来看到这一点:

image

潜在变点的数量可以使用参数n_changepoints进行设置,但更好的调整方法是通过调整正则化参数来实现。重要变点的位置可以通过以下方式进行可视化:

# Python
from prophet.plot import add_changepoints_to_plot
fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), m, forecast)

image

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

调整趋势的灵活性


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

# Python
m = Prophet(changepoint_prior_scale=0.5)
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

image

Decreasing it will make the trend less flexible:
减小该值将使趋势有更低的灵活性:

# Python
m = Prophet(changepoint_prior_scale=0.001)
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

image

在可视化预测结果时,如果趋势看起来过拟合或欠拟合,可以根据需要调整该参数。在完全自动化的设置中,可以参考交叉验证的文档,了解如何调整该参数的建议。

(译者注:交叉验证(Cross Validation)是一种用于评估机器学习模型性能的统计技术。它通过将数据集划分为训练集和验证集,并多次重复此过程,以获得对模型性能的更准确评估。
常见的交叉验证方法包括K折交叉验证(K-Fold Cross Validation)和留一交叉验证(Leave-One-Out Cross Validation)。在K折交叉验证中,数据集被划分为K个相等的子集(折),其中K-1个子集用于训练模型,剩下的1个子集用于验证模型性能。这个过程重复K次,每个子集都会作为验证集一次,最终将K次验证结果的平均值作为模型的性能指标。
通过交叉验证,我们可以更准确地评估模型在未见过的数据上的性能,而不仅仅是依赖于单次的训练和验证过程。它能够帮助我们判断模型是否过拟合(高方差)或欠拟合(高偏差),并优化模型的参数或选择更合适的模型。
在机器学习和数据科学中,交叉验证是一种常用的评估模型性能的技术,可以帮助我们更好地理解和比较不同模型的效果,并选择最佳的模型配置。)

指定变点的位置

如果想不使用自动变点检测,可以通过changepoints参数手动指定潜在变化点的位置。在这种情况下,斜率变化只会在这些点上发生,并且仍然使用相同的稀疏正则化。可以创建一个网格点集合,类似于自动检测的方式,然后再添加一些已知可能发生变化的特定日期。或者,变化点可以完全限定在一组特定的日期上,就像下面的例子中所做的那样:

# Python
m = Prophet(changepoints=['2014-01-01'])
forecast = m.fit(df).predict(future)
fig = m.plot(forecast)

image