首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Statsmodels -使用predict()和predict()的不同结果

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

Stack Overflow用户
提问于 2017-08-09 16:50:34
回答 2查看 21.1K关注 0票数 20

我使用(Statsmodel) ARIMA从一个系列中预测值:

代码语言:javascript
复制
plt.plot(ind, final_results.predict(start=0 ,end=26))
plt.plot(ind, forecast.values)
plt.show()

我以为我会从这两种方法中得到同样的结果,但是我得到了以下结果:

我想知道是使用predict()还是forecast()

EN

回答 2

Stack Overflow用户

发布于 2018-02-16 20:58:17

从图表上看,你似乎是在用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 %形成。然后对测试集的第一点进行了预测,增加了历史的真实值,预测了第二点,从而对模型的预测质量进行了评价。

代码语言:javascript
复制
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])

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

代码语言:javascript
复制
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)参数进行内部多步预测。

代码语言:javascript
复制
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:测试时间序列图的预测结果不同

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

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

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

我认为这种差异主要是由于forecast()中的“预测是在原始内源变量的水平上进行的”,而predict()则产生了水平差异的预测(比较API引用)。

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

票数 22
EN

Stack Overflow用户

发布于 2019-02-15 05:10:49

继续Noteven2度数的回复,我提交了一个拉请求,以纠正方法B中从history_f.append(yhat_p)history_p.append(yhat_p)的错误。

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

经过以上两次修改后,方法B产生的结果与方法C相同,而方法C所需的时间更短,这是合理的。两者都趋同于一种趋势,因为我认为这与模型本身的平稳性有关。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45596492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档