Analyse exploratoire des données (EDA)
L’EDA est la première étape de tout projet ML. Découvrez comment l’intégrer efficacement dans votre structure.
Organisez efficacement vos projets ML et Deep Learning avec une arborescence claire, des bonnes pratiques éprouvées et des exemples concrets pour garantir reproductibilité et collaboration.
Lorsqu'on travaille sur un projet de Machine Learning ou Deep Learning, une bonne organisation des fichiers est essentielle pour assurer la clarté, la réplicabilité et la scalabilité du projet. Cette structuration permet d'éviter les désordres, d'améliorer la collaboration et de faciliter le suivi des expérimentations.
Un projet ML mal organisé conduit rapidement à des erreurs difficiles à tracer, des expériences impossibles à reproduire et des pertes de temps considérables. À l'inverse, une arborescence pensée dès le départ permet de :

Schéma global de l’arborescence ML (assisté par Nano Banana)
Voici une structure type de projet, largement adoptée par les équipes data science en entreprise :
projet_ml/
│-- models/ # Contient les différentes versions des modèles (v1/, v2/, etc.)
│ │-- train_model.py # Script d'entraînement
│ │-- predict.py # Script de prédiction
│ │-- evaluate.py # Script d'évaluation
│
│-- data/ # Stocke les jeux de données bruts et traités
│ │-- raw/ # Données brutes
│ │-- processed/ # Données prétraitées
│ │-- dataset.csv # Fichier CSV principal
│
│-- utils/ # Fonctions utilitaires
│ │-- preprocessing.py # Prétraitement des données
│ │-- feature_engineering.py # Ingénierie des caractéristiques
│ │-- metrics.py # Fonctions pour les métriques d'évaluation
│
│-- tests/ # Tests unitaires pour garantir la robustesse du code
│ │-- test_models.py # Tests pour les modèles
│ │-- test_utils.py # Tests pour les utilitaires
│
│-- notebooks/ # Notebooks Jupyter pour l'EDA, l'entraînement et l'évaluation
│ │-- eda.ipynb # Analyse exploratoire des données
│ │-- training.ipynb # Entraînement du modèle
│ │-- evaluation.ipynb # Évaluation des performances
│
│-- scripts/ # Automatisation des tâches via des scripts bash
│ │-- train.sh # Script d'entraînement automatique
│ │-- evaluate.sh # Script d'évaluation
│
│-- logs/ # Historique des entraînements et des prédictions
│ │-- training_logs.txt # Logs des entraînements
│ │-- prediction_logs.txt # Logs des prédictions
│
│-- config.yaml # Stocke les hyperparamètres et configurations du projet
│
│-- requirements.txt # Liste des dépendances pour une installation rapide
│
│-- .github/workflows/ci.yml # Configuration CI/CD pour automatiser les tests et le déploiement

Arborescence illustrée sous forme d’arbre (assisté par Nano Banana)
Ce dossier contient les différentes versions des modèles entraînés, les scripts d'entraînement (train_model.py), de prédiction (predict.py) et d'évaluation (evaluate.py). Cela permet de suivre l'évolution du modèle au fil du temps. Une bonne pratique consiste à versionner les modèles dans des sous-dossiers v1/, v2/, etc., chacun contenant le fichier du modèle (.pkl, .h5, .joblib) et ses métriques associées.
raw/ : Stocke les données brutes issues de la collecte. Ces fichiers ne doivent jamais être modifiés directement.processed/ : Contient les jeux de données après nettoyage et transformation. C'est à partir de ces données que l'on entraîne les modèles.dataset.csv : Un exemple de fichier de données structuré.Contient des fonctions utiles au projet, comme le prétraitement (preprocessing.py), l'ingénierie des caractéristiques (feature_engineering.py) et les métriques (metrics.py). Ces fonctions sont réutilisables dans les scripts et les notebooks.
Garde les tests unitaires pour assurer la fiabilité du code. Chaque composant (modèle, utilitaires) doit être testé séparément. Des frameworks comme pytest ou unittest sont couramment utilisés.
Stocke les notebooks Jupyter permettant d'explorer les données (eda.ipynb), d'entraîner les modèles (training.ipynb) et d'évaluer les performances (evaluation.ipynb). Il est conseillé de numéroter les notebooks (01_, 02_) pour indiquer l'ordre d'exécution.
Automatise certaines tâches comme l'entraînement et l'évaluation des modèles via des scripts bash (train.sh, evaluate.sh). Ces scripts sont particulièrement utiles pour lancer des entraînements sur des serveurs ou dans des pipelines CI/CD.
Stocke l'historique des entraînements et des prédictions, utile pour le suivi des performances et le debugging. On y trouve généralement les courbes d'apprentissage, les temps d'exécution et les erreurs éventuelles.
Fichier de configuration centralisé contenant les hyperparamètres et les configurations essentielles du projet (chemins de fichiers, réglages des modèles, etc.). L'utilisation d'un fichier YAML permet de modifier les paramètres sans toucher au code.
Liste des dépendances Python nécessaires à l'exécution du projet. Permet une installation rapide via pip install -r requirements.txt. Pour des projets plus complexes, on peut utiliser environment.yml (Conda) ou pyproject.toml (Poetry).
Fichier de configuration pour l'intégration et le déploiement continus (CI/CD), qui automatise les tests et le déploiement du projet. Avec GitHub Actions, on peut par exemple lancer automatiquement les tests à chaque git push.
v1/, v2/) permet de revenir à une version précédente si nécessaire.README.md décrivant l'objectif du projet, comment l'exécuter et les dépendances nécessaires.tests/).logs/.Adoptez un cookiecutter ou un template de projet (ex. cookiecutter-data-science) pour générer automatiquement cette arborescence en une seule commande. Cela fait gagner un temps précieux au lancement de chaque nouveau projet.
fraud_detection_project/
│── data/
│ ├── raw/ # Données brutes
│ │ ├── transactions_2024.csv
│ │ ├── clients_2024.csv
│ ├── processed/ # Données prétraitées
│ │ ├── transactions_cleaned.csv
│ │ ├── features_engineered.csv
│
│── models/ # Versions du modèle entraîné
│ ├── v1/
│ │ ├── model.pkl
│ │ ├── evaluation_metrics.json
│ ├── v2/
│ │ ├── model.pkl
│ │ ├── evaluation_metrics.json
│
│── notebooks/ # Explorations en notebooks Jupyter
│ ├── 01_eda.ipynb # Analyse exploratoire
│ ├── 02_feature_engineering.ipynb # Extraction de caractéristiques
│ ├── 03_model_training.ipynb # Entraînement du modèle
│
│── scripts/ # Scripts d'automatisation
│ ├── train_model.py # Script d'entraînement
│ ├── evaluate_model.py # Script d'évaluation
│ ├── predict.py # Script pour effectuer des prédictions
│
│── tests/ # Tests unitaires
│ ├── test_data_preprocessing.py
│ ├── test_model_performance.py
│
│── utils/ # Fonctions utiles
│ ├── data_preprocessing.py
│ ├── feature_engineering.py
│ ├── metrics.py
│
│── logs/ # Logs des entraînements
│ ├── training.log
│ ├── predictions.log
│
│── config.yaml # Hyperparamètres et configuration
│── requirements.txt # Dépendances Python
│── .github/workflows/ci.yml # Pipeline CI/CD
│── README.md # Description du projet
image_classification_project/
│── data/
│ ├── raw/ # Images brutes
│ ├── processed/ # Images redimensionnées et normalisées
│
│── models/
│ ├── v1/
│ ├── v2/
│
│── notebooks/
│ ├── 01_data_preprocessing.ipynb
│ ├── 02_model_training.ipynb
│ ├── 03_evaluation.ipynb
│
│── scripts/
│ ├── train.py
│ ├── predict.py
│
│── tests/
│ ├── test_preprocessing.py
│
│── utils/
│ ├── image_augmentation.py
│ ├── model_utils.py
│
│── logs/
│── config.yaml
│── requirements.txt
│── README.md
sentiment_analysis_project/
│── data/
│ ├── raw/ # Avis clients bruts
│ ├── processed/ # Données nettoyées et vectorisées
│
│── models/
│ ├── v1/
│ ├── v2/
│
│── notebooks/
│ ├── 01_eda.ipynb
│ ├── 02_text_preprocessing.ipynb
│ ├── 03_model_training.ipynb
│
│── scripts/
│ ├── train.py
│ ├── predict.py
│
│── tests/
│ ├── test_text_processing.py
│
│── utils/
│ ├── text_cleaning.py
│ ├── model_utils.py
│
│── logs/
│── config.yaml
│── requirements.txt
│── README.md
project_movie_recommendation/
│── models/
│ ├── collaborative_filtering/
│ ├── content_based/
│── data/
│ ├── raw/
│ ├── processed/
│── utils/
│ ├── similarity_metrics.py
│ ├── recommendation_engine.py
│── tests/
│ ├── test_recommendation.py
│── notebooks/
│ ├── exploratory_analysis.ipynb
│── scripts/
│ ├── generate_recommendations.sh
│── logs/
│── config.yaml
│── requirements.txt
│── .github/workflows/ci.yml
project_energy_forecasting/
│── models/
│ ├── lstm/
│ ├── xgboost/
│── data/
│ ├── raw/
│ ├── processed/
│── utils/
│ ├── data_cleaning.py
│ ├── feature_selection.py
│── tests/
│ ├── test_data_pipeline.py
│── notebooks/
│ ├── forecast_analysis.ipynb
│── scripts/
│ ├── train_model.sh
│ ├── predict_demand.sh
│── logs/
│── config.yaml
│── requirements.txt
│── .github/workflows/ci.yml
Ces arborescences permettent une meilleure organisation et facilitent le travail collaboratif ainsi que le suivi des différentes versions des modèles.
Au-delà de l'arborescence, certains outils peuvent grandement faciliter la gestion de vos projets ML :
Pour tout projet ML destiné à la production, associez l'arborescence présentée à un outil de tracking d'expériences comme MLflow. Cela vous évitera de perdre le fil de vos centaines d'entraînements.
Non, Git n'est pas adapté aux gros fichiers. Utilisez plutôt DVC (Data Version Control) ou Git LFS. Le data/ peut être ignoré dans .gitignore tandis que les scripts de téléchargement ou de génération des données sont versionnés.
Utilisez plusieurs fichiers de configuration (config_dev.yaml, config_prod.yaml) ou des variables d'environnement. Les pipelines CI/CD peuvent alors choisir le bon fichier au moment de l'exécution.
Oui, mais attention : les notebooks contiennent des métadonnées (cellules d'exécution, sorties) qui génèrent beaucoup de diffs. Avant de committer, nettoyez-les avec jupyter nbconvert --clear-output ou utilisez nbstripout.
utils/ contient des fonctions réutilisables importées par d'autres modules. scripts/ contient des exécutables (souvent bash) qui orchestrent des séquences d'actions (entraînement, évaluation, déploiement).
Créez un dossier models/ avec un sous-dossier par type de modèle (random_forest/, xgboost/, neural_net/). Chaque sous-dossier a sa propre logique d'entraînement et son propre fichier de config. Un script global benchmark.py peut les comparer.
Ajoutez un dossier mlruns/ (ignoré par Git) où MLflow stocke ses artefacts. Dans config.yaml, précisez l'URI du tracking server. Les scripts d'entraînement appellent mlflow.log_param() et mlflow.log_metric().