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

机器算法验证 预测 Python
2022-03-29 13:03:57

[我首先在这里将这个问题发布到 Stack Overflow ,但没有得到任何回复,所以我想我会在这里尝试。如果不允许转发,请见谅。]

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

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

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

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

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

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

我还研究了通过 rpy2使用 R预测包 - 这会给我带来更好的结果吗?我想我仍然需要计算参数等等,所以如果我当前的问题在于算法的实现,这将是一个好主意......?

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

2个回答

问题可能在于 Holt-Winters 是一种特定的模型形式,可能不适用于您的数据。除其他外,硬件模型假设以下内容。a) 一个且只有一个趋势 b) 数据中没有水平变化,即没有截距变化 3) 季节性参数不随时间变化 4) 没有异常值 5) 没有自回归结构或自适应模型结构 6) 具有恒定方差的模型误差当然 7)历史导致未来,即没有将价格/促销活动等作为帮助变量

根据您的描述,在我看来,可能需要一种混合频率的方法。我已经看到时间序列问题,其中一天中的小时效应和一周中的一天效应具有显着的交互项。您正试图将您的数据强制转换为不充分的结构,即不够概括的结构。估计参数并从一小组模型中进行选择并不能代替模型识别。您可能想在 www.autobox.com/pdfs/catchword.pdf 阅读有关自动建模的不同方法的文章。就更一般的方法而言,我建议您考虑一个 ARMAX 模型,也称为传递函数,它放宽了上述假设。

我认为你提到的 R 预测包比仅仅使用 Holt-Winters 更适合这个问题。您感兴趣的两个函数是ets()auto.arima()ets() 将拟合指数平滑模型,包括 Holt-Winters 和其他几种方法。它将为各种模型选择参数(alpha、beta 和 gama),然后返回具有最低 AIC(或 BIC,如果您愿意)的那个。auto.arima() 的工作方式类似。

但是,正如 IrishStat 指出的那样,这些模型可能不适合您的分析。在这种情况下,请尝试计算一些协变量,例如周末、节假日及其交互作用的虚拟变量。指定有意义的协变量后,使用 auto.arima() 查找 ARMAX 模型,然后使用forecast()进行预测。您最终可能会得到比在 python 中使用默认参数的简单 Holt-Winters 模型更好的东西。

您还应该注意 ets() 和 auto.arima 都可以拟合季节性模型,但您需要将数据格式化为季节性时间序列。如果您需要任何帮助,请告诉我。

您可以在此处阅读有关预测包的更多信息