時系列分析の鉄則:「過去」だけで「未来」を予測する
1. 基本原則:未来のデータは使わない
時系列分析の最も重要なルールは、未来の情報を盗み見てはいけない(リークしてはいけない)ということです。ある時点の値を予測したい場合、モデルが学習に使えるのは、その時点より過去の情報だけです。これは、実際の運用(未来を予測する)と同じ状況を、モデルの評価段階でも作り出すためです。
AutoGluonの役割: 幸いなことに、AutoGluonのような自動化ツールは、このデータ分割と評価のプロセスを厳密に自動で行ってくれます。私たちが理解すべきなのは「AutoGluonが内部で何をしているのか」というイメージです。
2. AutoGluonの高度な検証方法:ローリングウィンドウ検証
AutoGluonは単純な「学習/テスト」の1回分割ではなく、ローリングウィンドウ検証(またはバックテスト)という、より信頼性の高い方法でモデルの性能を評価します。これは、時間軸をずらしながら「学習→予測→評価」のサイクルを複数回繰り返す手法です。
下の図は、num_val_windows=3
(検証を3回行う)と設定した場合の内部の動きを再現したものです。「次の検証へ」ボタンを押して、学習データと検証データが時間と共にどう変化するかを確認してください。
検証ウィンドウ 1
全時系列データ
学習データ
検証データ
図解のポイント
- ■ 学習データ: モデルがパターンを学ぶために使える「過去」のデータです。
- ■ 検証データ: 学習したモデルが正しく予測できるかを試すための「少し先の未来」のデータです。
- ウィンドウの移動: 「次の検証へ」進むと、学習に使えるデータ期間が広がり(過去が増え)、検証する未来の期間も先にスライドしていきます。
- 最終的な評価: AutoGluonは、これら全ての検証ウィンドウで得られたスコアの平均値を、そのモデルの最終的な性能評価とします。これにより、特定の期間だけで偶然スコアが良かった、ということを防ぎ、モデルの真の実力を測ることができます。
実際のログとの関連: お客様のログに `Reducing num_val_windows to 1` という警告がありましたね。これは、提供された学習データが短すぎて、このローリングウィンドウ検証を複数回行うのに十分な長さがなかったため、AutoGluonが自動的に検証回数を1回に減らしたことを意味します。
3. 基本的なコード実装
この「過去と未来を分離する」という原則の最も基本的な実装は、データを特定の日付で分割することです。
# 必要なライブラリをインポート
import pandas as pd
# 1. サンプルの時系列データを作成
date_rng = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
data = {'date': date_rng, 'sales': [100 + i for i, d in enumerate(date_rng)]}
df = pd.DataFrame(data).set_index('date')
# 2. 予測の基準となる時点(学習データの最終日)を定義
split_point = '2023-11-30'
# 3. 基準点を元に、データを「学習用」と「テスト用」に分割
# 【重要】split_point以前のデータのみを学習に使う
train_df = df.loc[df.index <= split_point]
# 【重要】split_pointより後のデータはテスト(答え合わせ)用に取っておく
test_df = df.loc[df.index > split_point]
print(f"学習データは {len(train_df)}件, テストデータは {len(test_df)}件に分割されました。")
# このtrain_dfだけを使ってモデルを学習させるのが鉄則です。
# AutoGluonは、このtrain_dfの中でさらにローリングウィンドウ検証を自動で行います。
コメント