2026/06/24

ラグ特徴量をループで一括生成

記事イメージ
※画像はイメージです。本文と直接の関係はありません

ラグ特徴量をループで一括生成

LightGBMで時系列予測:ラグ特徴量活用ガイド

はじめに

本稿の問い
「時系列予測において、過去 1〜7 ステップのラグ特徴量は、どのようなデータ特性のもとで MAE を改善できるか」

仮説
短期的な自己相関が顕著で、ノイズが過度に大きくない系列に対しては、ラグ特徴量を追加すると MAE が数ポイント(目安は 3〜5 ポイント)改善する可能性がある。実務やコンペでラグ特徴量を導入した結果、同様の改善が報告されているケースがあります[1]。本稿では、ラグ特徴量の作成手順、目的変数の取り扱い、ハイパーパラメータ設定、特徴量重要度の活用方法を実務ですぐに使える形で解説する。


ラグ特徴量の効果と作り方

何をするか

目的変数(例:売上)を過去 1〜7 ステップ分シフトし、自己相関情報を新たな列としてモデルに供給する。

効果の目安

ラグを追加したベースラインは、ラグなしモデルに比べて MAE が約 3〜5 ポイント改善すると報告されている(参考文献 [1])。季節性が極めて強い系列や長期トレンドが支配的な場合は、ラグ数を増やしすぎるとノイズが増える可能性がある。

実装例(pandas)

# ラグ特徴量をループで一括生成
for i in range(1, 8):
    df[f'target_lag_{i}'] = df['target'].shift(i)

旧記述の target.shift1 は正しくは target.shift(1) であることに注意してください。

ラグ生成に伴う欠損の扱い

シフトにより生じた NaN過去データが存在しない期間 を意味するため、必ずしも前方補完すべきではない。

  • 欠損が少数であれば dropna() で対象行を除外する。
  • 欠損が多数ある場合は、LightGBM が内部で扱える欠損情報に任せる(そのまま保持する)。
  • どうしても補完が必要な場合は、線形補完や平均・中央値による補完を検討するが、テスト期間に未来情報が流入しないよう十分に注意する。

未来情報漏れへの注意

ラグ特徴量を作成する際に 学習データ全体の統計量で欠損を埋めてしまう と、検証データに未来情報が混入しリークが発生する。以下は安全な補完例である。

# 学習データの統計量だけで欠損を埋める例
train = df.iloc[:train_end]
valid = df.iloc[train_end:]

# ラグ生成後の欠損を学習データの中央値で補完(検証データには適用しない)
median_vals = train.median()
train = train.fillna(median_vals)
valid = valid.fillna(median_vals)   # ← ここでは学習データの統計量のみ使用

このように 学習データの統計量だけを検証データに適用 することで、情報漏れを防止できる。


データ前処理と目的変数の扱い方

日付分解

  • 年、月、日、曜日、祝日フラグ を個別の数値変数に変換し、カレンダー効果や季節性を明示的に学習させる。

カテゴリ変数のエンコーディング

  • ラベルエンコーディング:文字列カテゴリを整数に変換する。順序がないカテゴリに偽の順序が入らないよう、後続でターゲットエンコーディングやワンホット化を併用するのが望ましい。
  • ターゲットエンコーディング:カテゴリごとに目的変数の平均で置換する。訓練データ内で 時系列交差検証(TimeSeriesSplit)した平均値 を使用し、検証データに直接平均を流用しないことで情報漏洩を防止できる。
  • ワンホットエンコーディング:カテゴリを 0/1 の二値列に展開する。順序情報が不要な場合の安全策として利用可能だが、実装は省略する。
  • LightGBM のカテゴリ対応categorical_feature パラメータにラベルエンコードした列名を渡すことで、LightGBM が内部的にカテゴリとして扱える。追加のエンコーディングが不要なケースではこの機能を活用すると実装が簡潔になる。

欠損値の補完(元データ)

  • 前方補完(ffill)df = df.ffill() のように、過去の観測値だけで欠損を埋める。これによりテスト期間の未来情報が流入するリスクを回避できる。
  • 欠損が多数ある場合は、前述の線形補完や平均・中央値による補完も併せて検討する。

目的変数の変換と評価指標

  1. 対数変換np.log1p(target) で目的変数を変換し、外れ値の影響を抑えて学習を安定させる。売上のように常に正の値が保証されている場合に有効

    • 0 を含む場合log1p が有効である理由は、log(0) が定義できないため log1p(0)=0 と安全に変換できる点にある。
    • 負の値が含まれる場合は、変換前に最小値を足す等の前処理が必要であることを付記しておく。
  2. MAE の計算手順

    • 変換後のデータで MAE を算出し、単位は対数スケールになる。
    • 予測結果を np.expm1 で逆変換し、元スケールの予測値と実測値の差から 元スケールの MAE を再計算する。
    • 変換前後の MAE は尺度が異なるため、報告時はそれぞれの単位を明示する。
  3. 評価指標の整合性

    • 本稿の問いは「MAE を改善できるか」なので、元スケールの MAE を最優先 で評価指標として扱う。
    • 対数変換を行うとモデルは「対数スケールでの誤差」を最小化しようとし、実質的に「比率(パーセント)の誤差」を重視する傾向になる。したがって、変換なしモデルと比較し、元スケールの MAE が本当に改善しているかを必ず確認することが重要である。

LightGBM のハイパーパラメータと過学習対策

  • 木の深さ上限(max_depth):6 に設定すると、木の深さを制限して過学習を抑える効果がある。データ規模や特徴量数に合わせて調整する。
  • 学習率(learning_rate):0.05 と小さめに設定し、安定した学習を実現する。
  • 葉の数(num_leaves):31 が表現力と計算コストのバランスとして一般的だ。
  • 早期停止:最新の LightGBM(v3.3.0 以降)では early_stopping_rounds を直接 fit の引数に渡すのではなく、コールバック関数 lgb.early_stopping(stopping_rounds=50) として指定することが推奨されている。環境によっては警告が出るため、こちらの書き方を採用するのが安全である。

ハイパーパラメータは上記をベースに、Optuna やグリッドサーチnum_leavesmin_child_samples などを探索するのが実務的だ。データ件数が多い場合は max_depth を深めたり、learning_rate を若干小さくしたりして、モデルの表現力と過学習リスクのトレードオフを調整する。


ラグ特徴量と「未来情報」

予測フェーズで 1 ステップ先 を予測する場合はラグ 1 が利用できるが、7 ステップ先 を直接予測しようとするとラグ 1〜6 が「未知」になる。

手法の選択肢

再帰的予測
  └─ 予測ステップ t+1 の出力をラグ1 として次ステップ t+2 に入力
直接予測
  └─ 各ホライズン(t+1, t+2, …, t+7)ごとに別々のモデルを学習

長期予測では ラグ生成時に shift を正しく使い、未来のデータが混入しないよう注意 することが重要である。


特徴量重要度の可視化と活用

  • ラグ特徴量の位置付け:重要度が高いほど、過去の目的変数が現在の予測に強く影響していることを示す。
  • 改善のヒント:重要度が低い特徴は削除または別のエンジニアリングを検討し、モデルをシンプル化して計算コストを削減できる。
  • 業務への説明:上位変数を業務担当者に示すことで、売上に何が影響しているかを定量的に説明でき、意思決定に活用できる。

実装フローの全体像

  1. データ読み込み:CSV を pandas に読み込む。
  2. 特徴量生成:ラグ特徴量、日付分解、カテゴリエンコーディングを関数化して一括生成する。
  3. 欠損補完:ラグ生成で生じた欠損は dropna() か LightGBM の欠損対応を利用し、元データの欠損は ffill() で前方補完する。
  4. 目的変数変換np.log1p で対数変換し、評価指標は MAE に設定する。
  5. 時系列分割:過去 70 % を訓練、直近 30 % を検証とし、最低 1 サイクル分(例:12 か月)を検証データに含める。ランダム分割ではなく、時系列順に分割(TimeSeriesSplit) することでリークを防止する。
  6. モデル学習:前述ハイパーパラメータで LightGBM を学習し、lgb.early_stopping(stopping_rounds=50) をコールバックとして設定する。
  7. スコア算出:検証データで対数スケールと元スケールの MAE をそれぞれ計算し、結果を比較する。
  8. 特徴量重要度取得model.feature_importance_ を取得し、上位変数をレポート化する。
  9. テスト予測:テストデータで予測し、Kaggle 形式の CSV を作成して提出する。

まとめ

  • ラグ特徴量は短期相関が強いデータに対して有効であり、過去 1〜7 ステップを追加すると、ラグなしモデルに比べて MAE が数ポイント改善するケースがある(参考文献 [1])。
  • 日付分解・カテゴリエンコーディング・欠損処理 と組み合わせることで、データ全体の情報密度を高められる。
  • 対数変換後の MAE と元スケールの MAE は別指標として扱い、元スケールの MAE が実務上の目標改善を満たすか必ず確認する。
  • ハイパーパラメータは一例として提示し、実データに合わせたチューニング(例:num_leaves の探索)を行うことが重要だ。最新の LightGBM では早期停止をコールバックで指定する点に留意する。
  • 特徴量重要度を定期的に確認し、ラグ特徴量の寄与度や不要変数の除去を行うことで、モデルの解釈性と運用コストを最適化できる。
  • ターゲットエンコーディングは高度なテクニックであるため、まずはカレンダー特徴量とラグ特徴量でベースラインを構築し、精度が飽和した段階で導入を検討すると学習コストが抑えられる。

時系列データに LightGBM を適用する際は、まず ラグ特徴量の作成 から始めよう。シンプルながら大きな効果が期待でき、実務でもコンペでもすぐに試せる手法である。


参考URL

[1] https://www.kaggle.com/code/tatsuyafujii/lightgbm-baseline

[2] https://www.kaggle.com/code/masahirore3/lightgbm

[3] https://github.com/c60evaporator/lightgbmearlystopping/blob/main/lightgbmsklearnapicvnew.py