Skip to content
View jameskoero's full-sized avatar
💭
Open to remote ML Engineer and MLOps roles
💭
Open to remote ML Engineer and MLOps roles

Block or report jameskoero

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
jameskoero/README.md
James Koero, Machine Learning Engineer, Kisumu, Kenya. MLOps, geospatial and applied ML.

Live dashboard Source code Zenodo DOI LinkedIn ORCID

👋 Hello, I am James

I build machine learning systems, then try to break them. In 2026 I audited my own flood model, found that its headline metric was circular, retracted it, and rebuilt the whole system from real satellite data under strict leakage control. The rebuild is public, released as v2.0.0, and every number below can be re-derived from files in the repository.

I came to ML from physics and geophysics: B.Sc. Physics and Mathematics (Moi University), a geophysics attachment at KenGen Olkaria, then seven years in Kenyan insurance and investment distribution. Everything here was built on an Android phone with Termux and Google Colab, over mobile data.

What I do

  • 🛰️ Build end-to-end systems, from raw satellite data to a live API and dashboard.
  • 🧪 Validate honestly: event-based cross-validation, sealed test sets, and public retractions of my own results.
  • 📦 Ship reproducibly: ONNX models verified by SHA-256, hash-locked Docker images, CI gates on data and claims.
  • 🛡️ Add LLMs safely: output guards and deterministic fallbacks.
  • 📐 Use physics as a prior: monotonic constraints and physical baselines.

📊 Nyando Flood AI V2 at a glance

Per-event mean AUC: 0.971 Gain over elevation: +0.038 Real samples: 4,420 Sealed test events: 27 Test files in CI: 96 Deviation register: 58 rows

Gain over elevation alone: 95% interval 0.019 to 0.061, pooled over 50 events. Sealed test: 27 held-out events, scored once. Data: 35 Sentinel-1 scene dates.

🌊 Flagship: Nyando Flood AI V2

An open-source system that ranks flood susceptibility across five wards of the Nyando basin in Kenya.

What Result
Data Copernicus GFM labels and Google Earth Engine features. No synthetic data.
Sealed test 27 held-out flood events, scored once under rules fixed in advance
Ranking skill Per-event mean AUC 0.971, against 0.939 for ranking by elevation alone
Where it does not hold Not shown under a 1 km spatial buffer or an out-of-time split. The model card says so.
  • Model: gradient boosting with monotonic constraints, chosen against logistic, XGBoost and a PyTorch physics-constrained neural network. The network violated the constraints, so I did not ship it.
  • Serving: custom ONNX exporter (parity 3.3e-16), FastAPI service that verifies the model's SHA-256 before loading, rate limiting, security headers, hash-locked Docker image.
  • Engineering: GitHub Actions gates for data, manifests and README claims, CodeQL, MLflow tracking on DagsHub, and a deviation register that tests enforce.
  • LLM layer: an advisory service (Gemini, Groq fallback, deterministic template) behind an output guard, plus an MCP server and a LangGraph pipeline. One model passed my guard 6 of 6 times yet named the correct drivers 0 of 6, so driver text now comes only from the template.

Scores are rankings from a case-control sample. They are not flood probabilities, forecasts or official warnings.

🧰 Tech stack

Machine learning
Python scikit-learn Gradient Boosting XGBoost PyTorch SHAP ONNX Runtime pandas NumPy

Validation and statistics
Leave-one-event-out CV Spatial CV Leakage audits Bootstrap intervals Monotonic constraints Model cards

Geospatial
Google Earth Engine Sentinel-1 SAR Copernicus GFM Remote sensing

MLOps and delivery
GitHub Actions MLflow DagsHub Docker pytest CodeQL Dependabot Render Vercel

Backend and web
FastAPI Flask React JavaScript PostgreSQL SQLite

LLM and agents
Gemini API Groq API Output guardrails MCP LangGraph

🚀 More projects

🏦 Loan Default Risk
Credit-default model on German Credit data (GradientBoosting). Cost-optimised threshold 0.22 from a 5:1 false-negative cost matrix. Test ROC-AUC 0.791, Gini 0.582, recall 0.833. I corrected my own overstated README metrics to these verified values.
Code | App
💰 AfriSalaries
Salary-band classifier across 8 African markets (FastAPI, XGBoost, TF-IDF, SHAP). 1,526 real records, 59.5% band accuracy. Two regression designs rejected on validation grounds.
Code | App
🥇 Kenya at Gold
Open dataset and API on Kenya's 39 Olympic golds, with a four-dimension governance framework (FastAPI, SQLite). Code MIT, data CC-BY 4.0.
Code | Dashboard
🏢 ChurchOS
Multi-tenant church management SaaS: JWT auth, 5-role access control, finance audit log, M-Pesa and Flutterwave integration. Phase 1 live.
Code | App
🧩 SegmentIQ
K-Means customer segmentation, 5 segments, CSV batch upload (FastAPI, React).
Code | App
🚢 Titanic Survival
Leak-free scikit-learn pipeline, hold-out ROC-AUC 0.8661 with bootstrap 95% intervals.
Code | DOI

🎯 Currently

  • Building Sokoni, a WhatsApp AI sales agent for Kenyan SMEs. The backend is scaffolded and the agent logic is not built yet.
  • Learning retrieval-augmented generation and model fine-tuning. Nothing shipped yet.
  • Open to remote Machine Learning Engineer, MLOps and Applied Scientist roles.

🎓 Education and certifications

  • B.Sc. Physics and Mathematics, Moi University, 2012
  • Machine Learning using Python, Google Developers Launchpad (Certificate of Excellence), 2025
  • Python Basics, Programiz, 2025

I came into ML from geophysics, where a wrong model can mean a wrong drilling decision. That is why every model I ship comes with what its number means, and what it does not.

Building from Kisumu, Kenya, one model at a time

Pinned Loading

  1. nyando-flood-ai nyando-flood-ai Public

    Flood-susceptibility ranking for the Nyando Basin, Kenya. Sentinel-1 labels, leave-one-event-out validation, monotonic gradient boosting (ONNX), FastAPI, React dashboard. Ranking scores, not flood …

    Python 1

  2. afrisalaries afrisalaries Public

    ML model predicting hidden tech salaries across Africa from job descriptions | XGBoost, FastAPI, Docker, SHAP, React

    Python 1

  3. titanic-survival-prediction titanic-survival-prediction Public

    Senior-grade Logistic Regression on Titanic · Leak-free sklearn Pipeline + ColumnTransformer · SHAP waterfalls for Andrews/Dean/Brown · 13 evaluation charts · Bootstrap 95% CIs · F2-tuned threshold…

    Python 1

  4. loan-risk-assessment loan-risk-assessment Public

    Live loan default risk ML system — GradientBoosting, SMOTE, Flask API, cost-optimized threshold. Python.

    Jupyter Notebook 1

  5. ChurchOS ChurchOS Public

    Africa-first multi-tenant SaaS for church governance, finance, and member management. Flask + React + PostgreSQL + M-Pesa.

    Python 1

  6. kmeans-customer-segmentation kmeans-customer-segmentation Public archive

    K-Means clustering on Mall Customers dataset — 5 customer segments, business insights, and visualisations. Built on Android using Google Colab. Python · scikit-learn · matplotlib

    Jupyter Notebook 1