A race predictor that says “Verstappen, 41%” and nothing else asks you to take it on faith. I built BoxBox so that every number comes with a reason you can read.
Validated race by race
BoxBox runs an XGBoost model that gives each driver a win chance and a podium chance. I validate it race by race, because a season is a sequence and the model should be judged the way it will be used: on the next race, not on a random shuffle of the past.
Retrained after every Grand Prix
Formula 1 changes during the year. Teams bring upgrades and a car that was slow in March can be fast by August. After each Grand Prix the model trains again with the new result, so the next prediction starts from where the grid is now.
A breakdown of why
Each prediction comes with a SHAP breakdown, which shows how much every input pushed a driver’s chance up or down. Grid position, weather and recent form each get their share, and you can see it.
The stack
Python and XGBoost for the model, FastAPI to serve it, PostgreSQL for the data and a bilingual Next.js dashboard on top. You pick a Grand Prix, set the grid and the weather, and the numbers update.
You can try it at boxbox.ocobosoftware.dev.