PM2.5 air quality prediction for 40 Cameroonian cities (2020–2025) physics-calibrated ERA5 proxy + XGBoost/LightGBM
# TERRA — Système de Surveillance PM2.5 · Cameroun
> **Prévision de la qualité de l'air PM2.5 pour 40 villes camerounaises (2020–2025)**
> Proxy physico-calibré ERA5 · XGBoost/LightGBM · Inférence temps réel · GitHub Actions
>
> *Hackathon IndabaX Cameroon 2026 — Équipe L'Aube Africaine*
---
## Results at a Glance
| Metric | Value |
|---|---|
| Cities covered | 40 (all regions of Cameroon) |
| Period | 2020-01-01 → 2025-12-20 |
| Proxy calibration target | 32.5 µg/m³ (AQLI 2023 national mean) |
| XGBoost R² (test 2025) | **0.9929** |
| LightGBM R² (test 2025) | **0.9940** |
| Ensemble R² (test 2025) | **0.9939** |
| Ensemble RMSE | **1.55 µg/m³** |
| Real-time forecast horizon | **7 days** (extensible to 16 via workflow_dispatch) |
---
## Problem
No ground-truth PM2.5 measurements exist for Cameroon. The challenge: build a reliable air quality prediction system from scratch using only reanalysis data.
**Solution:** A two-stage pipeline:
1. Build a **physics-calibrated PM2.5 proxy** from ERA5 meteorological variables and NASA FIRMS fire data
2. Train **ML models** (XGBoost + LightGBM) on this proxy to predict future PM2.5
---
## PM2.5 Proxy Formula
```
PM2.5 = C_base × F_stagnation × F_wet × F_wind × F_harmattan × F_hygro × F_fire
```
| Factor | Formula | Physics |
|---|---|---|
| `F_stagnation` | `(1000/BLH)^0.6` clipped [0.3, 3.5] | Low boundary layer = pollution accumulation |
| `F_wet` | `1/(1 + 0.08×rain_mm)` | Wet scavenging by precipitation |
| `F_wind` | `exp(-0.035×wind_kmh)` suppressed during Harmattan | Turbulent dilution |
| `F_harmattan` | `1 + 1.4×is_dry×(lat-3)/8` | Saharan dust transport Nov–Mar |
| `F_hygro` | `min(1 + 0.004×max(0,RH-75), 1.3)` | Hygroscopic growth (Swietlicki et al. 2008) |
| `F_fire` | `1 + 0.02×log(1+FRP_75km)` | Biomass burning (NASA FIRMS MODIS) |
`C_base` auto-calibrated so national annual mean = **32.5 µg/m³**.
---
## Pipeline
```bash
# 1. Extract ERA5 weather for 40 cities (2020–2025)
conda run -n hackathon_pm …