Logo Lanfrica

jameskoero/nyando-flood-ai: Nyando Flood AI v1.0.0 — Real GEE Satellite Data · AUC 0.9717

Domaine:

climategeospatial

Type de record:

modeldatasetsoftware
Créateur:
Jam
Éditeur:
Zenodo
Hôte:avatar

🌊 Nyando Basin Flood Risk Prediction System — v1.0.0

AI-powered flood early warning for Nyando River Basin, Kisumu County, Kenya. Ward-level susceptibility mapping trained on real Google Earth Engine satellite data.

📊 Model Performance

| Metric | Score | |---|---| | AUC-ROC | 0.9717 | | F1-Score | 0.9022 | | Precision | 0.8830 | | Recall | 0.9222 | | Brier Score | 0.0736 | | CV AUC (5-fold) | 0.9727 ± 0.0040 |

Model: GradientBoostingClassifier · scikit-learn 1.4+ Data: 2,308 real GEE observation points · Nyando sub-county, Kenya

📦 What's Included in This Release

  • ✅ Trained model — models/nyando_xgb_v1.pkl
  • ✅ Training dataset — data/training/nyando_training_v1.csv (5,000 rows)
  • ✅ Raw GEE extract — data/training/nyando_training_v1_raw_gee.csv (2,308 points)
  • ✅ 4 Jupyter notebooks (GEE extraction → EDA → Modelling → Feature analysis)
  • ✅ 9 evaluation charts (ROC, confusion matrix, SHAP, calibration, spatial CV...)
  • ✅ FastAPI backend — live at nyando-flood-api.onrender.c…
  • ✅ CI pipeline — 15 automated tests passing on every commit
  • ✅ MODEL_CARD.md — full transparency card (Mitchell et al. 2019 standard)
  • ✅ Funding concept note — docs/funding/concept_note_v1.md

🛰️ Real Satellite Data Sources

| Feature | Source | License | |---|---|---| | Elevation & Slope | NASA NASADEM 30m | Public Domain | | 3-Day Rainfall | CHIRPS v2 (UCSB) | CC-BY-4.0 | | Flood Labels | Sentinel-1 SAR (ESA) | Free Copernicus | | Soil Clay 0-5cm | ISRIC SoilGrids | CC-BY-4.0 | | River Distance | HydroSHEDS / OSM | ODbL | | Land Cover | ESA WorldCover 2021 | CC-BY-4.0 |

Real feature ranges: Elevation 1,131–2,588m · Rainfall 81.8–162.3mm · Clay 25.9–57.1%

⚡ Quick Start

# Load the model directly
import joblib, numpy as np
model = joblib.load("models/nyando_xgb_v1.pkl")

sample = np.array([[1142.5, 2.3, 87.4, 320.0, 42.1, 40]])
# [elevation, slope, rainfall_3day, distance_river, clay_percent, land_cover]

risk = model.predict_proba(sample)[0, 1]
print(f"Flood risk score: {risk:.3f}")  # 0.0–1.0