Skip to content

Machine Learning project for IMDB movie score prediction using Random Forest. Includes web scraping, data preprocessing, model training with stability testing, and CI/CD pipeline with automated testing and security checks.

Notifications You must be signed in to change notification settings

francoisdotdev/IMDB-ML

 
 

Repository files navigation

IMDB-ML

Un projet de Machine Learning pour prédire la qualité des films IMDB en combinant web scraping et analyse prédictive.

Description

Ce projet combine deux approches complémentaires :

  1. Web Scraping IMDB : Extraction automatisée des informations de films depuis IMDB (titre, acteurs, réalisateur, genres, note, durée)
  2. Prédiction ML : Modèle de classification Random Forest pour prédire si un film sera bien noté (≥7.0/10) en fonction de ses caractéristiques

Fonctionnalités

  • Scraping asynchrone avec Playwright pour récupérer les données des films les plus populaires
  • Gestion robuste des erreurs et retry automatique
  • Preprocessing et feature engineering des données
  • Modèle de classification avec RandomForestClassifier
  • Validation de stabilité sur plusieurs runs
  • Pipeline CI/CD avec GitHub Actions
  • Tests automatisés et couverture de code

Structure du Projet

IMDB-ML/
├── src/
│   ├── main.py                    # Point d'entrée principal
│   ├── scrapping/
│   │   ├── scraper.py             # Scraper IMDB avec Playwright
│   │   └── __init__.py
│   └── preprocessing/
│       └── preprocessing.py        # ML pipeline et prédictions
├── data/
│   ├── internal/                  # Données scrapées brutes
│   │   └── imdb_movies.csv
│   └── processed/                 # Données prétraitées pour ML
│       └── imdb_bdd.csv
├── tests/                         # Tests unitaires
├── configs/
│   └── config.json                # Fichiers de configuration
├── docs/
│   └── TESTING.md                 # Documentation des tests
├── .github/
│   └── workflows/
│       └── ci.yml                 # Pipeline CI/CD
├── requirements.txt               # Dépendances Python
├── pyproject.toml                 # Configuration des outils (black, mypy, pytest)
├── Makefile                       # Commandes utilitaires
└── README.md

Installation

Prérequis

  • Python 3.9 ou supérieur
  • pip

Configuration de l'environnement

# Cloner le repository
git clone https://github.com/votre-username/IMDB-ML.git
cd IMDB-ML

# Créer un environnement virtuel
python3 -m venv venv
source venv/bin/activate  # Sur Windows: venv\Scripts\activate

# Installer les dépendances
pip install -r requirements.txt

# Installer Playwright et les navigateurs
playwright install chromium

Utilisation

1. Scraper des films IMDB

# Scraper 200 films (par défaut)
python src/main.py

# Scraper un nombre personnalisé de films
python src/main.py 50

Le scraper récupère les films les plus populaires et extrait :

  • Titre
  • Note IMDB
  • Durée
  • Genres
  • Réalisateur
  • Top 3 acteurs
  • URL

Les données sont sauvegardées dans data/internal/imdb_movies.csv.

2. Entraîner et tester le modèle ML

python src/preprocessing/preprocessing.py

Ce script :

  • Charge les données depuis data/processed/imdb_bdd.csv
  • Nettoie et prépare les features
  • Entraîne un modèle RandomForest
  • Teste la stabilité sur 5 runs avec différentes seeds
  • Affiche les métriques (accuracy, F1-score)
  • Fait une prédiction exemple

Exemple de sortie :

Essai 1 -> Accuracy: 78.45% | F1-Score (Bons films): 0.82
Essai 2 -> Accuracy: 79.12% | F1-Score (Bons films): 0.83
...
Accuracy moyenne : 78.78% (écart type: +/- 0.45%)
=> Le modèle est STABLE.

Probabilité d'être un bon film : 82.35%
Film Tim Burton/Johnny Depp (Fantasy/Adventure) : Bon film

Développement

Commandes Make disponibles

make help           # Affiche toutes les commandes disponibles
make install        # Installe les dépendances de production
make install-dev    # Installe les dépendances de développement
make format         # Formate le code (black + isort)
make lint           # Vérifie le code avec flake8
make type-check     # Vérifie les types avec mypy
make security       # Vérifie les vulnérabilités (bandit + safety)
make test           # Lance les tests avec couverture
make test-fast      # Lance les tests sans rapport de couverture
make check          # Lance toutes les vérifications
make clean          # Nettoie les fichiers temporaires

Standards de code

Le projet utilise :

  • Black : formatage automatique (line-length: 100)
  • isort : tri des imports
  • flake8 : linting et vérification du style
  • mypy : vérification des types
  • pytest : framework de tests
  • bandit : analyse de sécurité
  • safety : vérification des vulnérabilités des dépendances

Pre-commit hooks

Pour configurer les hooks de pre-commit :

pre-commit install

Les hooks exécuteront automatiquement :

  • Formatage avec black et isort
  • Linting avec flake8
  • Vérifications de sécurité

Tests

# Lancer tous les tests avec rapport de couverture
make test

# Lancer uniquement les tests unitaires
pytest tests/ -v -m unit

# Lancer uniquement les tests d'intégration
pytest tests/ -v -m integration

# Lancer les tests rapides (sans couverture)
make test-fast

Le rapport de couverture HTML est généré dans htmlcov/index.html.

CI/CD

Le projet utilise GitHub Actions pour l'intégration continue :

  • Tests multi-versions : Python 3.12, 3.13, 3.14
  • Linting : flake8 et black
  • Tests : pytest avec rapport de couverture
  • Sécurité : safety et bandit
  • Cache pip : pour des builds plus rapides

Le pipeline se déclenche automatiquement sur :

  • Push vers main
  • Pull requests vers main

Technologies Utilisées

Web Scraping

  • Playwright : Scraping moderne et robuste avec support JavaScript
  • BeautifulSoup4 : Parsing HTML (fallback)
  • Requests : Requêtes HTTP

Machine Learning

  • scikit-learn : RandomForestClassifier, OrdinalEncoder
  • pandas : Manipulation de données
  • numpy : Calculs numériques

Développement

  • pytest : Tests unitaires et intégration
  • black : Formatage de code
  • flake8 : Linting
  • mypy : Type checking
  • bandit : Analyse de sécurité
  • safety : Vérification des dépendances

Modèle ML - Détails Techniques

Features utilisées

  • Numériques : budget, durée
  • Catégorielles : acteurs (top 3), réalisateur, genres (one-hot encoding)

Target

Classification binaire :

  • Classe 1 : Films bien notés (score IMDB ≥ 7.0)
  • Classe 0 : Films moins bien notés (score IMDB < 7.0)

Hyperparamètres optimaux

{
    "n_estimators": 200,
    "max_depth": 10,
    "min_samples_leaf": 2,
    "class_weight": "balanced"
}

Seuil de décision

Le modèle utilise un seuil de probabilité de 0.40 (au lieu de 0.50 par défaut) pour favoriser le rappel des bons films.

Performances

  • Accuracy moyenne : ~78-80%
  • F1-Score (bons films) : ~0.82
  • Stabilité : écart-type < 2% sur 5 runs

Contribution

  1. Forker le projet
  2. Créer une branche feature (git checkout -b feature/AmazingFeature)
  3. Commiter les changements (git commit -m 'Add some AmazingFeature')
  4. Pousser vers la branche (git push origin feature/AmazingFeature)
  5. Ouvrir une Pull Request

Assurez-vous que :

  • Le code est formaté avec make format
  • Tous les tests passent avec make test
  • Les vérifications de sécurité passent avec make security
  • Le code est documenté

Licence

Ce projet est un projet éducatif. Respectez les conditions d'utilisation d'IMDB lors du scraping.

Avertissement

Ce projet est destiné à des fins éducatives. Le scraping intensif d'IMDB peut violer leurs conditions d'utilisation. Utilisez-le de manière responsable :

  • Respectez les délais entre les requêtes (actuellement 2 secondes)
  • Ne surchargez pas les serveurs d'IMDB
  • Consultez les robots.txt et les conditions d'utilisation d'IMDB

Contact

Pour toute question ou suggestion, ouvrez une issue sur GitHub.

About

Machine Learning project for IMDB movie score prediction using Random Forest. Includes web scraping, data preprocessing, model training with stability testing, and CI/CD pipeline with automated testing and security checks.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 88.0%
  • Makefile 12.0%