Sommaire
1. Pourquoi structurer un projet de Machine Learning ?
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.
47%
du temps perdu à chercher des fichiers
Étude internaute Kaggle, 2025
+63%
de collaboration efficace avec structure
Enquête Data Science, 2026
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 :
- Reproduire facilement les résultats : chaque version du modèle est conservée avec ses données et hyperparamètres.
- Collaborer sereinement en équipe : chaque membre sait où trouver les données, les scripts et les résultats.
- Automatiser les pipelines : entraînement, évaluation et déploiement deviennent reproductibles.
- Gagner en sérénité lors du passage en production : un code structuré est plus facile à industrialiser.

Schéma global de l’arborescence ML (assisté par Nano Banana)
2. Arborescence recommandée pour un projet ML
Voici une structure type de projet, largement adoptée par les équipes data science en entreprise :
Arborescence standard
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)
3. Explication détaillée des dossiers et fichiers
models/
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.
data/
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é.
utils/
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.
tests/
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.
notebooks/
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.
scripts/
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.
logs/
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.
config.yaml
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.
requirements.txt
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).
.github/workflows/ci.yml
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.
4. Bonnes pratiques pour un projet ML
- Versionner les modèles : Conserver différentes versions des modèles (
v1/,v2/) permet de revenir à une version précédente si nécessaire. - Séparer les données brutes et traitées : Éviter d’écraser les données originales pour garantir la reproductibilité des expériences.
- Utiliser un gestionnaire de versions (Git) : Suivre les modifications et collaborer efficacement. Attention toutefois à ne pas versionner de gros fichiers de données ou modèles (utiliser Git LFS ou DVC).
- Documenter le projet : Ajouter un
README.mddécrivant l’objectif du projet, comment l’exécuter et les dépendances nécessaires. - Écrire des tests unitaires : Vérifier la fiabilité des composants avec des tests (
tests/). - Automatiser les tâches répétitives : Scripts bash et pipelines CI/CD pour l’entraînement et l’évaluation des modèles.
- Stocker les métriques et les logs : Suivre les performances du modèle avec
logs/. - Utiliser un framework d’expérimentation : Des outils comme MLflow, Weights & Biases ou DVC permettent de tracer automatiquement les hyperparamètres, métriques et artefacts.
Astuce de pro
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.
5. Exemples concrets par cas d’usage
Exemple 1 : Détection de fraudes bancaires
Fraud detection
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 Exemple 2 : Classification d’images (Détection d’objets)
Image classification
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 Exemple 3 : Analyse de sentiments sur des avis clients
Sentiment analysis
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 Exemple 4 : Système de recommandation de films
Recommendation system
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.ymlExemple 5 : Prédiction de la demande en énergie
Energy forecasting
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.ymlCes arborescences permettent une meilleure organisation et facilitent le travail collaboratif ainsi que le suivi des différentes versions des modèles.
6. Outils complémentaires pour la structuration
Au-delà de l’arborescence, certains outils peuvent grandement faciliter la gestion de vos projets ML :
- DVC (Data Version Control) : versionne les données et les modèles comme on versionne le code avec Git.
- MLflow : traque les expérimentations, enregistre les hyperparamètres, métriques et artefacts.
- Hydra : gestion avancée des fichiers de configuration (héritage, composition).
- Pre-commit hooks : automatise le formatage du code (black, isort, flake8) avant chaque commit.
- Poetry ou pipenv : gestion robuste des dépendances et des environnements virtuels.
Recommandation
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.
FAQ
Dois-je versionner les données avec Git ?
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.
Comment gérer plusieurs environnements (dev, staging, prod) ?
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.
Faut-il versionner les notebooks Jupyter ?
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.
Quelle différence entre scripts/ et utils/ ?
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).
Comment structurer un projet avec plusieurs modèles en compétition ?
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.
Comment intégrer le tracking des expériences (MLflow) dans cette arborescence ?
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().
Faites parler vos données
Apprenez les méthodes et les outils pour extraire de la valeur stratégique : Data Science : Le guide complet des méthodes et outils.
Sources
- Cookiecutter Data Science – Projet template de référence (2025)
- Enquête Kaggle “State of Data Science 2026”
- Documentation officielle MLflow – Best practices (mars 2026)
- Retours d’expérience – équipes data iana-data.org (2025–2026)