Pipeline
10 scripts à exécuter dans l'ordre. Clique sur une étape pour voir les détails.
①
Init DB
init_db.py
Création de la base SQLite et des tables
→
②
Collecte data
collect_*.py
Appels API · matchs CdM + matchs historiques
→
③
Nettoyage
clean_database.py
Filtrage du dataset
→
④
Features
build_features.py
Calcul des 24 features
→
⑤
Rankings FIFA
load_fifa_ranking.py
Import des classements FIFA dans la DB
→
⑥
Entraînement
train_model.py
XGBoost · walk-forward · calibration
→
⑦
Prédictions
predict_*.py
Monte Carlo : groupes · bracket
→
⑧
Export data
export_data.py
Génère les fichiers JSON
Choix de conception
Pourquoi ces algorithmes, ces features, cette approche de validation ?
🌳

XGBoost Gradient Boosting

Le football est un sport à faibles scores où les différences entre équipes sont souvent marginales. XGBoost gère naturellement les interactions non-linéaires, les valeurs manquantes, et produit des prédictions robustes sur des datasets de taille modeste.

→ Alternatives rejetées : réseaux de neurones (trop peu de données), régression logistique (trop rigide face aux interactions).
📐

Calibration Isotonique

XGBoost produit des probabilités brutes souvent mal calibrées (ex. donner 85% de chances à une équipe légèrement favorite). La calibration isotonique ajuste ces probabilités sur un hold-out temporel de 15% pour qu'elles correspondent à la réalité observée.

→ Concrètement : les probabilités affichées reflètent fidèlement la fréquence réelle de victoire dans les données historiques.
⏩

Walk-Forward Validation

On entraîne sur le passé et on teste sur le futur, en avançant chronologiquement sur 6 fenêtres. Cette approche respecte la causalité temporelle et évite le data leakage (on ne peut pas utiliser des matchs futurs pour prédire le passé).

→ Contrairement à une validation croisée classique qui mélangerait passé et futur.
🌍

Pénalité Confédération

Le classement FIFA seul est trompeur : l'Iran classé #21 joue majoritairement en AFC contre des équipes moins compétitives qu'un #21 UEFA. On ajoute une pénalité au ranking pour comparer les équipes à leur niveau réel de compétition.

→ Résultat : moins d'upsets artificiels entre équipes de confédérations différentes.
⚖️

Sample Weights

Un match France-Brésil en finale de CdM et un match Botswana-Somalie en qualifications CAF ont le même poids par défaut. On pondère chaque match à l'entraînement selon la qualité des équipes et l'importance de la compétition, pour que le modèle apprenne davantage des confrontations qui comptent.

→ Corrige la sur-représentation des qualifications intra-confédération (CAF = 256 matchs).
🎲

Simulation Monte Carlo

Pour propager l'incertitude à travers tout le tournoi, on simule 10 000 fois la compétition entière. Chaque match est tiré aléatoirement selon les probabilités du modèle. Les résultats (prob. de victoire en groupe, de titre) sont des fréquences sur ces 10 000 simulations.

→ Capture les effets de bracket (équipes évitées ou affrontées selon leur côté du tableau).
Features du Modèle
24 variables d'entrée calculées pour chaque match
📈 Forme Récente
home/away_form5_ptsPoints pondérés sur les 5 derniers matchs
home/away_form5_scoredButs marqués moyens pondérés (5 matchs)
home/away_form5_concededButs encaissés moyens pondérés (5 matchs)
home/away_form10_*Idem sur les 10 derniers matchs (forme long terme)
⚔️ Historique Head to Head
h2h_home/away_wins% victoires domicile/extérieur entre les deux équipes
h2h_draws% de matchs nuls entre les deux équipes
h2h_home/away_goals_avgButs marqués en moyenne dans les duels directs
h2h_matchesNombre de confrontations directes disponibles
🏆 Classement FIFA
home/away_fifa_rankingClassement FIFA brut de chaque équipe
ranking_gapÉcart brut de classement (away - home)
🌟 Expérience & Contexte
neutral_venueMatch sur terrain neutre (1) ou non (0)
competition_weightImportance de la compétition (CdM=1.0, Euro=0.8, amicaux=0.3…)
is_knockoutPhase éliminatoire (1) vs phase de groupes (0)
Validation Walk-Forward
6 fenêtres temporelles · entraînement sur le passé, test sur le futur
Train (données passées)
Test (données futures)
—
Accuracy
baseline : —
—
Log Loss
baseline : —
—
MAE Buts Dom.
erreur absolue moyenne
—
MAE Buts Ext.
erreur absolue moyenne
Comment lire ces métriques ?
L'accuracy mesure la proportion de résultats (H/D/A) correctement prédits. La baseline naïve est de prédire toujours le résultat le plus fréquent. Le log loss pénalise la confiance mal placée : une proba de 90% sur le mauvais résultat est très pénalisée. Plus il est bas, mieux c'est. Le MAE buts est l'erreur absolue moyenne sur le score prédit (±1 but en moyenne est typique pour ce type de modèle).
Importance des Features
Contribution de chaque variable aux prédictions du classificateur XGBoost
🏆 Classement FIFA

L'écart de ranking FIFA (12.2%) domine largement — c'est la variable la plus prédictive. Le modèle s'appuie en priorité sur la hiérarchie mondiale établie.

⚔️ Head-to-Head

Les confrontations directes (% victoires, buts moyens) pèsent collectivement ~15%. L'historique entre deux équipes apporte une information que le ranking seul ne capture pas.

📈 Forme récente

Les features de forme sont très nombreuses mais chacune pèse ~3.7–4.1%. Leur contribution cumulée est importante.

🎯 Contexte

L'importance de la compétition (4.2%) et la phase éliminatoire (3.8%) ont un effet notable. Les équipes se comportent différemment en CdM qu'en amical, et différemment en phase à élimination directe qu'en groupe.

Simulation Monte Carlo
Comment on passe des probabilités d'un match aux probabilités de titre ?
1
Prédiction match par match

Pour chaque match, le modèle produit une distribution de probabilités P(H), P(D), P(A) et des scores attendus via les régresseurs.

2
Score conditionnel pondéré

Le score affiché n'est pas la moyenne brute, mais la moyenne pondérée des simulations cohérentes avec le résultat dominant.
Exemple : si Home est prédit, on filtre les 10 000 simulations où Home gagne pour calculer le score moyen — évitant d'afficher 2-1 / 1-0 pour une victoire nette.

3
Simulation de la phase de groupes

On tire aléatoirement les 72 matchs de groupe selon les probas. Les classements sont déterminés par pts → diff. de buts → buts marqués, puis les 8 meilleurs 3ème sont sélectionnés selon les règles FIFA.

4
Simulation des phases finales

L'arbre knockout est simulé en propagant les vainqueurs. En cas de nul en phase éliminatoire, une prolongation / tirs au but est simulée avec P(home_wins_ET) ≈ 0.5 légèrement ajustée par le ranking.

5
Agrégation sur 10 000 itérations

Les probabilités finales (atteindre les quart de finale, demi-finale, finale) sont les fréquences observées sur les 10 000 simulations complètes. Plus une équipe gagne souvent dans les simulations, plus sa probabilité est élevée.