0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで学ぶ時系列予測 ― e-learningで基礎から実践まで Part 5

0
Posted at

Pythonで学ぶ時系列予測 ― e-learningで基礎から実践まで Part 5

はじめに

Part 4では、予測モデルをどう評価するかを学びました。

最後に整理した流れは、次のようなものでした。

09_part4_summary.png

ここまでで、モデルを公平に比べるための土台はできています。

Part 5では、いよいよForecast Models ― 予測モデルへ進みます。

ただし、ここで大事なのは、ARIMAのコードを1回動かすことではありません。

Part 4で作った評価の枠組みを使って、

モデルを考える
   ↓
時間順に予測する
   ↓
Persistenceと比べる
   ↓
残差を見る
   ↓
必要なら設定を変える

ところまでを一つの流れとして扱います。

今回もこれまでと同じように、

説明を読む
   ↓
Notebookで試す
   ↓
結果を見る
   ↓
条件を少し変える
   ↓
確認問題

というe-learning形式で進めます。


1. Part 4からPart 5へ

Part 4では、どのモデルを使う場合でも共通する評価方法を作りました。

Part 5では、その評価方法の上に予測モデルを載せます。

中心になる流れは次のとおりです。

10_part5_summary.png

ただし原書のPart Vは、ここで終わりません。

モデルを選んだあとに、

保存する
 ↓
読み込む
 ↓
新しい時刻を予測する
 ↓
予測区間も示す

ところまで扱います。

そのため、このe-learningではPart 5を8つのLessonに分けます。


2. Part 5 ― Forecast Models

原書のPart VはChapter 21からChapter 28までです。

Lesson 原書Chapter 内容 主に使うもの
Lesson 21 21 Box-Jenkins Method Identification / Estimation / Diagnostic Checking
Lesson 22 22 Autoregression AutoReg / ACF / Persistence比較
Lesson 23 23 Moving Average Models Residual Error / Error Correction
Lesson 24 24 ARIMA ARIMA(p,d,q) / Rolling Forecast
Lesson 25 25 ACF / PACF Autocorrelation / Partial Autocorrelation
Lesson 26 26 Grid Search p,d,q候補 / RMSE比較
Lesson 27 27 Save Models and Make Predictions 保存 / 読込 / 将来予測
Lesson 28 28 Forecast Confidence Intervals 点予測 / 予測区間

Part 5では、モデルごとに別々の評価方法を使いません。

基本はPart 4で作った、

同じTest期間
同じForecast Horizon
同じ誤差指標

で比較します。

これができると、

ARIMAのRMSEが小さかった

ではなく、

同じ期間を同じ方法で評価したところ、PersistenceよりARIMAのRMSEが小さかった

と説明できるようになります。


3. Part 5のゴール

Part 5を終えた時点で、次のことができれば十分です。

  • Box-Jenkinsの考え方を説明できる
  • Identification / Estimation / Diagnostic Checkingの流れが分かる
  • Autoregressionが過去の観測値を使うモデルだと説明できる
  • ACFとPACFを候補Lagの手掛かりとして使える
  • AutoRegを時間順に評価できる
  • Moving Average Modelが移動平均平滑化とは別物だと説明できる
  • 予測残差に構造があれば、その誤差をモデル化できると理解する
  • ARIMA(p,d,q)のp、d、qを説明できる
  • ARIMAをWalk Forwardで評価できる
  • Persistenceと同じ期間で比較できる
  • Grid Searchで複数のARIMA候補を比較できる
  • Grid Searchの最小RMSEだけで決めない理由を説明できる
  • 最終モデルを保存・読込できる
  • 新しい時刻の予測を作れる
  • 点予測と予測区間を区別できる

Part 5では、モデルを単独で見るのではなく、

構造を読む
 ↓
モデル化する
 ↓
評価する
 ↓
診断する
 ↓
選ぶ

という流れを重視します。


4. 学習環境はPart 4をそのまま使う

Part 5でもDocker + JupyterLabを使います。

Windowsのブラウザー
        ↓
JupyterLab
        ↓
Notebook
        ↓
Python
        ↓
pandas / NumPy / Matplotlib / statsmodels

Part 4までのNotebookはそのまま残し、Part 5を後ろへ追加します。

notebooks/
├── 01_environment.ipynb
├── ...
├── 14_backtesting.ipynb
├── 15_performance_measures.ipynb
├── 16_persistence.ipynb
├── 17_residual_analysis.ipynb
├── 18_reframing.ipynb
├── 19_box_jenkins.ipynb
├── 20_autoregression.ipynb
├── 21_moving_average_model.ipynb
├── 22_arima.ipynb
├── 23_acf_pacf.ipynb
├── 24_grid_search.ipynb
├── 25_save_predict.ipynb
└── 26_confidence_intervals.ipynb

起動方法も変わりません。

docker compose up

初回や依存関係を作り直す場合は、

docker compose up --build

です。


5. Part 5で使うデータ

Part 5では、モデルごとの特徴を確認しやすくするため、3種類の人工時系列を用意します。

data/part5_models.csv

列は次のとおりです。

列 内容
timestamp 日付
ar_value AR(2)型の定常系列
ma_value MA(1)型の定常系列
arima_value ARIMA(1,1,1)に近い非定常系列

実在する観測データではありません。

今回は、モデルの仕組みを見比べることが目的なので、どの構造が入っているか分かる人工データを使います。

再生成する場合は、

python src/make_part5_data.py

を実行します。


Lesson 21 ― A Gentle Introduction to the Box-Jenkins Method

学習目標

  • Box-Jenkins Methodの流れを説明する
  • Identificationとは何か理解する
  • Estimationとは何か理解する
  • Diagnostic Checkingが必要な理由を理解する
  • 1回のモデル作成で終わらないことを理解する

6.1 Box-Jenkinsはモデル名ではない

Box-Jenkinsは、ARIMAモデルを組み立てるための考え方・手順です。

大きく分けると、次の3段階です。

Identification
      ↓
Estimation
      ↓
Diagnostic Checking
      ↓
必要ならIdentificationへ戻る

02_box_jenkins.png

モデルを適合して終わりではありません。

例えばARIMAを作ってRMSEがそこそこ小さくても、残差に強い自己相関が残っているなら、モデルがまだ時間構造を取り切れていない可能性があります。


6.2 Identification

最初に系列を見ます。

Plot
 ↓
Trendはあるか
 ↓
Seasonalityはあるか
 ↓
Stationarityはどうか
 ↓
差分が必要か
 ↓
ACF / PACF

Part 3で学んだ内容が、ここでそのままつながります。

つまりPart 3は、ARIMAの前準備でもあります。


6.3 Estimation

候補となるp、d、qを決めたらモデルを適合します。

ARIMA(p,d,q)

ここで、

  • p:ARの次数
  • d:差分回数
  • q:MAの次数

です。

ただし、候補を決めた時点で正解が確定したわけではありません。

モデルを適合して、評価・診断へ進みます。


6.4 Diagnostic Checking

診断では、特に残差を見ます。

理想的には、残差に予測可能な構造があまり残っていない状態を目指します。

Part 4で行った、

Line Plot
Histogram
Q-Q Plot
Autocorrelation

がそのまま使えます。


6.5 Notebookで確認する

19_box_jenkins.ipynb を開きます。

最初にARIMA型の人工系列を読みます。

series = frame["arima_value"]

次に1階差分します。

# 非定常な水準系列から、時刻間の変化量へ変換します。
diff = series.diff().dropna()

ACF / PACFを確認した後、候補として、

fitted = fit_arima(
    series,
    order=(1, 1, 1),
)

を試し、残差を確認します。


条件を変えてみる

(1,1,1)
(1,1,0)
(0,1,1)

を比較してください。

AICだけでなく、残差の形も確認します。


確認問題

ARIMAモデルのAICが小さければ、残差を確認しなくてもよいでしょうか。

答えと解説を見る

いいえ。

AICはモデル比較の一つの情報ですが、残差に自己相関や偏りが残っていないかは別に確認する必要があります。

Box-Jenkinsでは、モデルを推定した後にDiagnostic Checkingを行い、必要なら候補モデルを見直します。


Lesson 22 ― Autoregression Models for Forecasting

学習目標

  • Autoregressionの考え方を説明する
  • Lagと自己相関の関係を理解する
  • ACF / PACFで系列を確認する
  • AutoRegを時間順に評価する
  • Persistenceと比較する

7.1 ARは過去の観測値を使う

Autoregression、ARモデルは、過去の観測値を使って現在・未来を説明します。

イメージは、

y(t-1)
y(t-2)
y(t-3)
   ↓
y(t)

です。

式の形では、

y(t) = c + φ1 y(t-1) + φ2 y(t-2) + ... + ε(t)

のようになります。

03_autoregression.png

Part 1で作ったLag特徴量の考え方とよく似ています。


7.2 自己相関を見る

過去の値が現在値と関係しているなら、Lagに相関が現れます。

ARモデルを使う前に、

ACF
PACF

を確認すると、候補Lagを考える手掛かりになります。

ただし、グラフを見て機械的に次数を決めるのではなく、最終的には評価結果も確認します。


7.3 NotebookでAR(2)を試す

20_autoregression.ipynb を開きます。

今回のar_valueはAR(2)型の人工系列です。

series = frame["ar_value"]

2 Lagを使ってWalk Forward評価します。

ar_result = walk_forward_autoreg(
    series,
    lags=2,
    test_size=24,
)

この補助関数では、各時刻で、

過去だけで学習
 ↓
1時刻先を予測
 ↓
実測値を見る
 ↓
履歴へ追加

の順序を守ります。


7.4 Persistenceと比べる

ARのRMSEだけを見ても、その値が良いのか判断しにくいことがあります。

そこでPart 4のPersistenceを同じTest期間へ作ります。

base = persistence_forecast(series).reindex(ar_result.index)

比較するのは、

同じ実測値
同じ評価期間
同じRMSE

です。


条件を変えてみる

lags = 1
lags = 2
lags = 5
lags = 10

を試してください。

Lagを増やせば必ず良くなるわけではありません。


確認問題

ARモデルのLag数を非常に大きくすれば、常に予測精度は上がるでしょうか。

答えと解説を見る

必ずしも上がりません。

不要なLagまで追加すると、推定する係数が増え、ノイズまで拾ったり、Train期間に対して複雑になりすぎたりします。

ACF / PACFを手掛かりにしながら、最終的には同じ評価条件で予測性能を確認します。


Lesson 23 ― Moving Average Models for Forecasting

学習目標

  • MAモデルの考え方を説明する
  • Part 2のMoving Average smoothingとの違いを説明する
  • Forecast Residual Errorを時系列として扱う
  • 残差モデルで予測を補正する考え方を理解する

8.1 Moving Averageという名前に注意する

Part 2でもMoving Averageが出てきました。

あちらは、

過去N点の平均

を使った平滑化でした。

Part 5のMoving Average Modelは別です。

ここで使うのは、過去の予測誤差です。

ε(t-1)
ε(t-2)
...
   ↓
y(t)

04_ma_model.png


8.2 残差も時系列である

Part 4では、

residual = actual - forecast

を確認しました。

もし残差が完全にランダムなら、そこから追加で予測できる情報はあまりありません。

一方、残差に自己相関が残っていれば、

次の予測誤差

を予測できる可能性があります。

原書Chapter 23では、Persistenceの残差をAutoRegでモデル化し、その予測誤差をベースラインへ足して補正します。

Persistence Forecast
        +
Predicted Residual Error
        ↓
Corrected Forecast

8.3 Notebookで残差補正を試す

21_moving_average_model.ipynb を開きます。

corrected = residual_correction_forecast(
    series,
    test_size=24,
    residual_lags=3,
)

補正前後を、同じ実測値に対して比較します。

base_metrics = forecast_metrics(
    corrected["actual"],
    corrected["baseline"],
)

corrected_metrics = forecast_metrics(
    corrected["actual"],
    corrected["corrected"],
)

ここでも、改善したかどうかは数値で確認します。


条件を変えてみる

residual_lags = 1
3
5
10

を試します。

残差がWhite Noiseに近いのに高次のモデルを作ると、無理に構造を作ってしまう可能性があります。


確認問題

Part 2のMoving Averageと、Part 5のMoving Average Modelは同じものですか。

答えと解説を見る

違います。

Part 2は、過去の観測値を平均して平滑化するMoving Averageです。

Part 5のMAモデルは、過去の予測誤差を利用する時系列モデルです。

同じ名前ですが目的も数式も異なるため、区別して考えます。


Lesson 24 ― ARIMA Model for Forecasting

学習目標

  • ARIMAの3要素を説明する
  • ARIMA(p,d,q)を読める
  • ARIMAをPythonで適合する
  • Rolling Forecastで評価する
  • Persistenceと比較する

9.1 ARIMAは3つを組み合わせる

ARIMAは、

AR + I + MA

です。

記号 意味
AR Autoregression
I Integrated、差分
MA Moving Average

一般に、

ARIMA(p,d,q)

と書きます。

05_arima.png


9.2 dはTrendを弱める役割を持つ

例えば1階差分なら、

y(t) - y(t-1)

です。

Part 3でRandom WalkやTrendを扱ったときに出てきた差分が、ARIMAのdにつながります。


9.3 NotebookでRolling Forecastする

22_arima.ipynb を開きます。

今回は、

order = (1, 1, 1)

を候補として試します。

arima_result = rolling_arima_forecast(
    series,
    order=(1, 1, 1),
    test_size=18,
)

この実装では、各時刻でARIMAを再適合しています。

教材として分かりやすい方法ですが、データ量が多い実運用では、再学習頻度や状態更新の方法も設計対象になります。


9.4 Persistenceと比較する

ARIMAを使っただけでは、改善とは言えません。

ARIMA RMSE
     vs
Persistence RMSE

を同じ期間で比べます。

複雑なモデルが単純モデルに負けることもあります。

それ自体が重要な結果です。


条件を変えてみる

ARIMA(1,1,1)
ARIMA(1,1,0)
ARIMA(0,1,1)

を比べます。


確認問題

ARIMAという名前のモデルを使えば、Persistenceより必ず良くなるでしょうか。

答えと解説を見る

必ず良くなるわけではありません。

系列の構造、パラメータ設定、Train期間、Forecast Horizonなどによって結果は変わります。

そのためPart 4で作った評価方法を使い、同じ条件でベースラインと比較します。


Lesson 25 ― Autocorrelation and Partial Autocorrelation

学習目標

  • ACFを説明する
  • PACFを説明する
  • AR系列とMA系列で違いを見る
  • ARIMAでは差分後のACF / PACFも見る
  • ACF / PACFを絶対的な次数決定ルールにしない

10.1 ACF

ACFはAutocorrelation Functionです。

あるLagの値と現在値がどの程度関係しているかを見ます。

Lag 1
Lag 2
Lag 3
...

ごとの自己相関を並べたものです。


10.2 PACF

PACFはPartial Autocorrelation Functionです。

途中のLagの影響を取り除いた上で、特定Lagとの直接的な関係を見ます。

ざっくり言えば、

ACF  : 全体としてどのLagまで関係するか
PACF : 直接効いていそうなLagはどこか

を見る手掛かりになります。

06_acf_pacf.png


10.3 ARとMAを見比べる

23_acf_pacf.ipynb では、

ar_value
ma_value

のACF / PACFを並べて見ます。

人工データなので、違いを確認しやすくなっています。


10.4 ARIMA系列では差分後も確認する

非定常な系列の水準値に、そのままACF / PACFを描くと強い相関が長く残ることがあります。

そこで、

diff = frame["arima_value"].diff().dropna()

としてから確認します。


条件を変えてみる

nlags = 10
20
30

を試してください。

Lagをたくさん表示すればよいわけではありません。


確認問題

ACF / PACFを見れば、最適なARIMA(p,d,q)が一意に決まるでしょうか。

答えと解説を見る

一意に決まるとは限りません。

ACF / PACFは候補を考える重要な手掛かりですが、有限データでは形が曖昧になることもあります。

最終的には、候補モデルを同じ条件で評価し、残差も確認します。


Lesson 26 ― Grid Search ARIMA Model Hyperparameters

学習目標

  • p,d,qの候補を列挙できる
  • 同じTest期間で候補を比較できる
  • RMSE順に候補を整理できる
  • Grid Searchの計算量を意識できる
  • 最小RMSEだけで最終決定しない

11.1 候補を実際に評価する

ACF / PACFで、

pは1か2かもしれない
qは0か1かもしれない

と候補を絞ったら、それぞれを実際に評価できます。

07_grid_search.png


11.2 Notebookで小さく試す

24_grid_search.ipynb では、計算時間を抑えて、

search = grid_search_arima(
    series,
    p_values=[0, 1, 2],
    d_values=[0, 1],
    q_values=[0, 1],
    test_size=8,
)

を試します。

重要なのは、各候補を別々の都合のよい期間で評価しないことです。

全候補で同じTest期間を使います。


11.3 候補を増やすほど計算量も増える

例えば、

p: 0〜5
 d: 0〜2
 q: 0〜5

なら候補数はかなり増えます。

さらにWalk Forwardで各Test時刻に再適合すると、計算量は大きくなります。

そのため、

ACF / PACF
系列の性質
ドメイン知識

で候補を絞る意味があります。


11.4 最小RMSEで終わらない

Grid Searchで最小RMSEを見つけても、最後に、

  • MAE
  • Bias
  • 残差
  • モデルの複雑さ
  • 安定性

を確認します。

わずかなRMSE改善のために、非常に複雑なモデルを選ぶ必要があるかも考えます。


確認問題

Grid Searchの候補範囲は広ければ広いほど良いでしょうか。

答えと解説を見る

必ずしもそうではありません。

候補が増えると計算量が増えるだけでなく、評価データに対して最も都合のよい設定を探し過ぎることにも注意が必要です。

ACF / PACFや系列の性質から、妥当な範囲を絞って試します。


Lesson 27 ― Save Models and Make Predictions

学習目標

  • 最終モデルを履歴全体へ適合できる
  • モデル結果を保存できる
  • 保存済みモデルを読み込める
  • 将来値を予測できる
  • 新しい観測が増えた後の更新を考える

12.1 モデル選択の次は運用

評価が終わったら、最終モデルを実際の予測に使う段階へ進みます。

候補比較
 ↓
最終モデルを選ぶ
 ↓
利用できる履歴全体で再適合
 ↓
保存
 ↓
読込
 ↓
新しい未来を予測

08_save_predict.png


12.2 Notebookで保存する

25_save_predict.ipynb を開きます。

fitted = fit_arima(
    series,
    order=(1, 1, 1),
)

保存は、

model_path = save_arima_results(
    fitted,
    ROOT / "artifacts" / "part5_arima_model.pkl",
)

です。

artifacts/ は計算結果やモデルを置く場所として分けています。


12.3 読み込み直して予測する

loaded = load_arima_results(model_path)
next_values = loaded.forecast(steps=5)

これで、Notebookを閉じた後でもモデル結果を再利用できます。


12.4 モデルは保存したら永遠に固定ではない

新しい観測が増えると、データの傾向が変わることがあります。

実運用では、

毎回再学習する
1日1回再学習する
一定件数ごとに再学習する
性能低下を検知したら再学習する

などの方針が必要になります。

Part 5では、この設計が必要だと理解するところまでにします。


確認問題

モデルファイルを保存できれば、そのモデルを長期間更新せず使い続けても問題ないでしょうか。

答えと解説を見る

必ずしも問題ないとは言えません。

新しいデータが増えたり、時系列の構造が変化したりすると、以前のモデル性能が維持できない場合があります。

保存・読込だけでなく、再学習や再評価の運用も必要です。


Lesson 28 ― Forecast Confidence Intervals

学習目標

  • 点予測と予測区間の違いを説明する
  • ARIMAから予測区間を取得する
  • 95%区間を表示する
  • 区間の幅を不確実性として読む
  • 信頼水準と区間幅の関係を確認する

13.1 点予測だけでは分からないことがある

例えば、

明日の予測値 = 52.4

だけを見ると、一つの数字しかありません。

しかし実際には、予測には不確実性があります。

そこで、

Forecast Mean
Lower Bound
Upper Bound

を一緒に表示します。

09_confidence_interval.png


13.2 Notebookで予測区間を取得する

26_confidence_intervals.ipynb を開きます。

forecast = forecast_confidence_frame(
    fitted,
    steps=7,
    alpha=0.05,
)

alpha=0.05 なら95%区間を取得します。

グラフでは、

ax.fill_between(
    future_index,
    forecast["mean_ci_lower"],
    forecast["mean_ci_upper"],
    alpha=0.2,
)

として帯で表示します。


13.3 遠い未来ほど不確実性が増えることがある

1時刻先と10時刻先では、普通は後者の方が不確実です。

予測を繰り返すほど、未知の誤差が積み重なるためです。

そのため点予測だけでなく、区間の広がりも確認します。


13.4 95%区間の読み方に注意する

「この1回の未来値が95%の確率で必ずこの範囲に入る」と単純に言い切るのは避けます。

予測区間は、モデルの仮定と推定された不確実性に基づく範囲です。

モデルの仮定が合っていなければ、区間そのものの意味も弱くなります。


条件を変えてみる

alpha = 0.20  → 80%区間
alpha = 0.05  → 95%区間

を比較します。

高いカバレッジを求めるほど、通常は区間が広くなります。


確認問題

80%予測区間と95%予測区間では、通常どちらが広くなるでしょうか。

答えと解説を見る

通常は95%区間の方が広くなります。

より多くの可能な結果を覆おうとするためです。

ただし、どちらの区間もモデルの仮定に基づいているため、モデル診断とセットで使います。


14. Part 5で大切なこと

Part 5の内容はモデルが多いため、個別の式に目が行きやすくなります。

ただ、実際には次の流れが大切です。

1. まず構造を見る

Trend
Seasonality
Stationarity
ACF / PACF

を見ます。

2. 候補モデルを作る

AR
MA
ARIMA

を試します。

3. 同じ条件で評価する

Chronological Split
Walk Forward
MAE / RMSE
Persistence

を使います。

4. 残差を見る

予測精度がよくても、残差に強い構造が残っていないか確認します。

5. 最終モデルを運用へつなげる

Save
Load
Forecast
Confidence Interval
Update

まで考えます。


15. Part 5の全体像

Part 5をまとめると、次の流れです。

10_part5_summary(2).png

Part 1では、

予測問題の作り方

を学びました。

Part 2では、

データを整える方法

を学びました。

Part 3では、

時系列の構造

を調べました。

Part 4では、

モデルを正しく評価する方法

を作りました。

Part 5では、これらを使って、

実際にモデルを作り
評価し
選び
予測へ使う

ところまで進みました。


16. 次はPart 6 ― Projects

次は、ここまで学んだ内容を1つの予測プロジェクトとして最初から最後まで通します。

原書Part VIでは、まずForecast Projectの進め方を整理し、その後に複数のケーススタディへ進みます。

イメージは次の流れです。

11_part6_images.png

Part 6では、Part 1〜5で別々に学んできた内容を一つにつなげます。


参考資料

本記事は、次の書籍のPart Vを参考に、現在のPython環境とDocker + JupyterLabを使ったe-learning形式へ組み直しています。

  • Jason Brownlee, Introduction to Time Series Forecasting with Python

  • Part V: Forecast Models

    • Chapter 21: A Gentle Introduction to the Box-Jenkins Method
    • Chapter 22: Autoregression Models for Forecasting
    • Chapter 23: Moving Average Models for Forecasting
    • Chapter 24: ARIMA Model for Forecasting
    • Chapter 25: Autocorrelation and Partial Autocorrelation
    • Chapter 26: Grid Search ARIMA Model Hyperparameters
    • Chapter 27: Save Models and Make Predictions
    • Chapter 28: Forecast Confidence Intervals
  • Part 5 Source Zipfile

原書のPythonコードは刊行当時のstatsmodels APIを前提としている箇所があります。

この教材では、statsmodels 0.14.6 の現在のAPIに合わせ、statsmodels.tsa.arima.model.ARIMA などを使う形へ置き換えています。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?