繁体   English   中英

ARIMA(python statsmodels)的预测

[英]Predictions with ARIMA (python statsmodels)

我有一些包含一些季节性趋势的时间序列数据,并且我想使用ARIMA模型来预测该序列在将来的表现。

为了预测我感兴趣的变量( log_var )的行为,我采用了每周,每月和每年的差异,然后将其用作ARIMA模型的输入。

下面是一个例子。

exog = np.column_stack([df_arima['log_var_diff_wk'], 
                        df_arima['log_var_diff_mth'], 
                        df_arima['log_var_diff_yr']]) 

model = ARIMA(df_arima['log_var'], exog = exog, order=(1,0,1)) 
results_ARIMA = model.fit()  

我这样做了几个不同的数据源,并在所有这些我看到了巨大的成绩,在这个意义上,如果我绘制log_var反对results_ARIMA.fittedvalues训练数据然后为每个数据源(我调p和q非常相称分别,但鉴于我已经接受了差值,因此d始终为0)。

但是,我接下来要检查预测的样子,为了做到这一点,我将exog exog为“测试”数据集。 例如,如果我在2014年1月1日至2016年1月1日训练原始的ARIMA模型,则“测试”集将从2016年1月1日开始。

我的方法对某些数据源效果很好(就我而言,将预测值与已知值相对应,趋势看起来很明智),但对其他数据源则不利,尽管它们都是相同的“种类”数据,并且它们只是被采用了来自不同的地理位置。 在某些地区,它完全无法捕捉到明显的季节性趋势,这种趋势在每年的同一日期的训练数据中一次又一次地出现。 ARIMA模型始终非常适合训练数据,似乎在某些情况下,预测完全没有用。

我现在想知道我是否实际上遵循正确的程序来预测ARIMA模型的值。 我的方法基本上是:

exog = np.column_stack([df_arima_predict['log_val_diff_wk'], 
                        df_arima_predict['log_val_diff_mth'], 
                        df_arima_predict['log_val_diff_yr']])

arima_predict = results_ARIMA.predict(start=training_cut_date, end = '2017-01-01', dynamic = False, exog = exog)

这是使用ARIMA进行预测的正确方法吗?

如果是这样,当ARIMA模型似乎在两种情况下都同样适合训练数据时,有没有办法我可以尝试理解为什么预测在某些数据集中看起来非常好而在其他数据集中却很糟糕?

我有一个类似的问题atm,但尚未完全解决。 似乎在python中包含多个季节性条款仍然有些棘手。 R确实具有这种能力, 请参见此处 因此,我可以建议您尝试使用R现在提供的更复杂的功能(尽管如果您还不熟悉R,则可能需要花费大量时间)。

在研究建模季节性模式的方法时,采用n阶差异分数不会为您提供季节性常数,而只是表示您指定为季节性相关的时间点之间的差异。 如果这些差异很小,则对其进行校正可能不会对您的建模结果产生太大影响。 在这种情况下,模型预测可能会很好。 相反,如果差异很大,则包括它们在内就很容易使预测结果失真。 这可以解释您在建模结果中看到的变化。 从概念上讲,您想要做的是代表一段时间内的常数。

在上面引用的博客文章中,作者主张使用傅里叶级数对每个时间段内的方差建模。 NumPy和SciPy软件包都提供了用于计算快速傅立叶变换的例程。 但是,作为一个非数学家,我发现很难确定快速傅立叶变换会产生适当的数字。

最后,我选择使用SciPy信号模块中的Welch信号分解。 这是对时间序列的频谱密度分析的返回结果,从中可以推断出时间序列中各个频率的信号强度。

如果您在频谱密度分析中识别出与您要在时间序列中考虑的季节性频率相对应的峰值,则可以使用它们的频率和振幅来构建代表季节性变化的正弦波。 然后,您可以将它们作为外生变量包含在ARIMA中,就像博客文章中的Fourier术语一样。

到目前为止,我已经掌握了相关知识-现在,我正在尝试弄清楚是否可以让statsmodels ARIMA过程使用这些指定季节趋势的正弦波作为模型中的外生变量(文档指定它们不应该代表趋势,但是,嘿,一个人可以梦想,对吗?)编辑:Rob Hyneman的这篇博客文章也非常相关,并解释了包括Fourier术语在内的一些基本原理。

抱歉,我无法为您提供在Python中有效的解决方案,但是我希望这能为您提供一些新的思路来控制这一令人讨厌的季节性变化。

TL; DR:

  • 看来python现在不太适合处理多个季节性条件,R可能是一个更好的解决方案(请参阅参考资料);

  • 用差异评分来说明季节趋势似乎无法捕获与季节复发相关的恒定差异;

  • 在python中执行此操作的一种方法可能是使用代表季节性趋势的傅里叶级数(另请参见参考资料),该序列可以使用Welch信号分解等方法获得。 但是,如何在ARIMA中将它们用作外生变量以取得良好效果是一个悬而未决的问题。

祝你好运

翻转

ps:如果我找到使它在Python中运行的方法,我会进行更新

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM