Projet complet de machine learning pour la prédiction du remboursement de crédit, incluant l'entraînement d'un modèle XGBoost, une API REST Flask, la containerisation Docker, et le déploiement automatique sur AWS EC2 avec CI/CD.
Ce projet vise à prédire la probabilité de remboursement d'un prêt en utilisant des techniques de machine learning. Il comprend :
- Analyse et préparation des données : Exploration et preprocessing des données de crédit
- Entraînement du modèle : Développement d'un modèle XGBoost pour la classification
- API REST : Service web Flask pour exposer le modèle en production
- Containerisation : Déploiement avec Docker
- Tests : Suite de tests unitaires pour l'API
- CI/CD : Intégration continue avec GitHub Actions
- Déploiement automatique : Déploiement automatique sur AWS EC2 à chaque push
DevOps-MLOps/
├── api/ # Application Flask
│ ├── app.py # Application Flask principale
│ └── model_loader.py # Chargement du modèle XGBoost
├── data/ # Données brutes
│ └── data.csv # Dataset de crédit
├── model/ # Modèles entraînés
│ └── xgboost_credit_scoring_final.json
├── notebooks/ # Notebooks d'analyse et d'entraînement
│ └── model_train.ipynb # Notebook d'entraînement du modèle
├── docker/ # Configuration Docker
│ └── Dockerfile
├── tests/ # Tests unitaires
│ └── test_api.py
├── .github/ # Configuration GitHub Actions
│ └── workflows/
│ ├── ci.yml # Workflow CI (tests)
│ └── deploy.yml # Workflow CD (déploiement)
├── docs/ # Documentation et captures d'écran
├── deploy.sh # Script de déploiement pour EC2
├── requirements.txt # Dépendances Python
└── README.md
- Python 3.11+
- Jupyter Notebook (pour l'exploration et l'entraînement)
- Docker (pour la containerisation)
- Compte AWS avec instance EC2 (pour le déploiement)
- Compte GitHub (pour CI/CD)
-
Cloner le projet
-
Créer un environnement virtuel :
python -m venv env
source env/bin/activate # Sur Windows: env\Scripts\activate- Installer les dépendances :
pip install -r requirements.txtLe dataset contient des informations sur les prêts avec les variables suivantes :
- Variables numériques :
annual_income,debt_to_income_ratio,credit_score,loan_amount,interest_rate - Variables catégorielles :
gender,marital_status,education_level,employment_status,loan_purpose,grade_subgrade - Variable cible :
loan_paid_back(1 = remboursé, 0 = non remboursé)
Les données sont stockées dans data/data.csv.
Le notebook notebooks/model_train.ipynb contient :
- Exploration des données : Analyse descriptive et visualisations
- Encodage des variables catégorielles :
- Encodage ordinal pour
education_leveletgrade_subgrade - Encodage one-hot pour
gender,marital_status,employment_status,loan_purpose
- Encodage ordinal pour
- Normalisation : Standardisation des variables numériques avec
StandardScaler - Division train/test : Séparation des données (90% train, 10% test)
- Algorithme : XGBoost Classifier
- Features : 23 features après preprocessing
- Format de sauvegarde : JSON
# Ouvrir le notebook Jupyter
jupyter notebook notebooks/model_train.ipynbLe modèle entraîné est sauvegardé dans model/xgboost_credit_scoring_final.json.
cd api
python app.pyL'API sera accessible sur http://localhost:5000
- Construire l'image :
docker build -f docker/Dockerfile -t credit-scoring-api .- Lancer le conteneur :
docker run -p 5000:5000 credit-scoring-api- Lancer en arrière-plan :
docker run -d -p 5000:5000 --name credit-api credit-scoring-apiVérifie le statut de l'API et du modèle.
Réponse :
{
"status": "online",
"model": "XGBoost_v1"
}Effectue une prédiction de remboursement.
Corps de la requête (JSON) - 23 features requises :
{
"annual_income": 0.5,
"debt_to_income_ratio": -0.3,
"credit_score": 0.8,
"loan_amount": -0.2,
"interest_rate": 0.1,
"education_level_ord": 1,
"grade_subgrade_le": 10,
"gender_Male": 0.0,
"gender_Other": 0.0,
"marital_status_Married": 1.0,
"marital_status_Single": 0.0,
"marital_status_Widowed": 0.0,
"employment_status_Retired": 0.0,
"employment_status_Self-employed": 0.0,
"employment_status_Student": 0.0,
"employment_status_Unemployed": 0.0,
"loan_purpose_Car": 0.0,
"loan_purpose_Debt consolidation": 0.0,
"loan_purpose_Education": 0.0,
"loan_purpose_Home": 1.0,
"loan_purpose_Medical": 0.0,
"loan_purpose_Other": 0.0,
"loan_purpose_Vacation": 0.0
}Réponse :
{
"status": "success",
"probability_of_repayment": 0.8542,
"decision": "Approved",
"class_id": 1
}Exemple avec curl (local) :
curl -X POST http://localhost:5000/predict \
-H "Content-Type: application/json" \
-d '{
"annual_income": 0.5,
"debt_to_income_ratio": -0.3,
"credit_score": 0.8,
"loan_amount": -0.2,
"interest_rate": 0.1,
"education_level_ord": 1,
"grade_subgrade_le": 10,
"gender_Male": 0.0,
"gender_Other": 0.0,
"marital_status_Married": 1.0,
"marital_status_Single": 0.0,
"marital_status_Widowed": 0.0,
"employment_status_Retired": 0.0,
"employment_status_Self-employed": 0.0,
"employment_status_Student": 0.0,
"employment_status_Unemployed": 0.0,
"loan_purpose_Car": 0.0,
"loan_purpose_Debt consolidation": 0.0,
"loan_purpose_Education": 0.0,
"loan_purpose_Home": 1.0,
"loan_purpose_Medical": 0.0,
"loan_purpose_Other": 0.0,
"loan_purpose_Vacation": 0.0
}'Exemple avec curl (API déployée sur EC2) :
curl -X POST http://[IP_EC2]:5000/predict \
-H "Content-Type: application/json" \
-d '{...}'Exécuter les tests unitaires de l'API :
python -m unittest tests.test_api -vLes tests couvrent :
- Endpoint
/health - Endpoint
/predictavec données valides - Gestion des erreurs (données manquantes, JSON invalide)
- Validation des méthodes HTTP
- Flask 3.1.2 : Framework web
- XGBoost 3.1.2 : Modèle de machine learning
- pandas 2.3.3 : Manipulation de données
- scikit-learn 1.8.0 : Preprocessing et outils ML
- numpy 2.4.0 : Calculs numériques
- scipy 1.16.3 : Outils scientifiques
Le projet utilise GitHub Actions pour l'intégration et le déploiement continus :
- Déclenchement : À chaque push/PR sur
main,master, oudevelop - Tests : Exécution des tests unitaires sur Python 3.11
- Build Docker : Vérification que l'image Docker se construit correctement
- Linting : Vérification du style de code (Black, isort, flake8)
- Déclenchement : Après succès du workflow CI sur
mainoumaster - Déploiement : Connexion SSH à EC2 et déploiement automatique
- Processus :
- Pull du code depuis GitHub
- Rebuild de l'image Docker
- Redémarrage du conteneur
- Vérification que l'API fonctionne
Pour activer le déploiement automatique, configurez les secrets GitHub :
- Allez dans : Repository → Settings → Secrets and variables → Actions
- Ajoutez ces secrets :
EC2_HOST: L'IP publique de votre instance EC2EC2_USER: L'utilisateur SSH (généralementubuntu)EC2_SSH_KEY: Le contenu complet de votre clé SSH.pem
Si vous préférez déployer manuellement :
# 1. Se connecter à EC2
ssh -i my_key.pem ubuntu@[VOTRE_IP_EC2]
# 2. Aller dans le projet
cd ~/DevOps-MLOps
# 3. Pull le code
git pull origin main
# 4. Exécuter le script de déploiement
chmod +x deploy.sh
./deploy.sh# Sur l'instance EC2
cd ~/DevOps-MLOps
# Construire l'image
docker build -f docker/Dockerfile -t credit-scoring-api .
# Lancer le conteneur
docker run -d -p 5000:5000 --name credit-api --restart unless-stopped credit-scoring-api
# Vérifier les logs
docker logs credit-api
# Tester l'API
curl http://localhost:5000/healthUne fois déployée, l'API est accessible sur :
http://[VOTRE_IP_EC2]:5000
Important : Assurez-vous que le Security Group EC2 autorise le trafic sur le port 5000.
- Exploration : Analyser les données dans
notebooks/model_train.ipynb - Preprocessing : Préparer les données (encodage, normalisation)
- Entraînement : Entraîner le modèle XGBoost
- Sauvegarde : Sauvegarder le modèle dans
model/ - API : Exposer le modèle via l'API Flask
- Tests : Valider le fonctionnement avec les tests unitaires
- CI/CD : Tests automatiques avec GitHub Actions
- Déploiement : Déploiement automatique sur EC2 à chaque push
- Le modèle attend 23 features pré-traitées (normalisées et encodées)
- Les données doivent être au format JSON avec toutes les colonnes requises
- Le modèle est chargé au démarrage de l'API
- Les variables numériques doivent être normalisées (StandardScaler)
- Les variables catégorielles doivent être encodées (one-hot avec drop='first')
Des captures d'écran et de la documentation supplémentaire sont disponibles dans le dossier docs/.
- Les clés SSH et les informations sensibles sont stockées dans les secrets GitHub
- Le fichier
.gitignoreexclut les fichiers sensibles (my_key.pem,.env, etc.) - Les adresses IP publiques doivent être masquées dans les captures d'écran et la documentation
┌─────────────┐
│ GitHub │
│ Repository │
└──────┬──────┘
│ Push
▼
┌─────────────┐
│ GitHub │
│ Actions CI │ ──► Tests, Build Docker
└──────┬──────┘
│ Success
▼
┌─────────────┐
│ GitHub │
│ Actions CD │ ──► SSH to EC2
└──────┬──────┘
│ Deploy
▼
┌─────────────┐
│ AWS EC2 │
│ Instance │
│ ┌────────┐ │
│ │ Docker │ │ ──► API Flask
│ │Container│ │
│ └────────┘ │
└─────────────┘
│
▼
http://[IP]:5000
- Machine Learning : XGBoost, scikit-learn
- API : Flask
- Containerisation : Docker
- CI/CD : GitHub Actions
- Cloud : AWS EC2
- Version Control : Git, GitHub