24

我一直在尝试使用Holt-Winters 算法的这种实现在 Python 中进行时间序列预测,但遇到了障碍......基本上,对于某些系列(正)输入,它有时会预测负数,这应该清楚并非如此。即使预测不是负面的,它们有时也会非常不准确——比应有的高/低几个数量级。给算法更多的数据周期似乎没有帮助,实际上往往会使预测变得更糟。

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

  • 非常频繁地采样(每 15 分钟一个数据点,而不是示例使用的每月数据) - 但根据我的阅读,Holt-Winters 算法应该没有问题。也许这表明实施存在问题?

  • 有多个周期性 - 有每日峰值(即每 96 个数据点)以及周末数据的每周周期明显低于工作日数据 - 例如工作日可以在 4000 左右达到峰值,但周末达到 1000 左右 - 但即使我只给出它是工作日数据,我遇到了负数问题。

在实现或使用 Holt-Winters 算法时,我是否缺少一些东西?我不是统计学家,所以我使用上面链接中指示的 alpha、beta 和 gamma 的“默认”值 - 这可能是问题所在,有没有更好的方法来计算这些值?

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

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

4

5 回答 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

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


每当你推断数据时,你都会得到一些令人惊讶的结果。您是否更担心实现可能不正确或输出没有适合您的特定用途的良好属性?

于 2011-05-07T19:16:10.007 回答
1

首先,如果您不确定算法的具体实现,我建议您为此创建一些测试用例。采取另一种实现,也许是 matlab,无论如何,任何你知道它有效的东西。生成一些输入,将其提供给参考和您的实现,它应该是相同的。我已经通过这种方式翻译并验证了一些来自 matlab 的算法。scipy.io.loadmat非常适合。

关于您对算法的使用:您谈论的是几天和几周的周期性,并且您以分钟的时间尺度提供数据。我不知道这个特定的算法是否处理得很好,但无论如何我建议尝试一些低通滤波,然后每小时将其输入算法,甚至更慢。一个时期的近 700 个时间步长可能太多而无法识别。您输入的数据还应包含至少两个完整的时间序列周期。如果您的算法支持周期性,您还必须以适当的方式为其提供数据,这样它才能真正看到周期性。您得到这些极值的事实可能是一个暗示,该算法只有一个方向上的稳定趋势的日期。

也许您还想将您的预测分开,使一个针对每周预测进行优化,另一个针对日内预测进行优化,最后再将它们组合起来。

于 2012-09-28T10:25:05.430 回答
0

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

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

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

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

于 2014-02-26T17:42:53.513 回答
0

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

1 - 在应用 Holt-Winters 之前,检查您的时间序列是否平稳可能很重要,如果不是,则区分它以实现此属性,这有助于提高准确性。

2 - 数据会随着时间的推移而周期性地变化,看起来趋势的东西实际上可能是一个大的季节性周期的一部分。如果这是您的情况(确实如此),也许您应该应用 Holt-Winters 两次,每个季节期间一次,因为它无法处理多个周期性,然后分析更适合您的场景的内容。

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

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

于 2016-09-30T21:48:48.150 回答
-4

您观察到数据中存在周期性这一事实意味着您还应该尝试使用可以表达此类特征的模型。

Holt-Winters 是一个简单的平滑模型,无法表达这一点。

经典的方法是查看 ARMA 模型(自回归移动平均),以及 SARIMA(季节性调整...)模型的自然扩展。

底线:这确实是一个统计问题。关于该主题的最佳著作之一是 Maddala 的《计量经济学》。

于 2012-02-19T16:43:29.527 回答