À propos du projet

MMA Fight Prediction est un projet de recherche et de service en Python qui prédit les vainqueurs des combats de l'UFC, la méthode de victoire et le round de fin. Il combine un système de classement Elo, un ensemble boosté par gradient (XGBoost), un ensemble de réseaux de neurones multi-tâches, et un mélange à poids égal des deux qui constitue le scoreur déployé. Chaque candidat est évalué par une validation progressive (walk-forward) à fenêtre croissante sur la période 2018-2026, et le scoreur gagnant est calibré avec une température ajustée sur des données de validation (held-out) après la moyenne du mélange. Pipeline reproductible Le démarrage rapide (quickstart) crée un environnement virtuel, installe le package avec les options de développement (dev extras), puis exécute quatre scripts dans l'ordre : download_data.py (jeu de données Kaggle UFC dans data/raw/), make_dataset.py (parquet nettoyé dans data/processed/), build_ratings.py (ajustement et construction des classements Elo), suivi de pytest. Une application Streamlit (streamlit run app.py) permet à l'utilisateur de choisir deux combattants et renvoie la probabilité de victoire avec incertitude, les tendances de méthode et de round de fin, ainsi qu'une analyse des principaux facteurs contributifs. Un objectif documenté est la reproductibilité au bit près (byte-for-byte) de l'ensemble du pipeline. Ingénierie des caractéristiques (feature engineering) et contrôle des fuites Les caractéristiques (features) sont assemblées à partir de blocs nommés (base, external, trajectory, notice, context, opponent_adjusted) dans src/mma/feature_blocks.py, produisant un tableau d'environ 11 000 combats sur 87 colonnes. Les caractéristiques sont construites au sein d'accumulateurs chronologiques afin que chaque valeur soit strictement antérieure au combat, et un test d'invariance par troncature est utilisé pour vérifier qu'aucune caractéristique ne peut anticiper l'avenir (data leak). Les blocs ont été évalués par rapport à un seuil de précision pré-enregistré : l'un d'eux (external, couvrant les données de carrière pré-UFC) l'a franchi seul, tandis que d'autres ne sont livrés qu'en tant que partie du tableau sur lequel le mélange a été évalué, ou ne sont pas livrés du tout. Le projet documente une fuite de sélection (selection leak) identifiée dans les indicateurs de valeurs manquantes par coin (per-corner missingness flags), qui a été supprimée des deux matrices de modèles tout en restant dans le tableau pour les tranches d'évaluation. Plusieurs colonnes sont explicitement exclues des entrées du modèle en tant que protections contre les fuites, et un fichier d'accompagnement de provenance (provenance sidecar) enregistre, pour chaque ligne, si elle provient de la source primaire ou secondaire. Sources de données Les enregistrements sont assemblés sous la forme d'une union entre un miroir Kaggle maintien (la source primaire et réconciliée) et la publication CSV Greco1899/scrape_ufc_stats (utilisée strictement comme données, récupérée via HTTPS, sans aucun code sous licence GPL intégré). En cas de chevauchement de combats, la ligne de la source primaire l'emporte ; la fusion est conditionnée par l'accord sur le vainqueur entre les sources et est tolérante aux pannes (fail-soft), se dégradant en une version uniquement primaire avec un avertissement. Le dépôt signale la provenance, les contrôles d'intégrité et les protections contre les régressions autour de cette fusion. Auto-mise à jour et évaluation prospective Une GitHub Action hebdomadaire actualise le jeu de données et reconstruit les artefacts, en les validant (commit) automatiquement. Les événements UFC à venir sont prédits et validés dans git avant d'avoir lieu, puis évalués après coup, offrant ainsi un historique de performances prospectif plutôt qu'un rapport uniquement rétrospectif. Les rapports de test (harness reports) pour les blocs de caractéristiques rejetés et les fichiers de décision d'expériences pré-enregistrés sont validés sous models/walkforward/, de sorte que les résultats négatifs sont conservés. Le projet est écrit en Python (3.10+) et publié sous licence MIT. Les documents de conception et de planification de phase se trouvent sous docs/.