How this works
Every win probability on this site comes from one rating system, tuned on old seasons and then left alone. This page explains where the numbers come from, how often they are right, and what they cannot see.
Every number starts with one rating
Each team carries a single number. Beat someone, it goes up; lose, it goes down. How far it moves depends on three things: how surprising the result was, how big the margin was, and whether you were at home.
That is the whole model. When the site says a team has a 68% chance to win, it is comparing two of those numbers and adjusting for who is hosting. Nothing else feeds in — no rankings, no reputation, no adjustment after the fact.
An average Division I team sits near 1500. Top 25 teams run 1800 and up. The best team in the country is usually around 2100.
Parameters and tuning
This is Elo, the rating system built for chess in the 1960s and since adapted widely in sport. Settings are tuned separately per gender by grid search on seasons through 2022, then scored once on held-out seasons 2023–2025. Men use a K-factor of 20.0 with an 89-point home-court advantage; women use 26.32 and 76 points.
The women's game has a wider spread of team strength, so home court is worth less there and ratings should move faster. Using one shared setting for both — which this site did previously — measurably hurt the women's predictions.
Between seasons every rating regresses 11% toward 1500, which keeps ratings from inflating over time and accounts for roster turnover. It is also what gives each team a sensible rating on opening night rather than a flat 1500. Live ratings update daily from ESPN results using the identical formula that processed 41 years of history.
How often we are right
Across the three seasons the model was never tuned on, it picked the winner in 71.3% of men's games and 75.7% of women's.
Those are close to the most anyone can do. We measured the ceiling — the accuracy a flawless rating system would reach — at roughly 73% and 78%. About eleven points of scoring margin per game is simply randomness, and no model of any size gets past it. We are about two points short of that limit, and the remaining gap is small and hard-won.
Treat any claim of dramatically better accuracy, ours or anyone else's, with suspicion.
Track record shows every locked prediction since, updated daily.
The back-test, and how the ceiling was estimated
| Games | Correct | Brier | Ceiling | |
|---|---|---|---|---|
| Men | 17,051 | 71.3% | 0.187 | ~73% |
| Women | 16,433 | 75.7% | 0.163 | ~78% |
Parameters were tuned on a validation slice inside 2022 and earlier, then scored once against the held-out seasons. Men and women are reported separately and never pooled — women's games are more predictable, so a combined figure would let the harder number hide behind the easier one.
The ceiling was estimated two independent ways: fitting team strengths on each season's own completed games (perfect hindsight), and decomposing scoring margins into team strength plus irreducible noise. Both agree to within 0.004 Brier. We publish it so our own numbers can be read in context, and so no future claim on this site can quietly exceed what is possible.
There is no post-hoc calibration layer. Elo probabilities turn out to be well calibrated on their own: over the back-test the average gap between predicted and actual win rates was about one percentage point, with a calibration slope of 0.96 for men and 1.00 for women. Nothing is nudged, compressed, or hand-corrected after the fact.
When the model does not know
If neither team is favoured above 55%, the game is labelled a tossup. A 54% pick is barely better than a coin flip, and dressing it up as a confident call would be misleading.
Tossups still get a pick, and they still count against us. They are not quietly excluded from the accuracy numbers — that would be an easy way to look better than we are.
Why there is no machine learning here
This site used to run a 43-feature ensemble and advertise 79.6% accuracy. That number was wrong. End-of-season ratings were being fed in as features for games played months earlier, so the model was partly reading the answer. It was also above the ceiling for men's college basketball, which should have been the giveaway.
Re-run properly — same games, same held-out seasons, every feature computed from what was known before tip-off — the 43-feature model lost to the plain rating it was built on top of.
So it was deleted. What is here now is smaller, faster, and measurably better. An honest baseline beats an impressive-sounding model that loses to it.
The numbers behind that
The ensemble scored a Brier of 0.212 against Elo's 0.187 for men, and 0.181 against 0.163 for women. The clearest single symptom: when the ensemble disagreed with Elo about who would win, it was right only 41% of the time. The extra features were not adding information — they were subtracting it, having learned patterns from leaked training data that do not hold in a real forecast.
What the model cannot see
- Injuries. A star sitting out does not move the number at all.
- Matchups and style. The rating knows who played whom and by how much, nothing about how the game is played.
- Coaching, momentum, travel, rivalry.
- Individual players. Everything operates at team level.
- Early-season form. Ratings start from last season regressed toward average and take a few weeks to sharpen.
Men's and women's ratings are separate pools and should only be compared within a gender — the women's numbers run higher, which reflects a different competitive shape, not a stronger field.
A metric we tested and did not ship
We compute an "upset vulnerability" score — a blend of margin volatility, luck, three-point reliance and free-throw shooting — and it was an obvious candidate to power Upset Watch.
It does not work. Tested against all 11,078 games of the 2026 season, the favourite's vulnerability score does not predict upsets at all: the most "vulnerable" quarter of teams lost at the same rate as the least (24.7% against 24.7%).
So Upset Watch is built on the one number here that has been checked against reality — the model's own win probability. Publishing the other one would have been inventing an analytic to fill a slot in a design.
The full breakdown
| Favourite's vulnerability | Actual upset rate |
|---|---|
| Lowest 25% | 0.247 |
| 2nd quartile | 0.237 |
| 3rd quartile | 0.210 |
| Highest 25% | 0.247 |
No monotonic relationship. The score is a composite of four hand-chosen coefficients that was never validated before it was displayed. It is no longer displayed anywhere: it survived for a while as an "Upset Risk" column, colour-coded red through green as though the colours meant something, which is the one presentation the measurement above rules out. A number that has been tested and failed does not get to keep a slot as a descriptive stat.
Where the data comes from
Historical results come from Kaggle's March Machine Learning Mania dataset, covering every Division I game since 1985. Live scores come from ESPN. Everything analytical in between — ratings, efficiency, schedule strength, conference metrics — is computed here.
Predictions are locked before tip-off and never edited in place. Once a game starts the pre-game number is frozen, which is what makes the track record worth anything.
One exception, and it is disclosed rather than smoothed over: after a change to the rating's parameters, a range of dates can be re-locked so the record reflects one model rather than two. Those rows were written after their games finished, so they are tagged individually and scored separately on the track record — where you can see they did not flatter the result.
The daily pipeline
A daily job fetches completed scores from ESPN, computes Elo updates with our own formula, then updates team records, conference strength, player stats and strength of schedule. It skips days with no basketball rather than running regardless.
Strength of schedule is the average Elo of every opponent faced. It is what separates 25-5 against a soft schedule from 25-5 against the field, and it feeds the power ratings and the compare page.
Conference strength uses four measures: average Elo (depth), non-conference win rate (the most telling, since it removes intra-conference cannibalisation), top-5 Elo (elite talent), and rating spread — the standard deviation of member Elo, where a lower number means a more evenly matched league. The site used to present that last one as “parity” while showing the spread itself, which names the opposite of what it measures.
What the rankings are ordered by
The number beside each team on the rankings — the Rating — is a blend, on a 0–100 scale. It is not a prediction and it does not feed one. Win probabilities come from Elo alone; this exists only to put teams in order.
Six ingredients, each converted to a percentile within the same competition before blending, so the men's and women's scales stay separate and comparable within themselves. A 99.3 means a team sat near the top of nearly every ingredient, not that it scored 99.3 of anything.
Being plain about the weakness: those six weights are our judgement, not fitted to anything. We tested the blend against its own ingredients and it does not clearly beat them — the numbers are below.
The ingredients, and how the blend actually performs
| Ingredient | Weight | What it carries |
|---|---|---|
| Adjusted efficiency margin | 35% | points per 100 possessions above average, adjusted for opponent |
| Elo | 25% | the full season's trajectory, and the only input to our predictions |
| Barthag | 15% | win expectancy against an average team |
| Strength of schedule | 15% | average Elo of opponents faced |
| Win percentage | 5% | results, lightly |
| Recent form | 5% | last-ten win rate |
Two of those overlap on purpose and one is arguably counted twice. Barthag is derived from the same efficiency numbers as the margin, and schedule strength is already inside an opponent-adjusted figure before it is added again on its own. That is a fair criticism of the recipe.
So we checked it the same way we check everything: across every 2025–26 game where both teams carry the figure — about 5,570 men's and 5,500 women's — how often did the higher-rated team win?
| Men | Women | |
|---|---|---|
| Rating (the blend) | 75.3% | 80.8% |
| Adjusted efficiency alone | 74.1% | 80.5% |
| Barthag alone | 74.1% | 80.5% |
| Elo alone | 74.4% | 80.0% |
The blend edges its own ingredients — by about a point for the men and a third of a point for the women. That is a weaker result than it looks. Every rating here is built from these same games, so this measures how well each one describes the season it was fitted to, not how well it would predict a new one; and margins that size, over a single season, are not much to stand on. The double-counting criticism above stands regardless.
So it still earns its place on a practical ground rather than on accuracy: efficiency needs box scores, which fifteen men's teams and six women's teams do not have, and a national ranking that cannot rank everybody is not a national ranking.
If that trade ever stops being worth it, the honest move is to rank on adjusted efficiency and mark the unrated teams — not to keep a blend because it is already built.
Beyond the rating
Power rankings carry opponent-adjusted efficiency alongside Elo. These follow established public methods rather than anything invented here — adjusted efficiency in the manner popularised by Ken Pomeroy, and a Pythagorean win expectation in the manner of T-Rank. They describe teams; they do not drive the win probabilities.
What each metric means
- Adjusted efficiency (AdjOE / AdjDE / AdjEM): points per 100 possessions, iteratively adjusted for opponent strength, with a home-court correction of about 3.5 efficiency points so venue does not flatter anyone. AdjEM is the single best descriptor of team quality.
- Barthag: win probability against an average D1 team on a neutral floor, from a Pythagorean formula on adjusted efficiency. More intuitive than raw Elo — 0.95 means a 95% chance of beating a league-average opponent, which is not the same as outranking 95% of the field.
- Luck: actual win percentage minus Pythagorean expectation. Positive means winning more close games than the margins justify, which tends to regress.
- Floor and ceiling: the 10th and 90th percentile of game-by-game net efficiency, showing the range of outcomes rather than the average.
- True shooting: PTS / (2 × (FGA + 0.44 × FTA)) — twos, threes and free throws in one number.
- Also tracked: three-point attempt rate, assist-to-turnover ratio, defensive rebound percentage, steal and block rates, close-game record, and margin consistency.
Ask Madness
The chat assistant is Claude with direct access to this database. It looks things up rather than recalling them, and its answers are checked against those lookups before you see them. That matters more than the model behind it: an assistant is only as good as the context it is given, and a tool that returns something plausible but wrong poisons everything downstream.
What it can look up, and what it is stopped from saying
Asking it not to invent things was not enough. Handed a team whose name it could not match, it correctly reported that it could not find the team and then analysed it anyway — describing a below-average side as a tournament bubble team and converting a 76% win probability into a "24-point spread", on a site that publishes no spreads at all.
So the rules are enforced in code rather than requested in the prompt. Every answer is checked before it is sent: win probabilities must match a figure a tool actually returned, point spreads and betting language are refused outright, and so is any claim about tournament selection or seeding, which nothing here models. A rejected answer is retried once with the specific objection; if it fails again the assistant says it cannot answer rather than guessing.
It is also told the date. Without one it read a finished 35-3 season as current form and called the team "peaking at the right time" in the middle of August — every number correct, the tense four months wrong. It now knows today, which season the site is showing, whether that season has finished, and when the next games are scheduled.
- Team lookup — Elo, record, conference, stats, momentum, coach, strength of schedule
- Matchup prediction — win probability and stat comparison for any two teams
- Conference analysis — strength metrics and the teams inside each league
- Rankings — top teams by Elo, filterable by conference
- Live scores — today's games and results
- Upset candidates — games where the underdog has real win probability
- Team roster — the squad with per-player points, rebounds, assists, minutes and shooting splits (current season only)
- Bracket builder — fills a full tournament bracket on request
The bracket
Four ways to fill one out: your own picks, the model's chalk, a version from Ask Madness that takes calculated upsets, and a consensus of the last two. The model and Ask Madness brackets are generated once after Selection Sunday and locked.
How each one is built
- My Bracket — your picks, saved in this browser and kept to your account if you sign in. As you fill it in it shows how many of your picks agree with the model, how many underdogs you have taken, and the longest odds you have backed.
- Model Bracket — every game to the favourite, no exceptions.
- Ask Madness Bracket — considers an upset wherever the underdog is at 35% or better, and takes it about three times in ten, so it does not simply invert every close game.
- Consensus — where the two agree, high confidence; where they split, the model's probability breaks the tie. Agreement usually runs 70–80%.
Both tournaments, same depth
The women's game gets the same model, the same metrics and the same pages as the men's — not a reduced version. Ratings are tuned separately because the two sports genuinely differ, which is the point: treating them as one would make the women's predictions worse, and it did.
Built by Richard Pallangyo for the Kaggle March ML Mania 2026 competition. Questions about methodology? Ask Madness can explain. See also: Terms & Disclaimers.