The next game
Right now one of my six models, Logistic argmax, expects me to play
Lulu next, at 20% confidence.
Across 429 scored games it has been right 34% of the time, against 27% for the baseline (decay frequency), which just counts what I've played lately. That lead is bigger than luck would explain (McNemar p = 0.001).
See how all six scoredThe short version
I wanted to know whether I could predict my own League of Legends games. The Prediction page keeps score, including the models that lose.
Every ranked game I play comes off the Riot API into Snowflake overnight, and six models take a guess at what I'll play next. Each is scored walk-forward, trained only on games that happened before the one it's predicting. Each accuracy figure comes with a 95% confidence interval, and every model is tested against a baseline that does no learning at all, to check its lead isn't luck. On a few hundred games, that baseline is hard to beat.
It runs itself on a nightly cron and serves from cache, so browsing never touches the warehouse. Under $10 a month.
Prediction is the part I'm proudest of: each model's next pick, and its record so far. Statistics covers win rates, and which friends I win more with. Playstyle measures seven axes of how I play, compared with other players at my rank.
Data pipeline
Riot Match-V5 API
Pulls any games I haven't downloaded yet.
Ingest
~90 stats for each of the ten players; a match saves completely or not at all.
Snowflake warehouse
Holds every match, and what the pipeline has already done.
New-game gate
Models rerun only after a new ranked game.
Walk-forward models
Six guesses at my next champion, trained only on earlier games.
Publish
Picks and scores written back to Snowflake for the site to read.
This website
Serves cached results; browsing never hits the warehouse.
Why once a night
New data only arrives when I finish a ranked game, so running more often would mostly wake the warehouse to find nothing new. The cron is best effort, so a run can be delayed or skipped. The "last ran" time at the top of the page is how you'd know.
Stack
| Layer | Choice |
|---|---|
| Warehouse | Snowflake, key-pair authenticated |
| Pipeline | Python, scheduled on GitHub Actions (requests, pandas, scikit-learn, XGBoost) |
| Website | Flask + gunicorn |
| Deployment | Docker container (slim Python base, non-root), deployed on Render |
| Assets | Champion art pre-fetched from Data Dragon, served as static files |
| AI summaries | Claude API, called on demand and rate-limited per visitor |