「来月の売上を予測してほしい」「サーバのアクセス数を予測してオートスケールしたい」——時系列予測は、あらゆる業界で発生する普遍的なタスクです。そして、機械学習の中でも素人が最も事故を起こしやすい領域でもあります。
事故の原因はモデルの選択ではありません。ほとんどの場合、検証の設計(リーク)・季節性の扱い・ベースライン不在のどれかです。この記事では、時系列予測を実務で回すための手順を、事故りやすいポイント順にまとめます。
鉄則: 時間を混ぜたら、その評価は無効
時系列予測の評価でランダム分割は使えません。シャッフルした瞬間、「未来のデータで過去を予測する」検証になり、本番では絶対に再現できない好成績が出ます。これは評価設計の記事で書いたデータリークの時系列版で、時系列予測の失敗のいちばん多い原因です。
正しい検証は次の2つです[2]。
- ホールドアウト: 直近の期間をテストに取り分ける(例: 直近3ヶ月)
- ローリング検証(時系列交差検証): 学習窓を前にずらしながら複数の期間で評価する。scikit-learnなら
TimeSeriesSplit
さらに見落としがちなのが特徴量のリークです。「当日の気温」を使って当日の売上を予測するモデルは、本番では気温の「予報」しか手に入りません。予測時点で本当に手に入る情報だけを使う——特徴量を1列ずつ「これは何日前に確定する情報か?」と点検する作業が必須です。
まずベースライン — ナイーブ予測に勝てるか
時系列予測には、恐ろしく強い素朴なベースラインが存在します。
| ベースライン | 内容 | 強い場面 |
|---|---|---|
| ナイーブ予測 | 直前の値をそのまま出す | ランダムウォーク的な系列 |
| 季節ナイーブ | 「先週の同じ曜日」「昨年の同じ月」を出す | 季節性が支配的な系列(小売・アクセス数) |
| 移動平均 | 直近n期間の平均 | ノイズが大きい系列 |
実務データの多くは季節性が支配的なので、季節ナイーブに勝てないMLモデルは珍しくありません[1]。まずベースラインの精度を測り、それを超えた分だけが「モデルの価値」です。ベースライン比較のない精度報告を信じてはいけないのは、評価設計で書いたとおりです。
季節性・トレンド・イベントを分けて考える
時系列は「トレンド+季節性+イベント+残差」に分解して考えると扱いやすくなります。
- 季節性は多重です。小売なら「時間帯×曜日×月×年」の複数周期が重なります。どの周期が効いているかは、曜日別・月別の平均をプロットするだけでほぼ見えます
- イベント(祝日・セール・障害)は別枠で扱う。祝日フラグ・連休長・イベントカレンダーを特徴量にします。日本のデータなら祝日と「祝日の前後」の効果が大きく、ゴールデンウィークや年末年始は専用フラグに値します
- 外れ値は「消す」前に「意味を確認する」。障害でゼロになった日、テレビ放映で跳ねた日——これらを黙って除去すると、同じイベントが再来したとき予測が外れます。原因をイベント特徴量に変換できないかを先に考えます
手法の選び方 — 古典とMLの使い分け
| 状況 | 第一候補 |
|---|---|
| 系列が1本〜数本、説明性重視 | 古典手法(ETS/指数平滑法、ARIMA)[1] |
| 系列が数百〜数万本(SKU別・店舗別) | 勾配ブースティング(LightGBM等)+ラグ特徴量 |
| 外部変数が多い・非線形が強い | 勾配ブースティング |
| 超短期・高頻度(分単位) | 直近値ベース+異常検知の併用 |
実務で覚えておきたいのは、「多数の系列をまとめて1つのモデルで学習する」アプローチ(グローバルモデル)です。SKU別に数千のARIMAを管理する代わりに、ラグ特徴量(1日前・7日前・28日前の値)、移動平均、カレンダー特徴量を持つ1つの勾配ブースティングで全系列を予測する——需要予測コンペや実務で標準になった構成です。
深層学習(Transformer系の時系列モデル)は研究が活発ですが、表形式+勾配ブースティングを明確に上回るのは大量データ・複雑な条件が揃った場合で、最初の選択肢にはなりません。
評価指標と「外し方」の設計
- MAPEの罠: 実測がゼロに近い日があると発散します。ゼロを含む需要データでは、WAPE(総絶対誤差÷総実測)やMAEが安全です
- 外し方の非対称性: 在庫の予測なら「欠品(過小予測)」と「廃棄(過大予測)」のコストは違います。どちらに倒すかは業務の意思決定であり、分位点予測(例: 90%分位を発注量に使う)で表現できます
- 予測は区間で出す: 点予測だけでなく予測区間を出すと、下流(発注・人員配置)が「安全在庫をどれだけ積むか」を判断できます
このあたりの「予測をどう業務判断につなぐか」は、予知保全の記事で扱った故障予測としきい値運用の議論とまったく同じ構造です。
運用 — 予測は劣化する
時系列予測は作って終わりではありません。消費者の行動・商品構成・外部環境は変わり続け、モデルは静かに劣化します。
- 予測と実績の乖離を毎期監視する(それ自体が異常検知です)
- 再学習を定期運用に組み込む(週次・月次でローリング再学習)
- 「予測が外れた日」のレビュー会を業務側と持つ。外れの原因(イベント未登録・欠品による売上消失)はデータでは見えず、現場が知っています
まとめ
- 最優先はリークの排除: 時間で分割し、特徴量は「予測時点で手に入るか」を1列ずつ点検する
- 季節ナイーブに勝てて初めてモデルの価値。ベースラインなしの精度報告は無効
- 季節性・イベント・外れ値は分解して扱う。外れ値は消す前に意味を確認する
- 多数系列はラグ特徴量+勾配ブースティングのグローバルモデルが実務の定石。深層学習は最初の選択肢ではない
- 指標はWAPE/MAE基準、外し方の非対称性は分位点予測で業務に接続する
- 予測は劣化する。乖離監視と再学習をはじめから運用に組み込む
時系列予測は「未来を当てる魔法」ではなく、「過去のパターンが続くという仮定を、どこまで丁寧に扱うか」の技術です。丁寧さの大部分は、モデルではなく検証とデータの設計に宿ります。
参考文献・一次情報
- [1]
- [2]OFFICIALCross-validation: evaluating estimator performance — scikit-learn User Guide
TimeSeriesSplitなど時系列データの検証方法の公式解説