BC AIRCAST
PM2.5 · 24 H AHEAD
← ForecastModel & methodseval loop · live scoring
MODEL & METHODS

How the smoke-aware forecast works.

A residual PyTorch LSTM reads the last 48 hours of sensor and weather data and predicts PM2.5 one full day ahead for three BC monitoring stations.

24 h ahead
batch-scored forecasts across 3 BC monitoring stations
64,916
gap-safe 48-hour sensor and weather sequences
−28.5%
high-PM2.5 MAE versus XGBoost on the held-out smoke test
45.8%
high events detected (54/118), versus 6.8% for XGBoost
Four models, same smoke test
768 August forecasts, including 118 high and 63 severe readings. Lower is better.
Climatology
historical average for station and hour
25.117 RMSE 13.272 overall MAE
24 h persistence
same PM2.5 as this hour yesterday
23.004 RMSE 12.338 overall MAE
XGBoost
boosted trees trained on the same development period
20.738 RMSE 11.908 overall MAE
Residual LSTM v3
48 h × 16 features → 64 hidden units
21.963 RMSE 12.625 overall MAE
−28.5% high-event MAE vs XGBoost−4.5% RMSE vs 24 h persistence54/118 high events detected

XGBoost has the lowest overall error, but it detected only 8 of 118 high-PM2.5 events. V3 detected 54 and reduced high-event MAE from 42.14 to 30.14 µg/m³. The smoke-specific improvement is reported separately so it is not confused with overall accuracy.

Live, in production
Rolling 7-day MAE from the eval loop — no split, no lab conditions.
Prince George
Plaza 400 · sensor 4098
—
LSTM
—
naive
Vancouver
Clark Drive · sensor 9146190
—
LSTM
—
naive
Kelowna
KLO Road · sensor 1325038
—
LSTM
—
naive
The methodology check
Every mature forecast is joined to the real, non-imputed sensor reading for the same station and hour. The dashboard then reports rolling model MAE alongside a same-hour previous-day baseline.
End-to-end pipeline, measured
Three years of hourly OpenAQ and Open-Meteo data, loaded into Snowflake and transformed with dbt.
3
years of history
2
external APIs
146,745
raw records loaded
0
duplicate natural keys
68,509
model-ready feature rows
MAE — mean absolute error
Take every forecast, measure how far off it was, and average. V3's overall held-out MAE is 12.63 µg/m³; on the 118 high-PM2.5 events it is 30.14. High here means above 35.4 µg/m³.
RMSE — root mean squared error
Squares errors before averaging, so being wrong by 10 counts 100× more than being wrong by 1. The gap between RMSE and MAE reveals spikes — and for wildfire smoke, the spike days are exactly the days that matter for health. That's why both are reported.
PyTorchSnowflakedbtWeights & BiasesOpenAQOpen-Meteo
← Back to the live forecast