March Madness 2026 Prediction Model
Ensemble of 10 two-layer MLPs that predict NCAA tournament game outcomes.
Model Details
- Architecture: 10 sub-networks, each
Linear(122, 128) -> BN -> ReLU -> Dropout -> Linear(128, 1) -> Sigmoid, averaged at inference - Input: 122-dimensional difference vector (team_a_features - team_b_features)
- Output: P(team_a wins) in [0, 1]
- Training: 750 tournament games (2011-2023), with data augmentation (both game orientations)
- Validation: 63 games (2024 tournament), LogLoss = 0.297
- Test: 63 games (2025 tournament), LogLoss ~0.36
- Calibration: Platt scaling applied post-hoc
Features
122 difference-encoded features from team-level aggregated player statistics:
- Tournament seed, wins, losses, SOS, SRS
- Per-game stats (pts, reb, ast, stl, blk, tov) x 4 aggregations (mean, max, std, weighted-mean)
- Shooting percentages (FG%, 3P%, FT%, eFG%, TS%)
- Advanced metrics (PER, BPM, Win Shares, Usage Rate)
Usage
import torch
from model import MLP # or define MLP class as below
checkpoint = torch.load("best_model.pt", map_location="cpu", weights_only=False)
model = MLP(input_dim=122)
model.load_state_dict(checkpoint["model_state_dict"])
model.eval()
# Predict: features = team_a - team_b (normalized)
x = torch.randn(1, 122) # replace with real features
prob = model(x).item() # P(team_a wins)
Demo
Try the interactive bracket predictor: March Madness 2026 Space
Training Data
Player statistics from sports-reference.com/cbb for 68 tournament teams per season, 2011-2025.