v2 March Madness Model: 🤖 You Can't Spell "Champion" without AI! 🤖
Another year, another (improved) March Madness AI bracket model! I'm building an AI model again (while using AI to help build it) to help me fill out my bracket.
From year 1 to (now) year 6 of my journey in creating bracket models, I have advanced from building super simple logistic regression models to more technically complex ensemble models for predictions - encompassing architectures from XGBoost to Neural Networks. This year brings 2 new additions to my approach: putting my ensemble of models to work by simulating the bracket 10,000 times, as well as creating a Women's March Madness model (which I hope to submit alongside my Men's predictions for Kaggle's annual March Madness Learning Mania competition).
Combining my love of basketball with data science excites me, & this year I focused on improving existing data science functionality from my existing models rather than building from scratch. As mentioned in my post last year, my yearly predictions have tended to be good overall but a mixed bag of results. I'm 1/5 on champions so far, & although last year I correctly predicted the entire Final Four, my champion was incorrect (I won't hold a grudge against Johni Broome & the Auburn Tigers for the rest of my life, but I also won't not 😉).
🚧 Building the Model 🚧
The Kaggle open-source March Madness dataset (1984-2026 men's & women's) has so much rich data - from regular season box scores, to conference tournament outcomes, to advanced ranking statistics like KenPom. For the men's model, I focused on training on data since 2003 (since these advanced ranking metrics tend to by far be the best predictors of a team's probability of making the Elite Eight as shown below). I learned in this process that there are fewer advanced rankings like KenPom for women's college basketball, so for that model I focused more so on box score & simpler ratings metrics like Simple Rating System (SRS) & Strength of Schedule (SOS).
[[IMAGE: feature importance chart — KenPom, possessions per minute, NetRtg_last10]]Stats like KenPom (POM), total possessions per minute, & NetRtg_last10 are some of the most predictive features for the NCAAM ensemble model.
Similarly to my prior years' model methodologies, I am predicting a team's likelihood to make the Elite Eight; that way, I have more examples of 'winning teams' in my dataset (even after utilizing SMOTE oversampling to synthetically create more of the positive class I saw some wonky results when trying to specifically predict the champion such as VCU winning their region - that would surprise me but if it happens you heard it here first!)
Post predictions, I am simply comparing a team's predicted probability vs its bracketed opponent each game, selecting the higher probability team until crowning a champion. In turn, this is not truly predicting game-by-game outcomes inherently - this allows for a simpler & more interpretable way to implement & validate my results (while also working with a simpler training set aggregation that I can then easily apply to each year's brackets).
From a data science perspective, the most exciting part of this year's improvements involved creating 10,000 simulated predictions rather than taking my model's outcomes on their own. Rather than creating a more classical Monte Carlo simulation here, I experimented with using my ensemble of models & randomly weighting them in order to simulate tournament outcomes (called Bayesian Model Averaging). Essentially, in each simulation I applied random weights across each of my 4 "best" models (XGBoost, Random Forest, Logistic Regression, & Neural Network) to replicate the stochastic nature of a basketball game. See the below image diagramming an example across 10,000 trials.
[[IMAGE: Bayesian Model Averaging trial simulation diagram]]Predictions from each model stay the same while the random weights per trial change. The end result ideally is a more stable output for teams' estimated probabilities of making the Elite Eight!
I like this methodology because it can draw from the added stability of multiple models for making less volatile predictions (in a work setting, I usually err towards focusing on just using simpler models when they perform similarly well to more complex/involved approaches - but the single XGBoost model for instance also produced some volatile results that did not pass my own eye test for the time being). Furthermore, this Bayesian weighting approach can simulate the random nature of basketball games & attempt to come up with a more hardened prediction that is not reliant on a single trial prediction. I had never tried using Bayesian Model Averaging & had a lot of fun doing so - it was cool to see that this approach is also supported by relevant scholarly research!
🏀 Predictions 🏀
Men's Bracket Model
Similar to last year, I am predicting a chalky bracket overall (especially in early rounds). Many have said that it feels like a very top-heavy tournament. However, amongst some of the top seeds I have some fun upsets predicted:
Elite 8 (percents indicate amount of times in the simulation the said team makes Elite 8):
- West: #1 Arizona (72%) over #2 Purdue (54%) - my model predicted these teams as the top 2 in the entire bracket as shown in the below simulations bar chart, so this could be a really fun one to watch! 🔥
- East: #2 UConn (54%) over #1 Duke (45%) - a big upset given that Duke is the number 1 team by KenPom NetRating (& top ranked team overall) this season! 😳
- South: #2 Houston (43%) over #4 Nebraska (42%) - my model loves Nebraska, & them beating the reigning champion in Florida in the Sweet Sixteen would be an exciting outcome to get us here, especially since the model projects them as a tossup essentially against Houston too 😲
- Midwest: #1 Michigan (52%) over #2 Iowa State (51%) - the only upset in this region really is Tennessee making the Sweet Sixteen 🥱
Final 4: #1 Arizona over #1 Michigan, & #2 UConn over #2 Houston
Championship: #1 Arizona takes it home (first West coast team to win since Arizona in '97) over #2 UConn!
[[IMAGE: bracket region difficulty simulation chart]]My simulations project the West as the toughest quadrant (with Arizona being the best team overall), the Midwest being difficult with 2 top 5 teams, & the East potentially being the easiest given Duke (7th) being the best contender for UConn (3rd).
Potential upsets (percents indicate extrapolated projected odds to win given matchup):
- Round of 64: #10 Missouri (68%) over #7 Miami FL (32%) - is 10 over a 7 even an "upset" though?
- Round of 64: #11 VCU (25%) over #6 North Carolina (75%) - although 25% seems low, this is the highest probability in my bracket for an 11+ seed winning; with Caleb Wilson being out for the year for North Carolina too this seems especially more feasible
- Round of 64: #11 USF (20%) over #6 Louisville (80%) - similarly, Mikel Brown Jr. being out for the season on top of this being the 2nd most likely 11+ seed upset in the Round of 64 makes this an intriguing prediction
- Round of 32: #6
Comments
Post a Comment