LSTMからハイブリッドへ:降雨流出解析プロトタイプ作成 Step 3 タンクモデル + LSTM残差補正を実装する
はじめに
前回までに、以下の2段階を作成しました。
Step 1:
LSTM単独モデル
Step 2:
実効雨量・先行降雨指数などの水文特徴量を追加
今回は Step 3 として、タンクモデルなどの物理・概念モデルを追加し、さらにLSTMで残差を補正するハイブリッドモデルを作成します。
プロトタイプ名は以下です。
RainfallRunoffHybrid_Prototype_r001
参考のために、ZIPファイルを置いておきますので、ダウンロードして活用してください。
今回の目的
今回の目的は、以下です。
1. 簡易タンクモデルで物理モデル流量 Q_phys を計算する
2. 観測流量 Q_obs との差 residual を求める
3. LSTMで residual を学習する
4. Q_hybrid = Q_phys + residual_pred として最終流量を計算する
5. タンクモデル単独とハイブリッドモデルを比較する
モデルの考え方
Step 1・Step 2では、LSTMで流量を直接予測しました。
雨量・気温・蒸発散量・水文特徴量
↓
LSTM
↓
流出高 q_mm_day
一方、Step 3では、まずタンクモデルで流量を計算します。
雨量・蒸発散量
↓
タンクモデル
↓
物理モデル流量 Q_phys
その後、観測流量との差を残差として定義します。
residual = Q_obs - Q_phys
LSTMはこの残差を学習します。
入力:
雨量・気温・蒸発散量
実効雨量
API
累積雨量
前日流量
物理モデル流量 Q_phys
出力:
residual_pred
最終的な流量は以下です。
Q_hybrid = Q_phys + residual_pred
全体イメージ
step 3の全体イメージです。
フォルダー構成
RainfallRunoffHybrid_Prototype_r001/
├─ docker/
│ ├─ Dockerfile
│ └─ requirements.txt
├─ docker-compose.yml
├─ .env
├─ configs/
│ ├─ hybrid_config.yaml
│ └─ hybrid_config_quick.yaml
├─ data/
│ ├─ raw/
│ └─ processed/
├─ src/
│ ├─ generate_sample_data.py
│ ├─ preprocess.py
│ ├─ hydrology_features.py
│ ├─ model_tank.py
│ ├─ datasets.py
│ ├─ model_lstm.py
│ ├─ train_hybrid.py
│ ├─ evaluate.py
│ ├─ predict.py
│ ├─ metrics.py
│ └─ utils.py
├─ outputs/
│ ├─ models/
│ ├─ figures/
│ ├─ metrics/
│ └─ predictions/
├─ scripts/
└─ docs/
追加した主なファイル
| ファイル | 内容 |
|---|---|
src/model_tank.py |
2段タンクモデル |
src/preprocess.py |
水文特徴量とタンク流量、残差を作成 |
src/model_lstm.py |
LSTM残差補正モデル |
src/train_hybrid.py |
残差LSTMの学習 |
src/evaluate.py |
タンク単独とハイブリッドの評価 |
configs/hybrid_config.yaml |
通常設定 |
configs/hybrid_config_quick.yaml |
簡易テスト設定 |
タンクモデル
今回のタンクモデルは、プロトタイプ用の簡易2段タンクモデルです。
雨量 P
↓
上段タンク
├─ 速い流出 Q_quick
└─ 下段タンクへ浸透
↓
下段タンク
└─ 遅い流出 Q_slow
最終的な物理モデル流量は以下です。
Q_phys = Q_quick + Q_slow
この Q_phys をLSTMの入力にも使います。
学習対象
LSTMの学習対象は、観測流量そのものではなく、タンクモデルの残差です。
residual = Q_obs - Q_phys
これにより、LSTMは物理モデルが表現しきれなかった非線形応答やバイアスを補正します。
設定ファイル
features:
dynamic_inputs:
- precip_mm
- temp_c
- pet_mm
- eff_rain_hl7_mm
- eff_rain_hl30_mm
- api_k85_mm
- api_k95_mm
- rain_sum_3d_mm
- rain_sum_7d_mm
- rain_sum_30d_mm
- q_prev_mm_day
- doy_sin
- doy_cos
- q_phys_mm_day
Step 2の特徴量に、q_phys_mm_day を追加しています。
実行方法
簡易テスト
docker compose run --rm rainfall-runoff-hybrid bash scripts/run_quick_test.sh
個別に実行する場合
docker compose run --rm rainfall-runoff-hybrid python src/generate_sample_data.py
docker compose run --rm rainfall-runoff-hybrid python src/preprocess.py --config configs/hybrid_config.yaml
docker compose run --rm rainfall-runoff-hybrid python src/train_hybrid.py --config configs/hybrid_config.yaml
docker compose run --rm rainfall-runoff-hybrid python src/evaluate.py --config configs/hybrid_config.yaml
出力される図
outputs/figures/
├─ loss_curve_hybrid.png
├─ hydrograph_hybrid_test.png
├─ scatter_obs_pred_hybrid.png
└─ residual_comparison_hybrid.png
ハイドログラフ比較図

散布図

残差比較図

評価指標
評価では、以下の2つを比較します。
1. tank_physical
2. hybrid_tank_lstm
評価指標は以下です。
| 指標 | 内容 |
|---|---|
| NSE | 観測流量と予測流量の一致度 |
| KGE | 相関・ばらつき・バイアス |
| RMSE | 平均二乗誤差の平方根 |
| MAE | 平均絶対誤差 |
| Bias | 全体的な過大・過小評価 |
| Peak Error | ピーク流量誤差 |
今回の位置づけ
今回の RainfallRunoffHybrid_Prototype_r001 は、LSTM単独モデルからハイブリッドモデルへ進む最初の段階です。
Step 1:
LSTM単独モデル
Step 2:
水文特徴量を追加したLSTM
Step 3:
タンクモデル + LSTM残差補正
この段階では、まだ高度な物理制約付きモデルや微分可能水文モデルは使いません。
まずは、物理モデルの出力をLSTMで補正する、分かりやすいハイブリッド構成を確認します。
注意点
今回のタンクモデルは、プロトタイプ用の簡易モデルです。
実流域へ適用する場合は、以下が必要です。
- タンクモデル構造の妥当性確認
- パラメータ同定
- 実測雨量・流量による検証
- 洪水イベントごとの評価
- 水収支の確認
- 未経験豪雨に対する外挿性の確認
まとめ
今回は、降雨流出解析プロトタイプのStep 3として、タンクモデル + LSTM残差補正を実装しました。
RainfallRunoffHybrid_Prototype_r001
この構成では、物理モデルの説明性を残しつつ、LSTMで残差や非線形応答を補正します。
次の段階では、タンクモデルのパラメータ最適化や、微分可能タンクモデルへの拡張を検討できます。

