Predicting football results, and knowing when not to
I trained and calibrated models on 12,475 matches from eight competitions to find out how much of a football result can really be predicted from pre-match statistics.
Role
Solo Engineer
Organisation
Self-directed
Industry
Sports Analytics · Machine Learning
Focus
ML · Data · Modelling
/ Problem
Football produces huge amounts of measurable information: form, goals, shots, corners, home performance and dozens of other statistics.
That kept raising the same question for me.
If performance can be measured, how much of the next match should actually be predictable from what happened before it?
I never expected football to become fully predictable. Red cards, tactical changes, mistakes and chance can completely change a game.
But I wanted to find the boundary between the signal in the data and the uncertainty that statistics could not explain.
/ Solution
I collected 12,475 matches across eight competitions and built thirty features using only information available before kick-off.
Evaluation was historical so future matches could never influence earlier ones.
The results were humbling. An Elo-only model reached 50.35% accuracy. Calibrated XGBoost reached 51.13%.
Instead of hiding that small improvement, I built around it.
The system models outcomes, goals, first-half goals and corners as probability distributions rather than forcing a separate classifier for every question.
A final decision layer can also return skip when confidence is too low.
It selected only 26.4% of fixtures, but reached 69.7% precision on those matches.
The model became more useful when it stopped pretending every fixture deserved a prediction.

/ What I learned
The most valuable output from this project was not a high accuracy score.
It was learning when a model should stay quiet.
A system that always produces an answer can look more capable while actually being less trustworthy.
Calibration and abstention gave uncertainty a practical role in the application.
The project also reminded me that complexity does not guarantee much more signal. Thirty engineered features only narrowly beat a simple Elo baseline, and that uncomfortable result was worth keeping.