veranoscience/home-credit-scoring-api
Home Credit - MLOps Scoring API (FastAPI + Docker + CI/CD)
Système de scoring de risque de défaut, du modèle à la production. L'enjeu n'est pas la performance brute du classifieur mais sa fiabilité dans le temps : un seuil de décision calé sur le coût métier des erreurs, et une surveillance de la dérive des données pour détecter quand le modèle cesse d'être valide.
Sommaire:
- tracking & registry MLflow (expérimentations + modèle final versionné),
- API FastAPI exposant une prédiction de probabilité de défaut,
- tests automatisés (pytest),
- conteneurisation Docker,
- CI/CD GitHub Actions (tests + build Docker + déploiement sur Hugging Face Spaces),
- Monitoring (logs JSONL + Postgres) & data drift (PSI / Evidently),
- Profiling cProfile + optimisation preprocessing (NumPy → DataFrame)
Sommaire
- Architecture
- Pré-requis
- Installation (local)
- Lancer l’API (local)
- Utiliser l’API
- Démo HF
- Tests
- Docker
- CI/CD
- Artefacts du modèle
- Conventions & décisions
- Optimisation performance
Architecture
.
├── src/
├── tests/
├── notebooks/
├── monitoring/
├── prod_logs
├── Dockerfile
├── docker-compose.monitoring.yml
├── pyproject.toml
├── uv.lock
├── .github/workflows/
├── README.md
├── reports
├── requirements.txt
---
## Pré-requis
- Python **3.12** (recommandé, aligné avec l’image Docker)
- `uv` (gestion d’environnement / dépendances)
- (optionnel) Docker Desktop
---
## Installation (local)
à la racine du repo
uv sync --frozen --dev
---
## Lancer lÀPIuv run uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
Puis ouvrir :
- Swagger UI : http://127.0.0.1:8000/docs
- Healthcheck : http://127.0.0.1:8000/health
---
## Utiliser l'API
Endpoints
- GET /health : statut + modèle chargé
- GET /metadata : informations modèle + seuil
- POST /predict : prédiction d’un client
---
## Démo HF
Base URL : `https://<HF_USERNAME>-<HF_SPACE_NAME>.hf.space`
Exemples :
curl -s https://<HFUSERNAME>-<HFSPACENAME>.hf.space/health curl -s https://<HFUSERNAME>-<HFSPACENAME>.hf.space/metadata
curl -s -X POST https://<HFUSERNAME>-<HFSPACENAME>.hf.space/predict \ -H "Content-Type: application/json" \ --data @tests/samplepayload.json
---
## Tests
uv run pytest -q
Tests couverts :
- /health répond 200
- /predict avec payload valide répond 200
- rejet si feature inconnue (422)
- rejet si features vide (422)
---
## Docker
Builddocker build -t homecredit-api .
Rundocker run --rm -p 8000:8000 homecredit-api
http://127.0.0.1:8000/docs
---
## CI/CD
Le pipeline GitHub Actions exécute :
1. Tests (pytest)
2. Build Docker
3. Déploiement sur Hugging Face Spaces
Fichier : .github/workflows/ci-cd.yml
**Secrets / Variables nécessaires**
Dans GitHub → Settings → Secrets and variables :
**Secret**
HF_TOKEN : token Hugging Face avec accès à la Space
**Variables**
HF_USERNAME : username HF
HF_SPACE_NAME : nom de la Space (repo Spaces)
---
## Artefacts du modèle
Le runtime de l’API repose sur :
`src/app/artifacts/model.pkl` : pipeline entraîné (préprocessing + modèle)
`src/app/artifacts/feature_cols.json` : liste des features attendues (ordre training)
`src/app/artifacts/threshold_config.json` : seuil + coût métier
Le modèle est chargé une seule fois au démarrage de l’API, puis réutilisé à chaque requête.
---
## Conventions & décisions
- Problème déséquilibré : gestion via scale_pos_weight (XGBoost) + seuil métier.
- Métrique principale : business cost avec FN=10, FP=1.
- Seuil : optimisé sur OOF (Out-Of-Fold) pour minimiser le coût.
- API : validation stricte des features (rejette les inconnues, complète les manquantes par None/NaN).
---
## Optimisation performance
Avant optimisation :
- mean ~ 13.76 ms, p95 ~ 15.99 ms
- preprocessing p95 ~ 6.28 ms
Après optimisation preprocessing (NumPy → DataFrame) :
- mean ~ 8.09 ms, p95 ~ 9.94 ms
- preprocessing p95 ~ 0.64 ms
- inference p95 ~ 6.41 ms (bottleneck restant)
