Statsmodels ARIMA - 使用predict()和forecast()的不同结果

Sim*_*one 10 python statsmodels arima

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

plt.plot(ind, final_results.predict(start=0 ,end=26))
plt.plot(ind, forecast.values)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我想我会从这两个图得到相同的结果,但我得到这个: 在此输入图像描述

我想知道问题是关于预测还是预测

小智 9

从图表中可以看出,如果您正在进行forecast()样本预测,并使用预测进行样本内预测.根据ARIMA方程的性质,样本外预测往往会收敛到长预测期的样本均值.

为了找出不同场景的方法forecast()predict()工作方式,我ARIMA_results系统地比较了课堂上的各种模型.随意重现与statsmodels_arima_comparison.py 此存储库中的比较.我查看了每个组合order=(p,d,q),仅限制p, d, q为0或1.例如,可以获得一个简单的自回归模型order=(1,0,0).简而言之,我使用以下(固定)时间序列查看了三个选项:

答:迭代样本内预测形成了历史.历史由前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])
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

结果表明:

A.预测和预测AR的产量相同结果,但ARMA的结果不同:测试时间序列图

B.预测和预测AR和ARMA的产量不同结果:测试时间序列图

C.预测和预测AR的产量相同结果,但ARMA的结果不同:测试时间序列图

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

我认为这些差异主要是由于"预测是在原始内生变量的水平中完成" forecast()并且predict()产生水平差异的预测(比较API参考).

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


Ray*_*wok 7

继续noteven2 Degrees的回复,我提交了一个拉取请求,以在方法B中从history_f.append(yhat_p)到进行更正history_p.append(yhat_p)

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

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

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