Skip to content
karim.semaan(open to work)
WorkExperienceAboutSkillsContactResume ↓
← All work
KickCast preview
ML / Data ScienceLive2026

KickCast

2026 World Cup prediction · ensemble ML

Turns a 21,371-match feature matrix into 10,000-run Monte-Carlo odds for every one of the 104 games of the 2026 World Cup: full probability distributions, not a single guess.

Monte-Carlo simulator · 8,000 tournaments

Runs in your browser on synthetic data. Deterministic (seeded), so the same inputs always give the same forecast.

Press Run simulation to play 8,000 synthetic knockout tournaments and rank teams by how often they lift the trophy.

Synthetic, illustrative ratings, not the live KickCast model or a published forecast. The real product uses a 7-model ensemble over decades of match data.

Interactive Monte-Carlo simulation runs in your browser with sample tournament data.

KickCast, a graduate machine-learning course project, builds a leakage-safe pipeline that loads Elo, FIFA rankings, market values, manager records, injuries, form and head-to-head history into a 21,371-row × 38-feature matrix with chronological train/val/test splits (test = the 2022 World Cup). It trains seven classical models (Logistic Regression, KNN, Random Forest, XGBoost, HistGradientBoosting, SVM-RBF and a stacking ensemble) alongside LightGBM/CatBoost variants and a custom PyTorch 'KickCastNet' tuned with Optuna, handling class imbalance with balanced weights and SMOTE. SHAP attributes the signal (Elo difference is the single strongest predictor, |r|=0.504). Class probabilities then drive a 10,000-iteration Monte-Carlo simulation that samples goals via Poisson and runs the full group + knockout bracket into per-team advancement odds, served as a deployed Next.js dashboard.

  • Python
  • scikit-learn
  • XGBoost
  • LightGBM
  • PyTorch
  • Optuna
  • SHAP
  • Monte Carlo
  • Next.js
  • Vercel

Architecture · notebook → tournament odds

  1. 01

    Feature engineering

    Elo, FIFA rankings, market values, form, injuries and head-to-head → a 21,371 × 38 matrix with leakage-safe chronological splits (test = the 2022 World Cup).

  2. 02

    Model ensemble

    Seven classical models + LightGBM/CatBoost + a PyTorch net (KickCastNet), tuned with Optuna; class imbalance handled with balanced weights + SMOTE.

  3. 03

    Explainability

    SHAP attributes the signal: Elo difference is the single strongest predictor (|r| = 0.504).

  4. 04

    Monte-Carlo simulation

    3-class probabilities drive 10,000 iterations that sample goals via Poisson through the full 48-team group + knockout bracket.

  5. 05

    Live dashboard

    Per-team advancement odds served as a deployed Next.js dashboard.

Feature matrix
21,371 matches × 38 feat.
Models
7 classifiers + PyTorch net
Monte Carlo
10,000 iterations
Output
full probability distributions

What I'd improve

Honest read on the 64-match 2022 holdout: the 45.3% top-1 (29/64) sits about at the always-home rate (~44%) and below a naive Elo-favorite (~52%), precisely because the model predicts draws the favorite baselines never do. So the lever isn't top-1 accuracy, it's calibration, and that is what the project optimizes: it scores on log-loss (a proper scoring rule) with a stacking ensemble and calibration plots. That recalibration is now done and measured in the follow-up calibration study: per-class isotonic regression (fit on the validation split, holdout untouched) cuts holdout log-loss from 1.347 to 1.093 and 10-bin ECE from 0.157 to 0.120 on the 64-match 2022 holdout, and full-test ECE from 0.098 to 0.017 (n=3,552). Still open: backtesting more tournaments so the probabilities are decision-grade for the Monte-Carlo simulation.

Open live↗View source↗Project report (PDF)↗
Want something like this? Get in touch →
© 2026 Karim SemaanBuilt with Next.js, Tailwind & Supabase.LinkedIn ↗GitHub ↗