How Footy Preds Works
Footy Preds runs three genuinely different approaches to predicting Premier League matches
side by side, then checks all of them against live betting market odds. Here's what each one
actually does, in plain language.
Dixon-Coles (statistical model)
A statistical model, not a machine-learning one -- it fits two numbers per team from
five seasons of real results: an attack strength and a defense strength.
A team like Man City ends up with high attack, strong (very negative) defense; a struggling
side ends up the other way round.
Goals are assumed to follow a Poisson distribution -- the standard way to model
"how many of something happens in a fixed window" when events are roughly independent.
Each fixture gets an expected-goals number for each side:
λ_home = exp(attack_home − defense_away + home_advantage)
λ_away = exp(attack_away − defense_home)
The exp() just keeps the result positive (goals can't be negative) and
home_advantage is one extra fitted number shared by every team, capturing the
well-known edge of playing at home.
From λ_home and λ_away, the model builds a full grid of probabilities for
every plausible scoreline (0–0, 1–0, 2–1, and so on), using the Poisson
formula for each side independently, with a small correlation correction for low-scoring
outcomes (the actual "Dixon-Coles adjustment" the model is named after). Summing the right
cells of that grid gives home win / draw / away win probabilities, and the same grid gives
goals-scored distributions and over/under probabilities for any goals line. This is the
only model here that reasons about goals directly rather than just win/draw/loss.
ML Classifier (gradient-boosted trees)
A gradient-boosted decision tree ensemble (scikit-learn's
GradientBoostingClassifier) -- rather than fitting one clean equation like
Dixon-Coles, it builds around 100 small decision trees one after another, where each new
tree focuses on correcting whatever mistakes the trees before it were still making.
It never sees raw goals or scorelines. Instead it's trained on a wider table of features
built for every historical fixture back to 2021-22: each team's recent form (points,
goals, results over their last 5 matches), previous season's finish (final league
position, points, goal difference), and underlying player performance (expected
goals, expected assists, ICT index, creativity, threat, aggregated from individual players
up to team level). Around 1,900 historical fixtures went into training it. Unlike
Dixon-Coles, it has no built-in concept of "goals" or "home advantage" -- if those patterns
matter, it has to discover them itself from the data, which is also why it doesn't produce
a goals distribution or over/under predictions.
LLMs (local & cloud AI models)
Fundamentally different from the other two -- no fitting, no training data specific to
this project, no features. Each fixture just gets turned into a plain-language question sent
to a language model (run locally via Ollama, or via the Claude/ChatGPT APIs), which answers
directly from whatever it already knows about football.
There's no scoreline reasoning, no team-strength numbers -- just the model's own internal
sense of "how good is this team compared to the other one" translated into three
probabilities. It has whatever football knowledge existed in its training data and, unless
given a web-search tool, nothing about the current season's actual form, injuries, or
transfers. Useful as a rough "does this match common football knowledge" sanity check
against the statistical models -- not a calibrated prediction in the way Dixon-Coles or the
ML classifier are.
Comparing against the betting market
Every prediction gets checked against real bookmaker odds, pulled from multiple UK
bookmakers and updated regularly. Two things matter here:
- The odds shown are genuine, as-quoted prices -- including the bookmaker's
built-in margin (the "overround"), not a theoretical fair price. That's deliberate: it's
what you'd actually be offered, not an academic exercise.
- Edge is still calculated as a probability difference, not an odds difference --
model probability minus that bookmaker's own overround-removed fair probability. Real
bookmaker odds are always a little shorter than any fair price purely because of the
margin, so comparing raw odds directly would mostly just measure the size of that margin
rather than genuine disagreement between the model and the market.
A big edge doesn't automatically mean the model is right and the market is wrong --
bookmaker prices reflect enormous collective betting activity and are generally very
well-calibrated. Treat disagreement as a flag worth a closer look, not a certainty.
Data sources
Nothing here is scraped or guessed -- every number traces back to a real public source:
← Back to predictions