Statsmodels ARIMA - 使用预测()和预测()的不同结果

Posted

技术标签:

【中文标题】Statsmodels ARIMA - 使用预测()和预测()的不同结果【英文标题】:Statsmodels ARIMA - Different results using predict() and forecast() 【发布时间】:2018-01-17 16:28:37 【问题描述】:

我会使用 (Statsmodels) ARIMA 来预测一系列值:

plt.plot(ind, final_results.predict(start=0 ,end=26))
plt.plot(ind, forecast.values)
plt.show()

我以为我会从这两个图中得到相同的结果,但我得到了这个:

我会知道问题是关于 predict 还是 forecast

【问题讨论】:

statsmodel 文档所示,predict 用于样本内预测,forecast 仅用于样本外预测。 predict, forecast 【参考方案1】:

从图表看来,您使用forecast() 进行样本外预测,使用predict 进行位样本内预测。根据 ARIMA 方程的性质,样本外预测往往会在较长的预测周期内收敛于样本均值。

为了了解forecast()predict()在不同场景下的工作原理,我系统地比较了ARIMA_results类中的各种模型。随意复制与statsmodels_arima_comparison.pyin this repository 的比较。我研究了order=(p,d,q) 的每个组合,仅将p, d, q 限制为0 或1。例如,可以使用order=(1,0,0) 获得一个简单的自回归模型。 简而言之,我研究了三个选项,使用以下(stationary) time series:

A.迭代的样本内预测形成历史。历史由时间序列的前 80% 组成,而测试集由最后 20% 组成。然后我预测了测试集的第一个点,将真实值添加到历史记录中,预测了第二个点等。这将对模型的预测质量进行评估。

for t in range(len(test)):
    model = ARIMA(history, order=order)
    model_fit = model.fit(disp=-1)
    yhat_f = model_fit.forecast()[0][0]
    yhat_p = model_fit.predict(start=len(history), end=len(history))[0]
    predictions_f.append(yhat_f)
    predictions_p.append(yhat_p)
    history.append(test[t])

B.接下来,我通过迭代预测测试系列的下一个点,并将该预测附加到历史记录中来研究样本外预测。

for t in range(len(test)):
    model_f = ARIMA(history_f, order=order)
    model_p = ARIMA(history_p, order=order)
    model_fit_f = model_f.fit(disp=-1)
    model_fit_p = model_p.fit(disp=-1)
    yhat_f = model_fit_f.forecast()[0][0]
    yhat_p = model_fit_p.predict(start=len(history_p), end=len(history_p))[0]
    predictions_f.append(yhat_f)
    predictions_p.append(yhat_p)
    history_f.append(yhat_f)
    history_f.append(yhat_p)

C.我使用了forecast(step=n) 参数和predict(start, end) 参数,以便使用这些方法进行内部多步预测。

model = ARIMA(history, order=order)
    model_fit = model.fit(disp=-1)
    predictions_f_ms = model_fit.forecast(steps=len(test))[0]
    predictions_p_ms = model_fit.predict(start=len(history), end=len(history)+len(test)-1)

原来是这样的:

A.预测和预测 AR 的结果相同,但 ARMA 的结果不同:test time series chart

B.对于 AR 和 ARMA,预测和预测会产生不同的结果:test time series chart

C.预测和预测 AR 的结果相同,但 ARMA 的结果不同:test time series chart

此外,比较 B. 和 C. 中看似相同的方法。我发现结果存在细微但明显的差异。

我认为差异主要是因为forecast()predict() 中的“预测是在原始内生变量的水平上完成的”产生了水平差异的预测(compare the API reference)。

此外,鉴于我更信任 statsmodels 函数的内部功能而不是简单的迭代预测循环(这是主观的),我建议使用 forecast(step)predict(start, end)

【讨论】:

【参考方案2】:

继续 noteven2degrees 的回复,我提交了一个拉取请求以将方法 B 中的从 history_f.append(yhat_p) 更正为 history_p.append(yhat_p)

此外,正如 noteven2degrees 建议的那样,与 forecast() 不同,predict() 需要参数 typ='levels' 来输出预测,而不是差异预测。

经过以上两次改动后,方法B产生的结果与方法C相同,而方法C花费的时间要少得多,这是合理的。两者都收敛到一个趋势,因为我认为这与模型本身的平稳性有关。

无论采用哪种方法,forecast()predict() 使用任何 p,d,q 配置都会产生相同的结果。

【讨论】:

以上是关于Statsmodels ARIMA - 使用预测()和预测()的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 statsmodels.tsa 返回训练集预测值

statsmodels.tsa.arima_model预测时报错TypeError: int() argument must be a string, a bytes-like object or a

python使用ARIMA进行时间序列的预测(基础教程)

模块“statsmodels.tsa.api”没有属性“arima_model”

Colab 中没有名为“statsmodels.tsa.arima”的模块,但 Pycharm 中没有

等价于 python 的 auto.arima()