- À propos
- Contexte du projet
- Méthodologie
- Structure du projet
- Technologies utilisées
- Données
- Résultats
- Installation et utilisation
- Auteurs
- Ressources
Ce projet explore l'application de l'apprentissage automatique à la prédiction des issues de matchs de football. Développé dans le cadre d'un TIPE (Travaux d'Initiative Personnelle Encadrés) 2023/2024 sur le thème "Jeux & Sports", il implémente un algorithme de forêts aléatoires (Random Forest) pour prédire si une équipe à domicile gagnera, perdra ou fera match nul.
- Julie Antoine
- Valentin Malquy
- Téodore Autuly
Est-il possible de prédire l'issue d'un match de football en fonction des statistiques des matchs précédents ?
Cette question soulève plusieurs défis :
- La complexité et l'imprévisibilité inhérentes au sport
- La multitude de facteurs influençant le résultat d'un match
- Le choix des variables pertinentes pour la prédiction
- L'équilibre entre précision et généralisation du modèle
- Analyser les corrélations entre différentes statistiques de match et les résultats
- Implémenter un algorithme de forêts aléatoires from scratch
- Comparer les performances entre deux implémentations (Python et C)
- Évaluer la fiabilité du modèle sur des données réelles
- Simuler des stratégies de paris basées sur les prédictions
L'algorithme de forêts aléatoires est une méthode d'ensemble qui combine plusieurs arbres de décision pour améliorer la précision et réduire le surapprentissage.
Principe de fonctionnement :
- Bootstrap Aggregating (Bagging) : Création de sous-échantillons aléatoires des données d'entraînement
- Construction d'arbres : Création d'arbres de décision sur chaque sous-échantillon
- Sélection aléatoire de features : À chaque nœud, sélection aléatoire d'un sous-ensemble de paramètres
- Agrégation : Vote majoritaire des arbres pour la prédiction finale
Variables d'entrée (features) :
FTHG: Buts marqués à domicile (Full Time Home Goals)FTAG: Buts marqués à l'extérieur (Full Time Away Goals)HTHG: Buts à domicile à la mi-temps (Half Time Home Goals)HTAG: Buts à l'extérieur à la mi-temps (Half Time Away Goals)HS: Tirs de l'équipe à domicile (Home Shots)AS: Tirs de l'équipe à l'extérieur (Away Shots)HST: Tirs cadrés à domicile (Home Shots on Target)AST: Tirs cadrés à l'extérieur (Away Shots on Target)HomeTeam: Équipe à domicile (encodée numériquement)AwayTeam: Équipe à l'extérieur (encodée numériquement)
Variable de sortie (target) :
FTR: Résultat final (Full Time Result)H(Home) → 1.0 : Victoire à domicileD(Draw) → 0.0 : Match nulA(Away) → 0.0 : Victoire à l'extérieur
- Conversion des variables catégoriques : Transformation des résultats (H/D/A) en valeurs numériques
- Gestion des valeurs manquantes : Remplacement par la moyenne de la colonne
- Encodage des équipes : Conversion des noms d'équipes en valeurs numériques via un hash
- Calcul de moyennes historiques : Pour chaque match, calcul des statistiques moyennes des matchs précédents
- Mélange aléatoire : Randomisation des données pour éviter les biais
- Nombre d'arbres : 150
- Nombre maximal de paramètres par arbre : 6
- Profondeur maximale : 15
- Nombre minimum de divisions : 3
- Validation Out-of-Bag (OOB) : Estimation de l'erreur sur les données non utilisées dans le bootstrap
- Matrice de confusion : Analyse détaillée des prédictions
- Taux de précision : Pourcentage de prédictions correctes
- Simulation de gains : Évaluation d'une stratégie de paris fictive
Football-Results-Prediction/
│
├── README.md # Documentation du projet
├── Sources.txt # Références et sources de données
│
├── datasets/ # Données de matchs (2013-2023)
│ ├── 2013-2014.csv
│ ├── 2014-2015.csv
│ ├── 2015-2016.csv
│ ├── 2016-2017.csv
│ ├── 2017-2018.csv
│ ├── 2018-2019.csv
│ ├── 2019-2020.csv
│ ├── 2020-2021.csv
│ ├── 2021-2022.csv
│ └── 2022-2023.csv
│
└── code/ # Implémentations du modèle
├── RandomForestClassifier_final.ipynb # Implémentation Python principale
├── RandomForestClassifier .ipynb # Version alternative
├── RandomForestClassifier copy.ipynb # Copie de travail
├── TIPE_C_commentaires_corriges.c # Implémentation C commentée
├── tipeamelioration.c # Version améliorée en C
├── tipe C.c # Version de base en C
├── tipedebug.c # Version de débogage
├── testdedebug # Tests
├── SQLite (1).csv # Données SQLite
└── SQLite (2).csv # Données SQLite additionnelles
- NumPy : Calculs numériques et manipulation de matrices
- Pandas : Manipulation et analyse de données tabulaires
- Matplotlib : Visualisation des résultats et graphiques
- Seaborn : Visualisations statistiques avancées (heatmaps, etc.)
- scikit-learn : Métriques d'évaluation (matrice de confusion)
- Implémentation bas niveau pour optimisation des performances
- Structures de données personnalisées (Noeud, AbrDecision, Foretalea)
- Gestion manuelle de la mémoire
Les données proviennent de Football-Data.co.uk, une plateforme réputée fournissant des statistiques historiques détaillées sur les matchs de football.
- Période couverte : 2013-2023 (10 saisons)
- Championnat : Données anglaises (Premier League)
- Volume : ~380 matchs par saison
- Variables : Plus de 60 colonnes incluant :
- Résultats et scores
- Statistiques de jeu (tirs, fautes, corners, etc.)
- Cotes de paris de multiples bookmakers
- Résultats à la mi-temps
Projet GitHub inspirant : FootballPrediction par Amaurytiss
Le modèle obtient des performances variables selon les saisons et les hyperparamètres :
- Estimation Out-of-Bag : Affichée lors de l'entraînement
- Précision sur ensemble de test : Calculée et affichée en pourcentage
- Matrice de confusion : Visualisation des types d'erreurs
Une heatmap de corrélation est générée pour identifier les relations entre :
- Le résultat final (
FTR) - Les buts marqués (
FTHG,FTAG) - Les statistiques à la mi-temps
- Les statistiques de tirs
Un graphique illustre l'évolution des gains théoriques en pariant :
- +10 unités sur une prédiction correcte
- -10 unités sur une prédiction incorrecte
Cette simulation permet d'évaluer la viabilité économique d'une stratégie basée sur le modèle.
Pour Python :
pip install numpy pandas matplotlib seaborn scikit-learnPour C :
- Compilateur GCC ou équivalent
- Bibliothèques standard C
- Ouvrir le notebook
RandomForestClassifier_final.ipynbdans Jupyter Notebook/Lab - Vérifier que le fichier CSV est dans le bon répertoire
- Exécuter les cellules séquentiellement
gcc -o prediction TIPE_C_commentaires_corriges.c -lm
./predictionVous pouvez ajuster les hyperparamètres dans le code :
nmb_arbres = 150 # Nombre d'arbres dans la forêt
nb_max_parametres = 6 # Paramètres considérés par arbre
profondeur_max = 15 # Profondeur maximale des arbres
nmb_division_min = 3 # Minimum d'échantillons pour diviser un nœudCe projet a été réalisé en équipe dans le cadre du TIPE 2023/2024 :
- Julie Antoine - Développement et analyse
- Valentin Malquy - Développement et analyse
- Téodore Autuly - Développement et analyse
- Football-Data.co.uk - Base de données principale
- Tennis-Data.co.uk - Référence comparative
- GitHub - FootballPrediction - Projet inspirant
- Documentation scikit-learn - Random Forest Classifier
- Articles académiques sur l'application du ML au sport
- Entropie : Mesure d'impureté pour la construction des arbres
- Gain d'information : Critère de division des nœuds
- Bootstrap : Technique de rééchantillonnage
- Bagging : Méthode d'agrégation de modèles
Projet réalisé dans le cadre du TIPE 2023/2024 - Thème : Jeux & Sports