How the predictions work

A logistic regression on each fighter's UFC record and fight stats, tested on fights it never saw.

How well it does

The model learned from UFC fights from 2010 until January 2024 (each fighter's history still goes back to UFC 1) and then asked to pick the 1,300 fights from Jan 2024 to Jul 2026, using only what was known the day before each one.

MethodPicks the winnerLog loss
This model64.6%0.633
The model before fight stats (record, Elo, and finishing)59.8%0.665
Whoever has the better UFC win rate60.2%–
Whoever has the higher Elo rating58.2%0.676
Coin flip50.0%0.693

Adding each fighter's striking and grappling history, and learning only from fights since 2010, made the difference. The model picks +4.8 percentage points more winners than it did before (95% interval +1.9 to +7.5), and +4.4 points more than simply backing the fighter with the better record (+1.4 to +7.4). Both gains are bigger than chance could produce on this many fights.

Log loss rewards being confident when right and punishes being confident when wrong (lower is better). The percentages are a little cautious: the favorite wins somewhat more often than the model says.

Favorite given 50–60%
said 55%
won 57%
609 fights
Favorite given 60–70%
said 64%
won 67%
450 fights
Favorite given 70–80%
said 74%
won 77%
204 fights
Favorite given 80–100%
said 83%
won 86%
37 fights

What goes into a prediction

Everything comes from the two fighters' UFC fights before the one being predicted:

  • Elo rating: a rating that rises with wins and falls with losses, by more when the result is an upset.
  • Record and form: UFC win rate, the last three results, and the current win or losing streak.
  • Finishing: knockouts and submissions per fight, and how often the fighter has been finished.
  • Striking: significant strikes landed and absorbed per minute, striking accuracy and defense, and knockdowns per 15 minutes.
  • Grappling: takedowns per 15 minutes, takedown accuracy and defense, time spent in control minus time controlled, and submission attempts.
  • Age on the day of the fight. Other things equal, the younger fighter is favored.
  • UFC experience: number of UFC fights. Once record is accounted for, more fights counts slightly against a fighter, probably because long careers mean older fighters.
  • Time since last fight. A longer gap counts slightly in a fighter's favor, probably because fighters on a quick turnaround are often short-notice replacements.

The striking and grappling numbers are built fight by fight from a public export of ufcstats.com's per-fight stats, so each prediction only sees the fights that came before it. A fighter with little UFC fight time is pulled toward the league average until there's enough to go on, and fighters making their UFC debut are treated as average. Dream fights use each fighter as of their last UFC fight.

Three kinds of model

A gradient-boosted tree model and a small neural network were given the same fights and the same choices of features and training years, and chosen and tested the same way:

ModelPicks the winnerLog loss
Logistic regression64.6%0.633
Gradient boosting63.8%0.641
Neural network63.8%0.636

On log loss, both were clearly worse than the logistic regression. Neither did better, so the site uses the logistic regression, whose reasons for each pick can be shown exactly. With a few thousand fights to learn from, the extra flexibility probably has too little to work with.

What was tried and left out

  • Learning from fights before 2010 made predictions worse on the years held out for choosing the model, probably because the sport has changed so much since its early days. Those fights still count toward each fighter's record, Elo rating, and stats.
  • Height, reach, and stance made predictions worse on the years held out for choosing the model. Many reaches are missing from the data.
  • Matchup terms, one fighter's striking or takedowns against the other's defense, didn't help either, probably because the individual stats already carry most of that information.
  • UFC.com's career stats, such as strikes landed per minute, are current totals that include the very fights being predicted, so using them would leak the results. The model rebuilds them fight by fight instead.
  • Betting odds aren't used. Odds reflect things no record shows, like injuries and short-notice replacements, so a bookmaker's favorite is still a stronger pick than this model's.

Cleaning the data first

The first version of the model picked 71% of winners, which was too good to be true. Duplicates in the data were leaking results:

  • The API lists most recent events twice under different addresses (for example "UFC 322" and "UFC 322: Della Maddalena vs. Makhachev"), so a fight's own result showed up in the history used to predict its twin. The scraper now marks these, and the site and model skip them.
  • Some fights appear twice on one card, or on an unrelated later card. These are marked the same way.

The API also lists the loser first in almost every fight, which a model could learn instead of anything real, so each fight is used both ways round in training.

Trained on 7,342 fights (2010-01-01 to 2026-07-18). Elo K-factor 128.