【发布时间】:2016-04-21 22:28:34
【问题描述】:
我有一些时间序列数据,其中包含一些季节性趋势,我想使用 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 重新定义为“测试”数据集。例如,如果我在 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 模型似乎在两种情况下都适合训练数据时,我是否可以尝试理解为什么预测在某些数据集中看起来非常好而在其他数据集中看起来很糟糕?
【问题讨论】:
-
如果对 ARIMA 的作用没有太多了解,您可能只是过度拟合了您的模型。过度拟合是机器学习中一个非常常见的问题,当你训练你的模型以完美匹配你的训练数据时会发生这种情况,但是它在预测测试集时是没有用的(似乎是正在发生的事情)。如果是问题(很难说),您可以尝试使用参数,直到训练集上的拟合足够好但不完美,ARIMA 可能会更好地泛化到测试数据集。
标签: python time-series prediction statsmodels