Ce projet a été réalisé dans le cadre de la formation d'ingénieur machine learning proposée par OpenClassrooms. L'objectif principal était de développer une API de suggestion de tags pour les utilisateurs de Stack Overflow, en utilisant des techniques de traitement automatique du langage naturel (NLP). Ce repository se concentre sur l'analyse exploratoire des données, ainsi que sur l'entraînement de modèles supervisés et non supervisés pour répondre à ce besoin.
Les principales étapes du projet comprenaient :
- Le filtrage des données issues de l'API StackExchange Explorer.
- Le prétraitement des documents textuels.
- La comparaison d'approches supervisées (Logistic Regression, SGD Classifier, SVM, XGBoost, Random Forest, LightGBM, et AdaBoost) et non supervisées (LDA, NMF, semi-supervisé LDA et semi-supervisé NMF) pour la prédiction des tags.
- Le test unitaire de chaque fonction avec pytest en local et dans GitHub.
- Le développement et la mise en production de l'API dans Streamlit Cloud, qui utilise des modèles stockés dans MLflow.
Le repository contient les éléments suivants :
-
Abbas_Billel_1_notebook_requete_API_072024.ipynb : Ce notebook est consacré aux requêtes API pour extraire les données depuis StackExchange Explorer.
-
Abbas_Billel_2_notebook_exploration_072024.ipynb : Ce notebook est dédié à l'analyse exploratoire des données afin de comprendre la structure des données et les préparer pour la modélisation.
-
Abbas_Billel_3_notebook_approche_non_supervisée_072024.ipynb : Ce notebook couvre les différentes étapes du prétraitement des données textuelles et l'entraînement des modèles non supervisés.
-
Abbas_Billel_4_notebook_approche_supervisée_072024.ipynb : Ce notebook traite de l'entraînement des modèles supervisés.
Le repository contient également les dossiers suivants :
-
data
: Ce dossier est destiné à contenir les données utilisées dans le projet. -
mlflow
: Ce dossier contient un module Python pour l'entraînement des modèles supervisés, en utilisant MLflow pour suivre les expériences et stocker les résultats. Le meilleur modèle est automatiquement sauvegardé dans un bucket AWS. On stocke dans ce même bucket AWS le modèle MLB (MultiLabelBinarizer) ainsi que le TfidfVectorizer. Ces modèles seront utilisés par l'API de prédiction déployée sur Streamlit. -
streamlit
: Ce dossier contient le module Pythonapi.py
nécessaire pour lancer l'API sur Streamlit Cloud. L'API utilise les modèles sauvegardés pour fournir des suggestions de tags en fonction des questions posées par les utilisateurs de Stack Overflow.requirements.txt
: Ce fichier est présent dans la racine du repository, mais Streamlit Cloud parvient toujours à l'utiliser pour installer les dépendances nécessaires au bon fonctionnement de l'API. -
tests
: Ce dossier contient les scripts de tests unitaires pour valider les fonctions du projet. Plus précisément :test_utils.py
: Ce fichier permet de tester localement et dans GitHub les fonctions définies dans les modules du dossierutils
à l'aide de pytest.
-
utils
: Ce dossier regroupe les modules Python contenant les fonctions nécessaires pour l'analyse exploratoire des données, ainsi que pour les approches supervisée et non supervisée. Plus précisément, il inclut :utils_exploratoire.py
: Ce module contient les fonctions pour l'analyse exploratoire des données.utils_non_supervised.py
: Ce module regroupe les fonctions utilisées pour les approches non supervisées.utils_supervised.py
: Ce module contient les fonctions dédiées aux méthodes supervisées.
-
.github/workflows
: Ce dossier contient le fichiermain.yml
qui automatise les tests avec pytest à chaquegit push
.
Les données utilisées dans ce projet proviennent de l'API StackExchange Explorer, qui permet d'extraire des questions, réponses, et tags associés de la plateforme Stack Overflow. Ces données ont été filtrées, nettoyées, et prétraitées avant d'être utilisées pour l'entraînement des modèles.
Les modèles suivants ont été comparés dans ce projet :
-
Approches supervisées :
- Logistic Regression
- SGD Classifier
- Support Vector Machine (SVM)
- XGBoost
- Random Forest
- LightGBM
- AdaBoost
-
Approches non supervisées :
- Latent Dirichlet Allocation (LDA)
- Non-Negative Matrix Factorization (NMF)
- Modèle semi-supervisé LDA
- Modèle semi-supervisé NMF
Le modèle XGBoost s'est avéré être le plus performant parmi les modèles supervisés, avec un score de Jaccard moyen de 0.622 et un taux de couverture de 0.27. Ce taux de couverture était significativement meilleur que celui obtenu avec les approches non supervisées (0.1 pour LDA et NMF, et < 0.0001 pour les modèles semi-supervisés). Grâce à ce taux de couverture supérieur, le modèle XGBoost supervisé a été choisi comme le meilleur modèle pour être implémenté dans l'API Streamlit.
L'API de suggestion de tags, basée sur le modèle XGBoost, est déployée sur Streamlit Cloud. Vous pouvez accéder à l'API via le lien suivant :
Accéder à l'API de suggestion de tags sur Streamlit Cloud
Les expérimentations et le suivi des modèles ont été effectués à l'aide de MLflow. Vous pouvez accéder au tableau de bord MLflow pour visualiser les différentes expériences et les modèles entraînés via le lien suivant :