Skip to content
Extraits de code Groupes Projets
Valider 2ec224af rédigé par Prince Addae's avatar Prince Addae
Parcourir les fichiers

Update file README.md

parent cd9e8fa4
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
# Group 5 - Projet de Recommender System # Group 5 - Hackathon - contentbased for MLSMM2156 Recommender System
## Overview
This repository contains a content-based recomsys model designed for the Hackathon. The system leverages various feature extraction methods and regression algorithms to provide personalized movie recommendations based on user ratings and movie attributes.
Ce projet vise à développer des outils d'analyse de données et de recommandation.
Ce README présente la structure et résume notre projet.
## Python Libraries : ## Python Libraries :
...@@ -20,177 +21,52 @@ pip install random ...@@ -20,177 +21,52 @@ pip install random
pip install tabulate pip install tabulate
``` ```
## Codes Python de Base
Ces codes se trouveront dans le même dossier que chacun des jupyter notebook (.ipynb).
### configs.py
Ce code définit une **classe EvalConfig** qui stocke les **configurations** pour évaluer plusieurs **modèles de recommandation**. Il spécifie une liste de modèles, chacun avec son nom, sa classe et ses paramètres. Les **métriques** sont définies pour évaluer les **performances** des modèles dans différents scénarios : **évaluation par fractionnement**, **Leave-One-Out** et sur l'ensemble du **jeu de données**. D'autres paramètres incluent la taille de l'ensemble de test et le nombre de **recommandations** à considérer.
### constants.py
Ce code définit une **classe Constant** qui stocke les **chemins** vers les **datasets** et les noms de **colonnes** pour les données de **contenu** et de **preuve**. Les chemins vers les **répertoires** de contenu, de preuve et d'évaluation sont définis en fonction du chemin vers le répertoire de données. Les noms de fichiers et de colonnes pour les données d'**articles** et de **notes** sont spécifiés, ainsi que l'**échelle de notation**.
### loaders.py
Ce code **charge** les données de **notes** et d'articles à partir de fichiers **CSV** spécifiés dans la **classe Constant** du module constants. La fonction `load_ratings()` charge les données de notes, et la fonction `load_items()` charge les données d'articles. Une autre fonction, `export_evaluation_report()`, **fusionne** les données de notes et d'articles, puis exporte le rapport d'évaluation vers un fichier CSV. Les données sont chargées dans des **DataFrames** pandas, et une option est disponible pour charger les données de notes au format attendu par la **bibliothèque Surprise** si nécessaire.
### models.py
Ce code **définit** plusieurs **algorithmes** de base de **recommandation** pour la bibliothèque **Surprise**. La fonction `get_top_n()` prend une liste de **prédictions** et retourne les meilleures recommandations pour chaque **utilisateur**. Les algorithmes de recommandation sont définis comme des classes héritant de la classe `AlgoBase` de **Surprise**, chacun implémentant une méthode `estimate` pour prédire les **évaluations** des utilisateurs pour les articles.
## Datasets
### Small
<<<<<<< HEAD
Le **small dataset** de données contient les données traditionnelles de **MovieLens** et est celui que nous devons utiliser lors de l'**évaluation** des modèles et de la construction de notre **système de recommandation**.
### Test
Le **test dataset** est une version encore plus petite **(6 utilisateurs et 10 articles)** et contient l'exemple utilisé dans les diapositives de la conférence. Nous utilisons ce dataset afin de **mieux comprendre** le fonctionnement des algorithmes lors du développement de nos modèles.
### Tiny
Le **tiny dataset** est une version plus petite du small dataset et est utilisé pour **déboguer** notre code. Cela est utile lorsque certains modèles prennent beaucoup de temps à s'exécuter et que nous voulons **accélérer** le temps de calcul.
=======
Le **small dataset** de données contient les données traditionnelles de **MovieLens** et est celui que nous devons utiliser lors de l'**évaluation** des modèles et de la construction de notre **système de recommandation**.
### Test
Le **test dataset** est une version encore plus petite **(6 utilisateurs et 10 articles)** et contient l'exemple utilisé dans les diapositives de la conférence. Nous utilisons ce dataset afin de **mieux comprendre** le fonctionnement des algorithmes lors du développement de nos modèles.
### Tiny
Le **tiny dataset** est une version plus petite du small dataset et est utilisé pour **déboguer** notre code. Cela est utile lorsque certains modèles prennent beaucoup de temps à s'exécuter et que nous voulons **accélérer** le temps de calcul.
>>>>>>> Evaluator
## Rendu
<<<<<<< HEAD
### Analytics_UI
Lors de ce rendu, différentes analyses ont pu être effectuées sur les datasets disponibles afin de mieux comprendre les différentes données auxquelles nous allons faire face tout au long du projet. Une description détaillée des différentes analyses, menées dans les jupyter notebook, est décrite ci-dessous. Les jupyter notebook peuvent être lancés (run) indépendamment de tout autre fichier (.py) ou (.ipynb).
=======
### Evaluator block
Le Jupyter Notebook peut être lancé indépendemment de tout autre code.
>>>>>>> Evaluator
- **evaluator.ipynb**
Pour ce jupyter notebook Evaluator.ipynb, l'importation de certains **packages** et modules clés est essentielle. Dans notre cas, nous avons importé les packages `model_selection` et `accuracy` de **Surprise**, ce dernier étant nécessaire pour effectuer une **validation croisée** et utiliser des **métriques** prédéfinies pour **évaluer les modèles**. Cela nous permettra d'obtenir des informations précieuses sur les performances de nos modèles de recommandation.
En ce qui concerne l'adaptation des **loaders**, nous avons apporté des modifications à la fonction `load_ratings()`. Cette fonction a été ajustée pour permettre le chargement de données dans un **format** compatible avec **Surprise**. Un argument supplémentaire, `surprise_format`, a été ajouté pour conditionner le chargement en un objet **Dataset** compatible Surprise à partir d'un **DataFrame Pandas**. Cela simplifie grandement le processus de préparation des données pour l'entraînement des modèles.
Pour évaluer nos modèles, nous avons mis en œuvre trois méthodes de **validation croisée**. La première méthode, `generate_split_predictions()`, divise l'ensemble de données en un ensemble d'entraînement et un ensemble de test en utilisant `train_test_split` de Surprise. Ensuite, avec `generate_loo_top_n()`, nous appliquons un processus **"leave-one-out"** pour générer des recommandations top-N et évaluer les performances du modèle. Enfin, `generate_full_top_n()` utilise l'**ensemble complet de données** pour **générer des recommandations** top-N sans division. Ces approches nous offrent une vision complète des performances de nos modèles dans différents scénarios.
Pour améliorer notre évaluation, nous avons également introduit trois **nouvelles métriques**. La **première**, `rmse (split type)`, représente la racine carrée de l'erreur quadratique moyenne pour évaluer les prédictions. **Ensuite**, `hit rate (loo type)` mesure le taux de succès, indiquant le pourcentage d'utilisateurs pour lesquels l'un des films recommandés correspond à ceux notés dans l'ensemble de test. **Enfin**, `novelty (full type)` évalue la nouveauté des recommandations en fonction de la popularité des films recommandés, fournissant ainsi des informations sur la diversité et la pertinence des suggestions.
<<<<<<< HEAD
- analytics_tiny.ipynb
Dans le notebook "analytics_tiny.ipynb", plusieurs analyses ont été menées sur un ensemble de données, surnommé "tiny", étant un dataset réduit du dataset "small". Tout d'abord, le nombre total de notes a été calculé, permettant ainsi d'avoir une vue d'ensemble de la taille de l'ensemble de données. Ensuite, le nombre d'utilisateurs uniques a été déterminé, offrant ainsi un aperçu de la diversité des utilisateurs qui ont contribué aux évaluations des films. De même, le nombre de films uniques dans la matrice des notes a été extrait, ce qui donne un aperçu du nombre de films différents présents dans l'ensemble de données.
Une analyse a également été réalisée pour identifier le(s) film(s) le(s) plus noté(s), ainsi que le(s) film(s) le(s) moins noté(s). Ces informations permettent de repérer les tendances de popularité et les cas exceptionnels dans les données. Ensuite, toutes les valeurs de notation possibles ont été recueillies, de la plus petite à la plus grande valeur. Cette étape est importante pour comprendre la gamme des évaluations et identifier d'éventuelles anomalies ou biais dans les données.
Un autre aspect exploré était le nombre de films qui n'ont reçu aucune note. Cette mesure offre un aperçu de la couverture des évaluations dans l'ensemble de données et peut révéler des lacunes potentielles. En ce qui concerne la section "Long-tail property", une évaluation de la sparsité de la matrice a été réalisée. Cela impliquait le calcul d'une métrique de sparsité ainsi qu'une observation visuelle de la distribution des notes dans la matrice. Cette analyse permet de déterminer dans quelle mesure les données suivent la propriété de la longue traîne, souvent observée dans les systèmes de recommandation.
En complément des analyses mentionnées, une distribution des 'ratings' par films a été effectuée. Cette distribution offre un aperçu détaillé de la manière dont les différentes notes sont réparties entre les films, mettant en lumière les tendances de notation et les variations de popularité parmi les films. De plus, une matrice de sparsité a été calculée pour évaluer la densité des données. Cette matrice montre la proportion de cases vides ou non renseignées dans la matrice des notes, ce qui est crucial pour comprendre la disponibilité des données et leur potentiel pour l'analyse et la modélisation.
- analytics_test.ipynb
Dans le notebook "analytics_test.ipynb", plusieurs analyses ont été menées sur un ensemble de données, surnommé "test", qui comprend 6 utilisateurs et 10 éléments (films) permettant ainsi . Tout d'abord, le nombre total de notes a été calculé, permettant ainsi d'avoir une vue d'ensemble de la taille de l'ensemble de données. Ensuite, le nombre d'utilisateurs uniques a été déterminé, offrant ainsi un aperçu de la diversité des utilisateurs qui ont contribué aux évaluations des films. De même, le nombre de films uniques dans la matrice des notes a été extrait, ce qui donne un aperçu du nombre de films différents présents dans l'ensemble de données.
Une analyse a également été réalisée pour identifier le(s) film(s) le(s) plus noté(s), ainsi que le(s) film(s) le(s) moins noté(s). Ces informations permettent de repérer les tendances de popularité et les cas exceptionnels dans les données. Ensuite, toutes les valeurs de notation possibles ont été recueillies, de la plus petite à la plus grande valeur. Cette étape est importante pour comprendre la gamme des évaluations et identifier d'éventuelles anomalies ou biais dans les données.
Un autre aspect exploré était le nombre de films qui n'ont reçu aucune note. Cette mesure offre un aperçu de la couverture des évaluations dans l'ensemble de données et peut révéler des lacunes potentielles. En ce qui concerne la section "Long-tail property", une évaluation de la sparsité de la matrice a été réalisée. Cela impliquait le calcul d'une métrique de sparsité ainsi qu'une observation visuelle de la distribution des notes dans la matrice. Cette analyse permet de déterminer dans quelle mesure les données suivent la propriété de la longue traîne, souvent observée dans les systèmes de recommandation.
En complément des analyses mentionnées, une distribution des 'ratings' par films a été effectuée. Cette distribution offre un aperçu détaillé de la manière dont les différentes notes sont réparties entre les films, mettant en lumière les tendances de notation et les variations de popularité parmi les films. De plus, une matrice de sparsité a été calculée pour évaluer la densité des données. Cette matrice montre la proportion de cases vides ou non renseignées dans la matrice des notes, ce qui est crucial pour comprendre la disponibilité des données et leur potentiel pour l'analyse et la modélisation.
### Evaluator block
- **evaluator.ipynb**
Pour ce jupyter notebook Evaluator.ipynb, l'importation de certains **packages** et modules clés est essentielle. Dans notre cas, nous avons importé les packages `model_selection` et `accuracy` de **Surprise**, ce dernier étant nécessaire pour effectuer une **validation croisée** et utiliser des **métriques** prédéfinies pour **évaluer les modèles**. Cela nous permettra d'obtenir des informations précieuses sur les performances de nos modèles de recommandation.
En ce qui concerne l'adaptation des **loaders**, nous avons apporté des modifications à la fonction `load_ratings()`. Cette fonction a été ajustée pour permettre le chargement de données dans un **format** compatible avec **Surprise**. Un argument supplémentaire, `surprise_format`, a été ajouté pour conditionner le chargement en un objet **Dataset** compatible Surprise à partir d'un **DataFrame Pandas**. Cela simplifie grandement le processus de préparation des données pour l'entraînement des modèles.
Pour évaluer nos modèles, nous avons mis en œuvre trois méthodes de **validation croisée**. La première méthode, `generate_split_predictions()`, divise l'ensemble de données en un ensemble d'entraînement et un ensemble de test en utilisant `train_test_split` de Surprise. Ensuite, avec `generate_loo_top_n()`, nous appliquons un processus **"leave-one-out"** pour générer des recommandations top-N et évaluer les performances du modèle. Enfin, `generate_full_top_n()` utilise l'**ensemble complet de données** pour **générer des recommandations** top-N sans division. Ces approches nous offrent une vision complète des performances de nos modèles dans différents scénarios.
Pour améliorer notre évaluation, nous avons également introduit trois **nouvelles métriques**. La **première**, `rmse (split type)`, représente la racine carrée de l'erreur quadratique moyenne pour évaluer les prédictions. **Ensuite**, `hit rate (loo type)` mesure le taux de succès, indiquant le pourcentage d'utilisateurs pour lesquels l'un des films recommandés correspond à ceux notés dans l'ensemble de test. **Enfin**, `novelty (full type)` évalue la nouveauté des recommandations en fonction de la popularité des films recommandés, fournissant ainsi des informations sur la diversité et la pertinence des suggestions.
Pour conclure notre processus d'évaluation, nous avons mis en place une fonction `export_evaluation_report()`. Cette fonction permet d'**exporter le rapport** d'évaluation vers un **fichier CSV** dans un répertoire spécifié. Cela facilite le partage et la consultation des résultats, ce qui est crucial pour optimiser nos modèles et affiner nos stratégies de recommandation.
### User_based (à compléter)
### Recommender_UI (à compléter)
=======
Pour conclure notre processus d'évaluation, nous avons mis en place une fonction `export_evaluation_report()`. Cette fonction permet d'**exporter le rapport** d'évaluation vers un **fichier CSV** dans un répertoire spécifié. Cela facilite le partage et la consultation des résultats, ce qui est crucial pour optimiser nos modèles et affiner nos stratégies de recommandation.
>>>>>>> Evaluator
## Contact
Pour toute question, suggestion, ou demande de collaboration sur ce projet, n'hésitez pas à nous contacter. Pour des discussions plus approfondies sur notre recherche et notre méthodologie, nous pouvez contacter :
- Audrey Ghilain à audrey.ghilain@student.uclouvain.be
- Nathanaël Kindidi à nathanael.kindidi@student.uclouvain.be
- Charles Addae à charles.addae@student.uclouvain.be
- Adrien Payen à adrien.payen@student.uclouvain.be
## Remerciements
Nous tenons à exprimer notre gratitude envers plusieurs parties qui ont jouées un rôle crucial dans la réalisation de ce projet :
- **Professeur Vande Kerckhove Corentin** : Pour son enseignement en recommender system. Son soutien et ses conseils ont été essentiels pour l'adaptation et l'amélioration de nos codes dans notre projet.
- **Else...**
## Auteurs
- Audrey Ghilain
- Nathanaël Kindidi
- Charles Addae
- Adrien Payen
## Références ## Project Structure
### Evaluator_block ### Features and Models
- https://forge.uclouvain.be/cvandekerckh/mlsmm2156 1. ***Feature Extraction Methods***
- https://bit.ly/3qnwKXa The system supports the following feature extraction methods:
- https://bit.ly/4cBLxDM - genre: Extracts genres of the movies using TF-IDF vectorization.
- https://numpy.org/doc/stable/user/quickstart.html - movie_year: Extracts the release year of the movies.
- https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html - avg_rating: Computes the average rating for each movie.
- https://pandas.pydata.org/docs/reference/frame.html - title_length: Computes the length of the movie title.
<<<<<<< HEAD
- https://www.jillcates.com/pydata-workshop/html/tutorial.html
2. **Evaluator_block** 2. ***Regression Models***
The system supports the following regression models for predicting user ratings:
- https://forge.uclouvain.be/cvandekerckh/mlsmm2156 - `linear_regression`
- https://bit.ly/3qnwKXa - `random_forest`
- https://bit.ly/4cBLxDM - `lasso_regression`
- https://numpy.org/doc/stable/user/quickstart.html - `gradient_boosting`
- https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html - `ridge_regression`
- https://pandas.pydata.org/docs/reference/frame.html - `svr_regression`
- https://surprise.readthedocs.io/en/stable/
3. **User_based** (à compléter) ### Dataset
Organized under the data/test/ directory, which contains three subdirectories:
- content: Contains movies.csv & tags.csv files.
- evidence: Contains ratings.csv file.
- evaluations: Directory reserved for evaluation results
4. **Recommender_UI** (à compléter)
## Architecture
======= .
- https://surprise.readthedocs.io/en/stable/ ├── data/
│ ├── test/
>>>>>>> Evaluator │ │ ├── content/
│ │ │ ├── movies.csv
│ │ │ └── tags.csv
│ │ ├── evidence/
│ │ │ └── ratings.csv
│ │ └── evaluations/
├── loaders.py
├── models.py
├── constants.py
├── configs.py
├── content_based.ipynb
└── README.md
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter