Aurélie GABU commited on
Commit
052eebe
·
1 Parent(s): a8d7ec9

Finalisation du readme complet et ajout de fichier dans le gitignore

Browse files
Files changed (2) hide show
  1. .gitignore +1 -0
  2. README.md +283 -59
.gitignore CHANGED
@@ -8,3 +8,4 @@ App/model/
8
  *.joblib
9
  *.json
10
  App/model/modele_final_xgb.joblib
 
 
8
  *.joblib
9
  *.json
10
  App/model/modele_final_xgb.joblib
11
+ Other
README.md CHANGED
@@ -33,7 +33,78 @@ Le projet inclut:
33
  - Une base de données **PostgreSQL** pour stocker les entrées/sorties du modèle
34
  - Des tests unitaires et fonctionnels avec **Pytest**
35
  - Un pipeline **CI/CD** pour automatiser les tests et le déploiement
36
- - Une documentation technique claire
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
  ## CI/CD et Déploiement
39
 
@@ -43,86 +114,96 @@ Ce projet met en œuvre une approche CI/CD complète, séparant:
43
 
44
  ### `Intégration Continue (CI) – GitHub Actions`
45
 
46
- L’intégration continue est assurée via GitHub Actions.
47
-
48
- À chaque **push** sur les branches de travail et à chaque **pull request** vers **`develop`**,
49
- le pipeline exécute automatiquement les étapes suivantes :
50
- - installation d’un environnement Python 3.11 isolé
51
- - installation des dépendances définies dans le projet
52
- - exécution des tests automatisés avec Pytest
53
 
54
- L’objectif est de:
55
- - vérifier que le projet est installable
56
- - garantir que l’API démarre correctement
57
- - valider le chargement du modèle et le endpoint /*`predict`*
58
- - éviter toute régression avant fusion vers **`develop`**.
59
 
60
  ### `Déploiement Continu (CD) – Hugging Face Spaces`
61
 
62
- Le déploiement de l’API est réalisé sur Hugging Face Spaces qui permet:
63
-
64
- - d’héberger gratuitement des applications ML
65
- - de déployer une API Dockerisée
66
- - d’exposer un service accessible publiquement sans gérer de serveur
67
-
68
  Dans ce projet, Hugging Face est utilisé comme plateforme de démonstration et de mise à disposition de l’API.
69
 
70
- Le déploiement repose sur un Dockerfile, qui définit :
71
  - l’image Python utilisée (Python 3.11)
72
  - l’installation des dépendances
73
- - le lancement de l’API avec Uvicorn
74
-
75
- Il garantit la reproductibilité de l'environnement lors de l'exécution de l'API.
76
 
77
- A noter que les ***fichiers binaires*** ne sont pas stochés dans le dépôt GiHub principal pour les raisons suivantes:
78
  - Hugging Face bloque les push Git contenant des fichiers binaires lourds
79
  - Git n’est pas conçu pour versionner des artefacts ML volumineux.
80
 
81
  Pour contourner la situation, dans le projet, les artefacts sont stockés dans un Space Hugging Face dédié, séparé du code. Lors du démarrage de lAPI:
82
  - le code télécharge dynamiquement les artefacts via huggingface_hub
83
- - l’API peut démarrer même si les fichiers ne sont pas présents localement
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
 
 
85
 
86
- ### `Lancer l’API en local`
87
 
88
- L’API est déployée publiquement sur Hugging Face Spaces.
 
 
 
 
 
 
89
 
90
- - URL de l’API :
91
- https://diaure-futurisys-ml-api.hf.space
92
- - Documentation interactive (Swagger UI):
93
- https://diaure-futurisys-ml-api.hf.space/docs. Ele permet de:
94
- - visualiser les endpoints
95
- - tester directement l’endpoint `/predict`
96
- - voir les schémas d’entrée et de sortie.
97
 
98
  ### `Endpoint principal`
99
  `POST /predict`
100
 
101
  Cet endpoint reçoit les caractéristiques d’un employé et retourne:
102
 
103
- - une prédiction lisible ("Reste" ou "Part")
104
  - la probabilité associée au départ
105
 
106
- Exemple de réponse:
107
  ```json
108
  {
109
  "Prediction": "Part",
110
  "Probabilite_depart": 0.795678996
111
  }
112
  ```
113
- Les données d’entrée sont validées automatiquement avant l’appel au modèle,
114
- garantissant la cohérence avec les variables utilisées lors de l’entraînement.
115
 
116
- ### `Documentation des endpoints`
117
 
118
- L’API expose un endpoint principal de prédiction.
 
 
119
 
120
- **POST /predict**
121
- - Description : retourne une prédiction de départ d’un employé
122
- - Validation des données: Pydantic
123
- - Réponses possibles:
124
- - 200: prédiction valide
125
- - 422: données invalides
126
 
127
  ## Base de données et traçabilité des prédictions
128
  ### `Objectifs`
@@ -148,7 +229,7 @@ Les identifiants de connexion sont stockés dans des variables d’environnement
148
  ### `Modélisation de la base de données`
149
  La base de données repose sur trois tables distinctes, chacune ayant un rôle précis.
150
  1. `employees_dataset - Dataset de référence`
151
- Il contient le dataset final nettoyé et préparé lors de l'entraînement du modèle en incluant l'ensemble des **32 deatures** du modèle. Il sert de:
152
  - référence de schéma
153
  - source de validation
154
  - base documentaire du modèle
@@ -179,7 +260,7 @@ df.to_sql("employees_dataset", engine, if_exists="replace", index=False)
179
  2. `inputs - Entrées utilisateur`
180
  - Enregistre chaque requête utilisateur envoyée à l'endpoint `/predict`
181
  - Contient exactement les features attendues par le modèle
182
- - Structure strictement alignée avec le schéma Pydandic(`EmployeeFeatures`)
183
  - Permet:
184
  - l'audit des predictions
185
  - l'analyse à posteriori
@@ -220,15 +301,148 @@ Lors d’un appel à l’endpoint `POST /predict`:
220
  - la prédiction est enregistrée dans la table **predictions**
221
  - la réponse est retournée à l’utilisateur.
222
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
  ## Stack technique
224
  - **Langage**: Python
225
  - **API**: FastAPI
226
  - **Machine Learning**: scikit-learn
227
  - **Base de données**: PostgreSQL
228
  - **Tests**: Pytest, pytest-cov
229
- - **CI/CD**: GitHub Actions
230
  - **Versionnage**: Git / GitHub
231
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
 
233
  ## Structure du projet
234
  ```text
@@ -241,17 +455,27 @@ futurisys_ml-api/
241
  │ ├── model.py # Définition des tables de la database
242
  │ ├── predict.py # Application du modèle
243
  │ ├── schemas.py # Validation des données (Pydantic)
244
- │ ── model/ # Elements du modèle
245
- │ ├── mapping_classes.json # Correspondances des classes
246
- │ ├── modele_final_xgb.joblib # Modèle final avec hyperparamètres
247
- │ ├── preprocesseur_fitted.joblib # Pipeline entrainé
 
 
 
 
 
 
 
 
 
 
 
 
 
 
248
  |
249
- ├── scripts/ # Scripts bd (BD, données)
250
- │ ├── create_tables.py # Créaton des tables définies dans model.py
251
- │ ├── dataset_final.csv # Data final
252
- │ ├── insert_dataset.py # Code chargement de la table dataset_final
253
- ├── tests/ # Tests unitaires, fonctionnels
254
- │ ├── test_api.py # Test automatisé de l'API via Pytest
255
  |
256
  ├── .env # Stockage des variables sensibles et de configuration
257
  ├── .gitignore # Nettoyage du dépôt
 
33
  - Une base de données **PostgreSQL** pour stocker les entrées/sorties du modèle
34
  - Des tests unitaires et fonctionnels avec **Pytest**
35
  - Un pipeline **CI/CD** pour automatiser les tests et le déploiement
36
+ - Une documentation technique centralisée dans ce README
37
+
38
+ ## Modèle de Machine Learning (ML)
39
+ ### `Problématique`
40
+ Le modèle vise à résoudre un problème de classification binaire :
41
+
42
+ - `0`: l’employé reste dans l’entreprise
43
+ - `1`: l’employé présente un risque de départ
44
+
45
+ L’objectif métier est d’anticiper le turnover afin de permettre aux équipes RH de prioriser des actions de rétention.
46
+
47
+ ### `Données et features`
48
+ Le modèle s’appuie sur un dataset RH préparé et nettoyé en amont contenant des:
49
+ - données professionnelles et contextuelles (poste, département, ancienneté, etc.)
50
+ - variables comportementales et organisationnelles
51
+
52
+ Dataset final composé de **32 features**:
53
+ ```text
54
+ <class 'pandas.core.frame.DataFrame'>
55
+ RangeIndex: 1470 entries, 0 to 1469
56
+ Data columns (total 32 columns)
57
+ ```
58
+ Les prétraitements incluent :
59
+ - le nettoyage et la normalisation des données brutes (3 bases distinctes brutes reçues)
60
+ - le feature engineering: enrichissement des données
61
+ - le choix des variables non redondantes (corrélation inférieure à 70% entre les features numériques & les plus correlées avec la cible)
62
+ - normalisation des variables numériques & encodage des variables catégorielles:
63
+ ```python
64
+ transfo_colonnes = ColumnTransformer(
65
+ transformers=[
66
+ ('num', StandardScaler(), colonnes_quantitatives),
67
+ ('cat', OneHotEncoder(handle_unknown='ignore', max_categories=15, sparse_output=False), colonnes_qualitatives),
68
+ ('ord', OrdinalEncoder(handle_unknown="use_encoded_value", unknown_value=-1), colonnes_ordinales)])
69
+ ```
70
+ La table `employees_dataset` sert de référence documentaire du schéma attendu par le modèle.
71
+
72
+ ### `Choix du modèle`
73
+
74
+ Le modèle retenu est un algorithme de gradient boosting (**XGBoost**) entraîné avec des hyperparamètres optimisés:
75
+ ```python
76
+ # Les hyperparamètrs trouvés
77
+ Meilleurs paramètres : {'classifier__colsample_bytree': 0.8, 'classifier__gamma': 1, 'classifier__learning_rate': 0.3, 'classifier__max_depth': 3, 'classifier__min_child_weight': 5, 'classifier__n_estimators': 400, 'classifier__reg_lambda': 1, 'classifier__subsample': 0.8}
78
+ ```
79
+ Ce choix est justifié par:
80
+ - de bonnes performances sur des données tabulaires
81
+ - un compromis efficace entre précision et capacité de généralisation
82
+ - un temps d’inférence compatible avec une exposition via API
83
+
84
+ ![image](Other\comp_modeles.PNG)
85
+
86
+ ### `Sérialisation et versionnage`
87
+
88
+ - Le modèle est sérialisé au format `joblib`
89
+ - Une version du modèle est associée à chaque prédiction dans la table correspondante(`v1`)
90
+ - Les artefacts ML:
91
+ - en **environnement local**, ils peuvent être présents pour les tests
92
+ - en **production**, ils sont systématiquement téléchargés depuis un espace Hugging Face Hub dédié au stockage des artefacts.
93
+
94
+ ### `Performance et évaluation du modèle`
95
+ - Séparation du dataset en ensembles train / test
96
+ - Validation basée sur des métriques adaptées au contexte métier:
97
+ - **Recall (0.70)**: limiter les faux négatifs (départs non détectés)
98
+ - **F1-score (0.52 - validation croisée)**: équilibre entre précision et rappel
99
+ - **ROC-AUC (0.80 - validation croisée)**: capacité de discrimination globale du modèle
100
+
101
+ Le recall est volontairement privilégié afin de maximiser la détection des employés à risque, même au prix de quelques faux positifs.
102
+
103
+ ### `Limites`
104
+ - Le modèle fournit une probabilité, ***pas une décision finale***
105
+ - Les prédictions doivent être interprétées comme une aide à la décision
106
+ - Les performances dépendent fortement de la qualité et de l’actualité des données RH
107
+ - Des biais peuvent exister si les données historiques sont déséquilibrées.
108
 
109
  ## CI/CD et Déploiement
110
 
 
114
 
115
  ### `Intégration Continue (CI) – GitHub Actions`
116
 
117
+ À chaque **push** ou **pull request** sur les branches de travail et vers **`develop`**, le pipeline CI exécute automatiquement:
118
+ - l'installation d’un environnement Python 3.11
119
+ - l'installation des dépendances définies dans le projet
120
+ - l'exécution des tests unitaires et fonctionnels
 
 
 
121
 
122
+ L’objectif est de garantir la stabilité de l’API et d’éviter toute régression.
 
 
 
 
123
 
124
  ### `Déploiement Continu (CD) – Hugging Face Spaces`
125
 
 
 
 
 
 
 
126
  Dans ce projet, Hugging Face est utilisé comme plateforme de démonstration et de mise à disposition de l’API.
127
 
128
+ Le déploiement repose sur un `Dockerfile`, qui définit:
129
  - l’image Python utilisée (Python 3.11)
130
  - l’installation des dépendances
131
+ - le lancement de l’API avec Uvicorn.
 
 
132
 
133
+ A noter que les ***fichiers binaires*** ne sont pas stockés dans le dépôt GiHub principal pour les raisons suivantes:
134
  - Hugging Face bloque les push Git contenant des fichiers binaires lourds
135
  - Git n’est pas conçu pour versionner des artefacts ML volumineux.
136
 
137
  Pour contourner la situation, dans le projet, les artefacts sont stockés dans un Space Hugging Face dédié, séparé du code. Lors du démarrage de lAPI:
138
  - le code télécharge dynamiquement les artefacts via huggingface_hub
139
+ - l’API peut démarrer même si les fichiers ne sont pas présents localement.
140
+
141
+ ### `Installation et configuration`
142
+
143
+ Les prérequis:
144
+ - Python 3.11
145
+ - Poetry
146
+ - PostgreSQL (optionnel en local)
147
+ ```git bash
148
+ git clone <repository_url>
149
+ cd futurisys_ml-api
150
+ poetry install
151
+ ```
152
+ Les variables suivantes doivent être définies pour la connexion à la base SQL:
153
+ - `DB_USER`
154
+ - `DB_PASSWORD`
155
+ - `DB_HOST`
156
+ - `DB_PORT`
157
+ - `DB_NAME`
158
 
159
+ Elles sont chargées via un fichier `.env` non versionné.
160
 
161
+ ### `Lancer l’API`
162
 
163
+ - **En local**:
164
+ ```python
165
+ uvicorn App.main:app --reload
166
+ ```
167
+ Documentation interactive (Swagger UI) - http://127.0.0.1:8000/docs
168
+
169
+ - **En production (Hugging Face Spaces**):
170
 
171
+ - API: https://diaure-futurisys-api-ml.hf.space
172
+ - Swagger UI: https://diaure-futurisys-api-ml.hf.space/docs
173
+
174
+ Le déploiement permet de:
175
+ - visualiser les endpoints
176
+ - tester directement l’endpoint `/predict`
177
+ - voir les schémas d’entrée et de sortie.
178
 
179
  ### `Endpoint principal`
180
  `POST /predict`
181
 
182
  Cet endpoint reçoit les caractéristiques d’un employé et retourne:
183
 
184
+ - une prédiction lisible (`"Reste"` ou `"Part"`)
185
  - la probabilité associée au départ
186
 
 
187
  ```json
188
  {
189
  "Prediction": "Part",
190
  "Probabilite_depart": 0.795678996
191
  }
192
  ```
193
+ Les données d’entrée sont validées via **Pydantic** avec l’appel du modèle.
 
194
 
195
+ ### `Maintenance et mise à jour du modèle`
196
 
197
+ Une mise à jour du modèle est recommandée:
198
+ - périodiquement (ex. tous les 6 à 12 mois)
199
+ - ou en cas de dérive des données.
200
 
201
+ Le processus inclut:
202
+ - la collecte de nouvelles données
203
+ - le réentraînement du modèle
204
+ - l'évaluation des performances
205
+ - la validation métier
206
+ - le déploiement d’une nouvelle version.
207
 
208
  ## Base de données et traçabilité des prédictions
209
  ### `Objectifs`
 
229
  ### `Modélisation de la base de données`
230
  La base de données repose sur trois tables distinctes, chacune ayant un rôle précis.
231
  1. `employees_dataset - Dataset de référence`
232
+ Il contient le dataset final nettoyé et préparé lors de l'entraînement du modèle en incluant l'ensemble des **32 features** du modèle. Il sert de:
233
  - référence de schéma
234
  - source de validation
235
  - base documentaire du modèle
 
260
  2. `inputs - Entrées utilisateur`
261
  - Enregistre chaque requête utilisateur envoyée à l'endpoint `/predict`
262
  - Contient exactement les features attendues par le modèle
263
+ - Structure strictement alignée avec le schéma Pydantic(`EmployeeFeatures`)
264
  - Permet:
265
  - l'audit des predictions
266
  - l'analyse à posteriori
 
301
  - la prédiction est enregistrée dans la table **predictions**
302
  - la réponse est retournée à l’utilisateur.
303
 
304
+ ## Tests et Qualité
305
+
306
+ ### `Objectifs des tests`
307
+
308
+ Les tests ont été conçus pour:
309
+ - valider le bon fonctionnement des composants critiques (chargement du modèle, validation des données, etc)
310
+ - garantir que l’API répond correctement dans des scénarios réels
311
+ - détecter rapidement les régressions lors du développement
312
+ - assurer la reproductibilité des résultats
313
+ - fournir des indicateurs de qualité (couverture de tests)
314
+
315
+ L’ensemble des tests est exécuté automatiquement dans le pipeline CI à chaque push ou pull request.
316
+
317
+ ### `Types de tests exécutés`
318
+ - **Tests unitaires** qui sont des tests rapides qui permettent de détecter immédiatement les erreurs de logique. Ils se concentrent sur les composants isolés du projet comme:
319
+ - la vérification du chargement du modèle et du mapping des classes sans levée d'erreurs (`model_loading.py`)
320
+ - la validation des données via Pydantic et test de l'endpoint de bout en bout(`test_api.py`)
321
+
322
+ - **Tests fonctionnels** qui évaluent l’application dans son ensemble en simulant un usage réel de l’API et garantissant son bon comportement en production:
323
+ - contrôle du fonctionnement de l'API en mode CI lorsque la base est désactivée CI (`test_db_disabled.py`)
324
+ - test tout le pipeline de prédiction (`test_predict_endpoint.py`)
325
+ - test spécifique de l'endpoint `/predict` et vérification de la cohérence de la réponse.
326
+
327
+ **Exécution locale** des tests:
328
+ ```python
329
+ poetry run pytest
330
+ poetry run pytest tests.units
331
+ poetry run pytest tests.fonctionnel
332
+ ```
333
+ ### `Rapport de couverture`
334
+ Généré automatiquement dans GitHub Actions, c'est un apport qui mesure la proportion de code éxécutée par les tests en indiquant:
335
+ - quelles lignes ont été exécutées
336
+ - quelles lignes ne l'ont pas été
337
+ - le pourcentage global de couverture.
338
+
339
+ Il a pour rôle:
340
+ - d'évaluer la qualité de la suite de tests
341
+ - d'identifier les zones non testées
342
+ - de réduire les risques de régression
343
+ - de garantir la fiabilité du code avant déploiement
344
+ - de donner un indicateur objectif de maturité logicielle.
345
+
346
+ Dans ce projet, le pipeline CI désactive la base de données, ainsi il n'y a pas de test sur:
347
+ - la connexion DB
348
+ - les insertions
349
+ - les interactions **SQLALCHEMY**.
350
+ Donc toutes les lignes liées à la DB ne sont pas exécutées, d'où il peut être observé une `couverture plus faible GitHub Actions vs local`.
351
+ ```text
352
+ ============================== local tests coverage =====================================
353
+
354
+ Name Stmts Miss Cover Missing
355
+ -----------------------------------------------
356
+ App\database.py 25 4 84% 9-10, 35-36
357
+ App\main.py 10 1 90% 13
358
+ App\model.py 48 2 96% 55-56
359
+ App\predict.py 52 9 83% 15-19, 62, 77-79
360
+ App\schemas.py 32 0 100%
361
+ -----------------------------------------------
362
+ TOTAL 167 16 90%
363
+
364
+ ========================== GitHub Actions tests coverage ================================
365
+ Name Stmts Miss Cover Missing
366
+ -----------------------------------------------
367
+ App/database.py 25 10 60% 9-10, 23-32
368
+ App/main.py 10 10 0% 1-20
369
+ App/model.py 48 2 96% 55-56
370
+ App/predict.py 52 28 46% 15-19, 49-85
371
+ App/schemas.py 32 0 100%
372
+ -----------------------------------------------
373
+ TOTAL 167 50 70%
374
+ ```
375
+
376
  ## Stack technique
377
  - **Langage**: Python
378
  - **API**: FastAPI
379
  - **Machine Learning**: scikit-learn
380
  - **Base de données**: PostgreSQL
381
  - **Tests**: Pytest, pytest-cov
382
+ - **CI/CD**: GitHub Actions, Hugging Face
383
  - **Versionnage**: Git / GitHub
384
 
385
+ ## Architecture du projet
386
+
387
+ L’architecture du projet repose sur une séparation claire des responsabilités afin de garantir la lisibilité, la maintenabilité et l’évolutivité de l’application.
388
+
389
+ ### `Vue d’ensemble`
390
+
391
+ ┌──────────────────────────────┐
392
+ │ Utilisateur │
393
+ │ (Client) │
394
+ └───────────────┬──────────────┘
395
+ │ Requête POST /predict
396
+
397
+ ┌──────────────────────────────┐
398
+ │ API FastAPI │
399
+ │ (main.py) │
400
+ └───────────────┬──────────────┘
401
+
402
+
403
+ ┌──────────────────────────────────┐
404
+ │ Module de prédiction │
405
+ │ (predict.py) │
406
+ │ - Chargement du modèle HF Hub │
407
+ │ - Validation │
408
+ │ - Prédiction │
409
+ └───────────────┬──────────────────┘
410
+
411
+
412
+ ┌────────────────────────────────────────┐
413
+ │ Base de données PostgreSQL │
414
+ │ (inputs / predictions / dataset) │
415
+ └────────────────────────────────────────┘
416
+
417
+ ┌────────────────────────────────────────┐
418
+ │ CI/CD – GitHub Actions │
419
+ │ - Tests unitaires │
420
+ │ - Tests fonctionnels │
421
+ │ - Rapport de couverture │
422
+ │ - Déploiement sur HF Space │
423
+ └────────────────────────────────────────┘
424
+
425
+
426
+ ### `Description du flux`
427
+
428
+ 1. Un utilisateur envoie une requête `POST /predict` à l’API
429
+
430
+ 2. L’API FastAPI agit comme point d’entrée:
431
+ - validation des données via **Pydantic**
432
+ - orchestration du traitement
433
+
434
+ 3. Le module de prédiction:
435
+ - charge dynamiquement le modèle ML depuis **Hugging Face Hub**
436
+ - génère la prédiction et la probabilité associée
437
+
438
+ 4. Les données d’entrée et les résultats sont enregistrés dans une base **PostgreSQL** afin d’assurer la traçabilité
439
+
440
+ 5. La réponse est retournée au client sous forme JSON
441
+
442
+ 6. Le cycle de développement, de test et de déploiement est automatisé via un pipeline **CI/CD GitHub Actions** avec déploiement sur **Hugging Face Spaces**.
443
+
444
+ Cette architecture permet une exposition fiable du modèle de Machine Learning, tout en respectant les bonnes pratiques MLOps et d’ingénierie logicielle.
445
+
446
 
447
  ## Structure du projet
448
  ```text
 
455
  │ ├── model.py # Définition des tables de la database
456
  │ ├── predict.py # Application du modèle
457
  │ ├── schemas.py # Validation des données (Pydantic)
458
+ │ ── model/ # Elements du modèle
459
+ │ ├── mapping_classes.json # Correspondances des classes
460
+ │ ├── modele_final_xgb.joblib # Modèle final avec hyperparamètres
461
+ |
462
+ ├── scripts/ # Scripts bd (BD, données)
463
+ │ ├── create_tables.py # Créaton des tables définies dans model.py
464
+ │ ├── dataset_final.csv # Data final
465
+ │ ├── insert_dataset.py # Code chargement de la table dataset_final
466
+ |
467
+ ├── tests/ # Tests unitaires, fonctionnels
468
+ │ ├── test_sanity.py # Test de vérification rapide
469
+ │ ├── test_api.py # Tests API supplémentaires
470
+ │ ├── test_sanity.py # Test de vérification rapide
471
+ |
472
+ │ ── fonctionnel/ # Tests fonctionnels
473
+ │ ├── sample_payload.py # Test automatisé de l'API via Pytest
474
+ │ ├── test_api.py # Tests API supplémentaires
475
+ │ ├── test_sanity.py # Test de vérification rapide
476
  |
477
+ │ ── units/ # Tests unitaires
478
+ │ ├── test_model_loading.py # Test automatisé de l'API via Pytest
 
 
 
 
479
  |
480
  ├── .env # Stockage des variables sensibles et de configuration
481
  ├── .gitignore # Nettoyage du dépôt