2017-08-09 169 views
1

我會用(Statsmodels)ARIMA,以便從一系列的預測值不同的結果:Statsmodels ARIMA - 使用預測()和預測()

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

我認爲我會得到相同的結果從這兩幅圖,而是我得到這個: enter image description here

我想知道,如果問題是否有關預測預測

回答

0

從圖表中看起來好像您正在執行帶有forecast()的樣本外預測,位樣本預測與預測。根據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)。另外,由於我比stat簡單的迭代預測循環(這是主觀的)更信任statsmodels函數的內部功能,所以我推薦使用forecast(step)predict(start, end)