LSTM Groundwater Level Forecasting β€” UK

A tuned LSTM model for single-step monthly groundwater level forecasting using meteorological variables as exogenous inputs.

Model Details

Parameter Value
Architecture LSTM(128) β†’ Dropout(0.1) β†’ Dense(32) β†’ Dense(1)
Framework TensorFlow / Keras
Task Single-step monthly forecasting
Lookback window 24 months
Input features water_level, temperature, precipitation, wind_speed
Tuning method Bayesian Optimisation (Keras Tuner, 20 trials)

Data Splits

Split Period Months
Training 1944-01-01 β†’ 2007-10-01 766
Validation 2007-11-01 β†’ 2015-10-01 96
Test 2015-11-01 β†’ 2023-10-01 96

Best Hyperparameters

Parameter Value
LSTM layers 2
Units 64
Dropout 0.1
Learning rate 0.000773
Batch size 32

Test Set Performance

Metric Value
RMSE 2.9386 m
MAE 2.397 m
MAPE 3.671%
RΒ² 0.5505
NSE 0.5505

This model is part of a benchmark study comparing SARIMAX, LSTM, and TCN for UK groundwater level forecasting.

Important Note

Contemporaneous meteorological variables are used as inputs at forecast time (oracle assumption). Future met values are treated as known β€” consistent with the experimental setup used across all models in this study.

Repository Contents

β”œβ”€β”€ lstm_model.keras    # Trained Keras model
β”œβ”€β”€ scaler_X.pkl        # Feature scaler (MinMaxScaler)
β”œβ”€β”€ scaler_y.pkl        # Target scaler (MinMaxScaler)
β”œβ”€β”€ model_config.json   # Config, hyperparameters & metrics
β”œβ”€β”€ inference.py        # Load model & generate forecasts
└── README.md           # This file

Quick Start

from huggingface_hub import hf_hub_download
from tensorflow.keras.models import load_model
import joblib, pandas as pd, numpy as np

model    = load_model(hf_hub_download('kozy9/GWLSTM', 'lstm_model.keras'))
scaler_X = joblib.load(hf_hub_download('kozy9/GWLSTM', 'scaler_X.pkl'))
scaler_y = joblib.load(hf_hub_download('kozy9/GWLSTM', 'scaler_y.pkl'))

# Provide a 24-month window of features
X_window = pd.DataFrame({
    'water_level'  : [...],   # 24 values
    'temperature'  : [...],
    'precipitation': [...],
    'wind_speed'   : [...],
})

X_scaled = scaler_X.transform(X_window)
X_input  = X_scaled.reshape(1, 24, 4)
y_scaled = model.predict(X_input)
pred     = scaler_y.inverse_transform(y_scaled)[0][0]
print(f'Next month forecast: {pred:.2f} m')
Downloads last month
23
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Space using kozy9/GWLSTM 1