シリーズから値を予測するには、(Statsmodels)ARIMAを使用します。
plt.plot(ind, final_results.predict(start=0 ,end=26))
plt.plot(ind, forecast.values)
plt.show()
これらの2つのプロットから同じ結果が得られると思いましたが、代わりに次のようになります。
問題がpredictとforecastのどちらであるかがわかります
チャートから、forecast()
を使用してサンプル外予測を実行しているように見え、predictを使用してビット内サンプル予測を実行しています。 ARIMA方程式の性質に基づいて、サンプル外予測は、長い予測期間のサンプル平均に収束する傾向があります。
forecast()
とpredict()
が異なるシナリオでどのように機能するかを確認するために、_ARIMA_results
_クラスのさまざまなモデルを体系的に比較しました。 _statsmodels_arima_comparison.py
_ との比較をこのリポジトリ で自由に再現してください。 order=(p,d,q)
の各組み合わせを調べ、_p, d, q
_を0または1に制限しました。たとえば、order=(1,0,0)
を使用すると、単純な自己回帰モデルを取得できます。簡単に言うと、次の (定常)時系列 を使用して、3つのオプションを調べました。
A.履歴内の反復サンプル内予測。履歴は時系列の最初の80%で構成され、テストセットは最後の20%で構成されました。次に、テストセットの最初のポイントを予測し、履歴に真の値を追加し、2番目のポイントを予測しました。これにより、モデルの予測品質が評価されます。
_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の結果は異なる予測と予測: test time series chart
さらに、BとCで一見同じように見えるアプローチを比較したところ、結果には微妙だが目に見える違いがあることがわかりました。
違いは主に、forecast()
とpredict()
の「元の内生変数のレベルで予測が行われる」という事実がレベルの違いの予測を生成するという事実から生じることをお勧めします( APIリファレンスを比較 )。
さらに、単純な反復予測ループ(これは主観的です)よりもstatsmodels関数の内部機能を信頼しているので、forecast(step)
またはpredict(start, end)
を使用することをお勧めします。
Noteven2degreesの応答を続けて、メソッドBで修正するプルリクエストをhistory_f.append(yhat_p)
からhistory_p.append(yhat_p)
に送信しました。
また、noteven2degreesが示唆するように、forecast()
とは異なり、predict()
は、差分予測ではなく、予測を出力するために引数_typ='levels'
_を必要とします。
上記の2つの変更後、メソッドBはメソッドCと同じ結果を生成しますが、メソッドCの所要時間ははるかに短くなり、合理的です。そして私はモデル自体の定常性に関連していると思うので、どちらもトレンドに収束します。
どのメソッドでも、forecast()
およびpredict()
は、p、d、qの構成が何であっても同じ結果を生成します。