在Python中使用Holt-Winters进行预测

24
我一直在尝试使用Python中的Holt-Winters算法实现进行时间序列预测,但遇到了障碍...基本上,对于某些(正)输入系列,它有时会预测负数,这显然不应该是这种情况。即使预测结果不是负数,它们有时也非常不准确——比它们应该高/低几个数量级。增加算法所需的数据周期似乎没有帮助,事实上通常会使预测变得更糟。

我使用的数据具有以下特征,可能是问题:

  • 采样非常频繁(每15分钟一个数据点,而不是月度数据,如示例所示),但从我读过的内容来看,Holt-Winters算法不应该有问题。也许这表明实现存在问题?

  • 具有多个周期性-每天都有高峰期(即每96个数据点),以及周末数据明显低于工作日数据的每周循环-例如,工作日可以达到4000,但周末只有1000左右-但即使我只提供工作日数据,仍然遇到负数问题。

我是否忽略了Holt-Winters算法的实现或使用中的某些内容?我不是统计学家,因此我使用上面链接中指示的alpha、beta和gamma的“默认”值-这可能是问题吗?有更好的方法来计算这些值吗?

或者......这里是否有比Holt-Winters更好的算法可用?最终,我只想从历史数据中创建出合理的预测。我已经尝试了单指数平滑和双指数平滑,但是(据我所知)两种方法都不支持数据周期性。

任何帮助/输入都将不胜感激!


1
能否提供一小段数据,以便确定产生错误输出的原因? - Mu Mind
5
有趣的问题,但是除了偶尔使用Python之外,它与主题无关。这更适合于http://stats.stackexchange.com/。 - Mike DeSimone
你能解释一下为什么你认为算法不应该产生负预测的原因吗?这是基于你对算法的理解还是基于数据是正数的知识? - mitchus
5个回答

2
我尝试生成随机数据,直到获得有趣的结果。在这里,我输入了所有正数,并得到了负面的预测:
y = [0.92, 0.78, 0.92, 0.61, 0.47, 0.4, 0.59, 0.13, 0.27, 0.31, 0.24, 0.01]
holtwinters(y, 0.2, 0.1, 0.05, 4)

...
forecast: -0.104857182966
forecast: -0.197407475203
forecast: -0.463988558577
forecast: -0.258023593197

但请注意,预测结果符合数据的负斜率。

这可能就是你所说的数量级:

y = [0.1, 0.68, 0.15, 0.08, 0.94, 0.58, 0.35, 0.38, 0.7, 0.74, 0.93, 0.87]
holtwinters(y, 0.2, 0.1, 0.05, 4)

...
forecast: 1.93777559066
forecast: 3.11109138055
forecast: 0.910967977635
forecast: 0.684668348397

但我不确定您如何认为它非常不准确或判断它“应该”更低。


每当您推断数据时,结果可能会有些令人惊讶。您更担心实现可能不正确还是输出对您特定的使用没有良好的属性?


我所说的数量级是针对输入值从未超过4k或者相同情况下出现负值的100k预测。但是,是前者而不是后者,尽管我开始怀疑H-W算法是否是首选算法。 - Wern

1
首先,如果您对算法的具体实现不确定,我建议您为此创建一些测试用例。使用另一个实现,比如Matlab或其他您知道可以正常工作的工具。生成一些输入数据,将其提供给参考和您的实现,它们应该是相同的。我就是这样从Matlab翻译并验证了一些算法。scipy.io.loadmat非常适合这个任务。
关于您对算法的使用:您谈到了天和周的周期性,并在分钟级别上提供数据。我不知道这个特定的算法是否能够很好地处理这种情况,但无论如何,我建议您尝试进行一些低通滤波,然后每小时甚至更慢地将其提供给算法。对于一个周期来说,近700个时间步骤可能太多了,难以识别。您提供的数据还应包含至少两个完整周期的时间序列。如果您的算法支持周期性,您还必须以适当的方式向其提供数据,以便它实际上可以“看到”周期性。您得到这些极值的事实可能表明,该算法只有在一个方向上具有稳定趋势的数据。
也许您还想将您的预测分开,一个针对每周的优化,另一个则是日内的,最后再将它们组合起来。

0

在选择适当的预测方法之前,分析时间序列属性非常重要。

1 - 在应用Holt-Winters之前,检查时间序列是否平稳很重要。如果不平稳,则需要进行差分以实现这种属性,从而提高准确性。

2 - 数据可能会随着时间周期性地变化,看似趋势可能实际上是大周期的一部分。如果是这种情况(确实如此),则可以为每个季节周期应用两次Holt-Winters,因为它无法处理多个周期性,然后分析哪种方法更适合您的情况。

3 - 尝试不同的平滑参数(alpha、beta和gamma)可能很重要。它们越大,最近的观察值和最后计算的组件就越重要。尝试找到自适应的Holt-Winters实现,它可以自动调整这些参数,以查看发生了什么。

我建议您使用R语言,其中包含一个自适应且易于使用的Holt-Winters实现,通过forecast包提供,因此您可以轻松地尝试不同的配置。


0

我认为这种方法的问题在于他们如何计算初始值。他们似乎在使用线性模型,而:

这是一种非常糟糕的方法,不应该用于趋势会受到季节性模式影响的情况。想象一下一个季节性模式,例如,每年的最后一个时期总是该年的最大值。那么趋势将被偏向上方。不幸的是,Bowerman、O'Connell和Koehler(2005)并不是唯一推荐糟糕方法的人。我在其他书籍中看到过类似的,甚至更糟糕的程序。[1]

更好的方法是将时间序列分解为趋势和季节性[1]。

[1] http://robjhyndman.com/hyndsight/hw-initialization/


-4
你观察到数据中有周期性,这意味着你应该尝试使用能够表达这种特征的模型。
Holt-Winters是一个简单的平滑模型,不能表达这种特征。
经典方法是考虑ARMA模型(自回归移动平均),以及其自然扩展SARIMA(季节性调整...)模型。
底线: 这实际上是一个统计学问题。关于这个主题最好的文献之一是Maddala的计量经济学。

7
这里我很难完全同意。Holt-Winters是一种季节性预测方法,当然它可以处理周期性。但是,它无法处理多个周期性,标准的SARIMA模型也不能。Maddala的书对于预测方面的内容覆盖不足。 - Rob Hyndman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接