我一直在尝试使用this implementation of the Holt-Winters algorithm进行Python中的时间序列预测,但遇到了障碍......基本上,对于某些(正面)输入系列,它有时会预测负数,这应该清楚不是这样的。即使预测不是负面的,它们有时也会非常不准确 - 比它们应该的数量级更高/更低。为算法提供更多的数据周期似乎没有帮助,事实上通常会使预测变得更糟。
我使用的数据具有以下特征,可能是问题:
非常频繁地采样(每15分钟一个数据点,而不是示例使用的月度数据) - 但是根据我的阅读,Holt-Winters算法应该没有问题。也许这表明实施存在问题?
有多个周期性 - 每日峰值(即每96个数据点)以及周末数据的周周期数据明显低于工作日数据 - 例如工作日可以达到4000左右但周末达到峰值1000 - 但即使我只给它工作日数据,我也会遇到负数问题。
对于Holt-Winters算法的实现或使用,我是否遗漏了一些东西?我不是统计学家,所以我使用上面链接中指出的alpha,beta和gamma的'默认'值 - 这可能是问题,是否有更好的方法来计算这些值?
或者......有没有比Holt-Winters更好的算法?最后,我只想根据历史数据创建合理的预测。我尝试过单指数和双指数平滑,但(据我所知)并不支持数据的周期性。
非常感谢任何帮助/意见!
答案 0 :(得分: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
但是我不确定你是怎么认为它非常不准确或者判断它“应该”更低。
每当你推断数据时,你都会得到一些令人惊讶的结果。您是否更担心实施可能不正确或输出没有适合您特定用途的良好属性?
答案 1 :(得分:0)
Firstable,如果您不确定您的算法的具体实现,我建议您为此创建一些测试用例。采取另一种实现方式,也许是matlab,无论如何,任何你知道它有效的东西。生成一些输入,将其提供给参考和实现,它应该是相同的。我已经从matlab翻译并验证了一些算法。 scipy.io.loadmat
非常适合。
关于您对算法的使用:您谈论的是几天和几周的周期,并且您可以按分钟时间刻度提供数据。我不知道这个特定算法是否处理得那么好,但无论如何我建议,尝试一些低通滤波,然后每小时将其输入算法,甚至更慢。一段时间内将近700次步骤可能太难以识别。您输入的数据还应包含至少两个完整的时间段。如果您的算法支持周期性,您还必须以适当的方式为其提供数据,因此它实际上可以查看周期性。事实上,你获得这些极端值可能是一个暗示,该算法只有一个方向的稳定趋势的日期。
也许你也希望将你的预测分开,以便为每周预测优化一个,而另一个在日内预测,最后再将它们组合起来。
答案 2 :(得分:0)
我认为这种方法的问题在于它们如何计算初始值。他们似乎在以下情况下使用线性模型:
这是一种非常差的方法,不应该像趋势那样使用 受季节性模式的影响。想象一个季节性的模式, 例如,一年中的最后一个时期总是最大的 年度价值。然后趋势将向上偏向。 不幸的是,Bowerman,O'Connell和Koehler(2005)都没有 单独推荐不好的方法。我见过类似的,更糟糕的是, 其他书籍推荐的程序。 [1]
更好的方法是分解趋势和季节性的时间序列[1]
答案 3 :(得分:0)
在选择适当的预测方法之前,分析时间序列属性很重要。
1 - 在应用Holt-Winters之前,检查你的时间序列是否是静止的可能是很重要的,如果不是,则将它区分为实现这个属性,这有助于提高准确性。
2 - 数据可能会随着时间的推移而周期性变化,而趋势看似可能实际上是季节性时期的一部分。如果这是你的情况(也许是这样),也许你应该两次申请Holt-Winters,每个季节一次,因为它无法处理多个周期,然后分析什么更适合你的场景。
3 - 尝试不同的平滑参数(alpha,beta和gamma)可能很重要。它们越大,最重要的是最后几次观察和最后计算的组件变得越来越重要。尝试找到一个自适应Holt-Winters实现,自动调整这些参数,看看会发生什么。
我建议您使用R语言,该语言包含通过预测包提供的自适应且易于使用的Holt-Winters实现,因此您可以轻松地尝试不同的配置。
答案 4 :(得分:-3)
您观察到数据中存在周期性这一事实意味着您还应尝试使用能够表达此类特征的模型。
Holt-Winters是一个简单的平滑模型,无法表达这一点。
经典的方法是查看ARMA模型(自回归移动平均线),以及它的自然延伸SARIMA(季节性调整...)模型。
底线:这确实是一个统计问题。关于这一主题的最佳文章之一是Maddala的计量经济学。