簡體   English   中英

Statsmodels ARIMA - 使用預測()和預測()的不同結果

[英]Statsmodels ARIMA - Different results using predict() and forecast()

我使用( Statsmodels )ARIMA 來預測一系列值:

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

我以為我會從這兩種方法中得到相同的結果,但我得到了這個: 在此處輸入圖像描述

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

從圖表上看,您好像在使用 predict forecast()進行樣本外預測,使用 predict 進行樣本內預測。 基於 ARIMA 方程的性質,對於較長的預測周期,樣本外預測往往會收斂到樣本均值。

為了了解 predict( forecast()predict()如何在不同場景下工作,我系統地比較了ARIMA_results類中的各種模型。 隨意在此存儲庫中重現與statsmodels_arima_comparison.py的比較。 我研究了order=(p,d,q)的每種組合,僅將p, d, q限制為 0 或 1。例如,可以使用order=(1,0,0)獲得簡單的自回歸模型。 簡而言之,我使用以下(固定)時間序列研究了三個選項:

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 的結果不同:測試時間序列圖

B. 預測和預測對 AR 和 ARMA 產生不同的結果:測試時間序列圖

C. 預測和預測 AR 的結果相同,但 ARMA 的結果不同:測試時間序列圖

此外,比較 B. 和 C. 中看似相同的方法,我發現結果存在細微但明顯的差異。

我認為差異主要是由於 predict() 中的“預測是在原始內生變量的水平上完成的”,而predict() forecast()產生水平差異的預測( 比較 API 參考)。

此外,鑒於我更信任 statsmodels 函數的內部功能而不是簡單的迭代預測循環(這是主觀的),我建議使用forecast(step)predict(start, end)

繼續 noteven2degrees 的回復,我提交了一個拉取請求以更正方法 B 從history_f.append(yhat_p)history_p.append(yhat_p)

此外,正如 noteven2degrees 建議的那樣,與 predict( forecast()不同, predict()需要一個參數typ='levels'來輸出預測,而不是差異預測。

經過上述兩次改動后,方法B產生的結果與方法C相同,而方法C所用的時間要少得多,這是合理的。 兩者都收斂到一個趨勢,因為我認為這與模型本身的平穩性有關。

無論采用哪種方法,對於 p,d,q 的任何配置, predict( forecast()predict()都會產生相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM