Fig. 3 — enlarged from sheet 01

Bracket Oracle

Complete

Predicts the NCAA tournament: two models blended by accuracy, graph centrality as a feature, and 50,000 simulated brackets with an upset dial.

Year2026
StackReact · ML · Monte Carlo
Source github.com/mattkindy/bracket-oracle

What it does

Bracket Oracle predicts every matchup in the NCAA tournament and turns those probabilities into title odds by simulating the full bracket, all 63 games, fifty thousand times. A 3-seed’s championship number accounts for who they might actually face, including the 12-seed that upset their expected opponent.

Two models make the predictions. A linear model reads matchup differences (efficiency, tempo clash, rebounding, schedule strength). A small neural network catches interactions the linear model can’t express. Their outputs blend by inverse Brier score, so the more accurate model gets more weight.

The parts I’d keep

The model receives the historical win rate for each seed pairing as an input, so it learns when to adjust a strong prior rather than rediscovering that 1-seeds win. A graph of win probabilities over the whole field feeds PageRank and betweenness centrality in as features, measuring how central a team is to the bracket’s hierarchy. And an upset dial rescales every probability and re-runs the simulations without retraining, for exploring chaotic years against chalk years.

Validation

Each of the six tournaments took a turn as the holdout while the other five trained the models. The ensemble beat the seed baseline every year, by a little. Most of the gain came from the 5-12 and 6-11 games, where the seed history is close to a coin flip. Only one training year had measured team stats; for the others I built stand-ins from seed averages plus noise. More years of measured stats would improve this more than any change to the models.