Footy Preds

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.

← Back to predictions

DATA: DIXON-COLES · ML CLASSIFIER · LOCAL/CLOUD LLM · LIVE ODDS