Home_Credit_API / README.md
Diaure's picture
CD: update from GitHub main
bb6bf65 verified
|
Raw
History Blame Contribute Delete
13.5 kB
---
title: Home Credit API
emoji: 🚀
colorFrom: blue
colorTo: green
sdk: docker
app_file: app.py
pinned: false
---
# Classification Risque Crédit - Pipeline MLOps
## Contexte
L’entreprise souhaite mettre en place un système automatisé de scoring crédit capable :
- d’estimer la probabilité de défaut d’un client,
- de classer automatiquement une demande en crédit accordé ou crédit refusé,
- tout en garantissant transparence et industrialisation du cycle de vie du modèle.
Au‑delà de la modélisation, la mission inclut une dimension **MLOps avancée**, indispensable pour un modèle déployé en production:
- collecte et stockage des logs de prédiction,
- monitoring continu du drift et des métriques système,
- analyse des performances réelles du pipeline (latence, CPU, RAM),
- identification et optimisation des goulots d’étranglement,
- mise en place d’un dashboard complet pour suivre l’état du modèle dans le temps.
Ce projet couvre donc l’ensemble du cycle de vie : **modélisation > déploiement > monitoring > optimisation**.
## Objectifs du projet
Ce projet a pour objectif principal de **construire et optimiser un modèle de scoring prédictif du risque de défaut**.
Autrement dit, il faudra:
- Analyser les variables explicatives:
- Feature importance globale
- Explicabilité locale (niveau client)
- Implémenter une démarche MLOps complète:
- Tracking des expérimentations
- Model Registry
- Serving
- Optimiser un score métier prenant en compte:
- Le déséquilibre de classes
- Le coût asymétrique des erreurs (FN = 10 × FP)
- Comparer plusieurs modèles via Cross-Validation et GridSearch <> Sélectionner le modèle minimisant le coùut métier
- Déployer et surveiller (MLOps)
- Service du modèle via une API FastAPI (local, HuggingFace, Gradio)
- Collecte & stockage des logs de prédiction et métriques système
- Rapport Evidently pour l'analyse des dérives des données, des distributions entre les données de référence et de production
- Conception d'un dashboard Streamlit
- Optimisation des performances: profiling du pipeline, identification des goulots d'étranglement, comparaison des performances
L’objectif final est de garantir un modèle **performant**, **observable**, **scalable** et **maintenable** en production.
## Sources de données
![Lien entre les tables](https://raw.githubusercontent.com/Diaure/Classification-Risque-Credit-Pipeline-MLOps-/master/Images/Schemas_tables.png)
Nous avons reçu des données provenant de sources multiples:
- Socio‑démographiques
- Historiques de crédit
- Comportements de paiement
- Interactions avec d’autres institutions
## Nettoyage structurel des données
Avant toute modélisation, un nettoyage approfondi a été réalisé pour garantir la qualité des données :
**1. Harmonisation des types**
- Conversion des dates en format datetime
- Uniformisation des variables catégorielles
- Correction des types numériques (float/int)
**2. Préparation des valeurs manquantes & outliers**
L’objectif ici n’est pas de *“nettoyer à la main”*, mais de préparer les données pour qu’elles soient
traitées de manière systématique dans le pipeline MLOps, sans logique ad hoc.
**3. Nettoyage structurel**
- Harmonisation des noms de varibales et modifications des formats
- Suppression des colonnes constantes ou quasi‑constantes
- Suppression des identifiants non pertinents
- Vérification des doublons
- Fusion des tables <> obtenir un seul historique complet des comportements des clients.
## Feature Engineering
Pour chaque client, des agrégations (*min, max, mean, count, sum*) ont été calculées sur les tables.
Concernant les colonnes crées, nous avons choisi d'intéger des varialbles majoritairement liées au comportement réel de remboursement du crédit:
- **PAYMENT_DELAY**: retard réel vs prévu
- **LATE_PAYMENT**: indicateur de retard
- **PARTIAL_PAYMENT**: paiement incomplet
- **EARLY_PAYMENT**: paiement anticipé
- **PAYMENT_RATIO**: montant payé / montant
- **UTILIZATION**: utilisation du crédit
PAYMENT_RATIO : ratio paiement / retraits
## Analyse exploratoire — Conclusions clés
L’analyse exploratoire a permis d’identifier plusieurs signaux forts sur le profil des *mauvais payeurs*:
**1. Variables socio‑démographiques**
- Revenus faibles présentent un taux de défaut plus élevé
- Les célibataires et divorcés sont plus à risque
- Les niveaux d’éducation inférieurs sont associés à un risque accru
**2. Historique de crédit**
- Les clients ayant déjà eu des retards plus risqués
- La capacité de remboursement du client est un des indicateurs forts
- Un ratio payé/dû traduisant des paiements irréguliers.
**3. Comportement de paiement**
- Les refus antérieurs sont très prédictifs
- Les nouveaux clients sont plus incertains
- Les retards successifs sont très discriminants
## Approche Machine Learning Operations (**MLOps**)
Le projet suit une démarche MLOps complète :
**1. Tracking des expérimentations (MLflow)**
- Suivi des hyperparamètres
- Suivi des métriques (AUC, recall, coût métier)
- Versioning des modèles
- Export des artefacts (ROC, CM, SHAP)
**2. Organisation des experiments**
- Baseline
- Feature engineering
- Traitement des outliers
- Optimisation des hyperparamètres
- Sélection du meilleur modèle via coût métier
**3. Reproductibilité**
- Environnement Conda versionné
- Scripts d’entraînement reproductibles
- Artefacts exportés dans *artefacts/*
Le projet repose donc sur une approche MLOps qui répond à ce schéma:
![MLOps](https://raw.githubusercontent.com/Diaure/Classification-Risque-Credit-Pipeline-MLOps-/master/Images/Approche_mlops.png)
**Préprocessings initiaux**
- un ***modèle de base***, puis
- un ***modèle optimisé***, via une recherche d’hyperparamètres (RandomizedSearchCV)
pour chaque preprocessing constituant une branche indépendante & testée de manière équitable.
Les processings initiaux sont:
- **Missing Flag**: conserver les valeurs manquantes en les rendant explicites
- **Imputation**: remplacer les valeurs manquantes par des statistiques adaptées
- **Drop70**: supprimer les variables trop incomplètes pour réduire le bruit
**Nettoyage des outliers**
Etape transversale pour mesurer l’impact réel du nettoyage des valeurs aberrantes sur chaque preprocessing.
**Transformation des colonnes**
- **StandardScaler** sur les variables numériques,
- **OneHotEncoder** sur les variables catégorielles nominales,
- **TargetEncoder** sur les variables catégorielles à forte cardinalité.
**Entraînement**
Chaque pipeline complet est évalué selon trois axes :
- **Coût métier**: critère principal, basé sur le coût des faux positifs et faux négatifs
- **Seuil optimal**: déterminé pour minimiser le coût global.
- **Métriques classiques**: AUC, recall, precision, F1, etc.
Le modèle final est celui qui obtient le **coût métier minimal**, toutes expériences confondues.
## Sélection du meilleur modèle
Plusieurs modèles ont été testés allant du plus simple (*régression logistique*) au plus avancé (*XGBoost*). Le *Dummy* sert de référence, la *régression logistique* est interprétable mais limitée, le *Random Forest* capturent les relations complexes, et *XGBoost* offre le meilleur compromis entre performance et robustesse.
![steps](https://raw.githubusercontent.com/Diaure/Classification-Risque-Credit-Pipeline-MLOps-/master/Images/steps_ops_modeles.png)
**Critère principal: coût métier = ```10 x FN + 1 x FP```**
**Modèle retenu: XGBoost optimisé**
| Résultats | Valeurs |
|-----------|-----------|
| AUC | **0.78** |
| Recall mauvais payeurs | **67%** |
| Coût métier minimal | **30 629 €** |
| Seuil optimal | **0.5** |
| | |
Le modèle permet:
- d’identifier 3319 mauvais payeurs sur 4965
- de réduire les faux négatifs (erreurs les plus coûteuses)
- de maintenir un bon équilibre entre détection du risque et acceptation des bons clients.
![CM](https://raw.githubusercontent.com/Diaure/Classification-Risque-Credit-Pipeline-MLOps-/master/Images/CM_modele_retenu.png)
## Feature Importance & Explicabilité (**SHAP**)
**Variables les plus influentes**
- Scores externes de solvabilité
- Historique de crédit
- Retards de paiement
- Refus antérieurs
- Ratios de paiement (installments)
![Global](https://raw.githubusercontent.com/Diaure/Classification-Risque-Credit-Pipeline-MLOps-/master/Images/SHAP_global.png)
**Explicabilité locale**
Pour chaque client, les valeurs SHAP permettent d’expliquer:
- Pourquoi le score augmente
- Pourquoi le score diminue
- Quelles variables influencent le plus la décision
![Local](https://raw.githubusercontent.com/Diaure/Classification-Risque-Credit-Pipeline-MLOps-/master/Images/SHAP_local.png)
## Prédictions finales
Le modèle retenu (*XGBoost optimisé*) a été appliqué à un jeu de données inédit, non utilisé lors de l’entraînement.
L’objectif est d’évaluer son comportement en conditions réelles et de produire une décision de crédit automatisée.
![Prédictions finales](https://raw.githubusercontent.com/Diaure/Classification-Risque-Credit-Pipeline-MLOps-/master/Images/Pred_finales.png)
Cette forte proportion de refus est cohérente avec:
- le seuil optimal choisi pour maximiser le rappel des mauvais payeurs,
- la distribution naturellement risquée du dataset,
- la stratégie volontairement conservatrice du modèle (réduire les FN).
## CI/CD et Déploiement
Ce projet met en œuvre une approche CI/CD complète, séparant:
- l’intégration continue (**CI**): garantir la qualité du code
- le déploiement continu (**CD**): rendre l’API accessible publiquement
## Optimisation du modèle & API (MLOps)
Cette dernière partie du projet vise à assurer la **robustesse**, la **scalabilité** et la **fiabilité** du modèle en production.
Elle repose sur trois piliers :
- **Collecte & stockage des données de production**
- **Monitoring du drift & des métriques système**
- **Optimisation du pipeline de prédiction (profiling & batch)**
### 1. Collecte & stockage des données de production
Chaque appel à l’API génère un log structuré contenant:
- les données d’entrée du client,
- le score prédit,
- la décision (accord/refus),
- la latence totale,
- la latence d’inférence,
- l’état CPU/RAM au moment de la requête.
Ces logs sont écrits en **JSON Lines** (`predictions_logs.jsonl`) pour permettre:
- un append efficace,
- une lecture ligne par ligne,
- une compatibilité avec les outils Big Data.
Exemple d’une ligne de log:
```json
{
"timestamp": "...",
"latency_ms": 104.2,
"inference_ms": 36.7,
"cpu_percent": 24.0,
"ram_percent": 74.2,
"prediction": 0.87,
"decision": "refus"
}
````
Pour faciliter l’analyse, les logs sont ensuite convertis en Parquet, un format colonne‑orienté plus compact, plus rapide à charger, & idéal pour les analyses statistiques.
### 2. Monitoring du drift & des métriques système
Les données de production sont comparées aux données de référence via Evidently AI.
- **Harmonisation préalable**
Avant toute comparaison, les colonnes sont alignées (mêmes noms, mêmes types), nettoyées, synchronisées entre référence et production.
- **Résultats du drift global (dataset complet)**
- **Colonnes analysées: 278**
- **Colonnes en dérive: 79**
- **Taux de dérive: 28.4 %**
Ce taux s’explique par des changements de distribution sur les montants, des catégories rares apparaissant en production, des comportements de paiement différents.
- **Résultats sur l’échantillon (500 lignes)**
- **Colonnes analysées: 275**
- **Colonnes en dérive: 18**
- **Taux de dérive: 6.5 %**
Cette différence est normale: un petit échantillon lisse les distributions et réduit la puissance statistique des tests.
- **Dashboard Streamlit**
````python
streamlit run Monitoring/dashboard.py
````
Un dashboard interactif permet de visualiser:
- le drift par colonne,
- les distributions ref vs prod,
- les métriques système (CPU, RAM, latence),
- les anomalies de production,
- l'mpact de l'optimisation.
Ce dashboard constitue un outil essentiel pour le monitoring continu.
### 3. Optimisation du pipeline de prédiction
L’objectif est d’identifier les goulots d’étranglement du pipeline et d’optimiser la latence de l’API.
- **Profiling du pipeline (dataset complet)**
Le profiling montre que:
![Profiling full data](Images/profiling_full_dataset.PNG)
**Le modèle est très rapide. Le preprocessing est le vrai goulot d’étranglement.**
- **Profiling sur échantillon (500 lignes)**
![Profiling sample](Images/profiling_sample.PNG)
Le comportement reste identique, mais les temps absolus chutent fortement.
- **Appels unitaires vs batch**
![unitaires vs batch](Images/units_vs_batch.PNG)
Le batch est 73× plus rapide que l’unitaire.
Le preprocessing est vectorisé : il ne s’exécute qu’une seule fois en batch.
Au vu des résultats:
- optimiser le modèle n’aurait apporté qu’un gain marginal (2–3 ms),
- optimiser le preprocessing permet de gagner plusieurs secondes en unitaire,
- le batch permet de réduire la latence d’un facteur ×70.
**Décision: optimiser le preprocessing et le mode d’appel, pas le modèle.**