Inspiration

I wanted to build something that goes beyond box score stats and actually predicts something useful. Scouts and fantasy managers are always chasing the next breakout player, but most of what's out there just reports what already happened. I wanted a model that flags who's likely to take a leap before it shows up in the highlight reels.

What it does

NBA Breakout Predictor looks at a player's current season stats, things like usage rate, true shooting percentage and efficiency (PER) and predicts whether their PER is likely to jump significantly next season. It's not predicting points or rebounds. It's predicting a real efficiency leap, the kind of jump that turns a role player into a starter or a starter into an All Star candidate.
The dashboard has three parts. A leaderboard ranks the top breakout candidates for any season you pick. A player lookup tab lets you check any individual player and see their probability with a plain language explanation. A model insights tab shows exactly which stats the model weighs most heavily, so predictions aren't a black box.

How i built it

I pulled real historical player stat directly from the NBA's own stats API using nba_api python package, base and advanced stats across multiple seasons. For each player season, i labeled it a breakout if that same player's efficiency jumped a meaningful amount the following season, using only that season's stats as features so the never sees the future during training. I used the Random Forest Classifier model, split the data and then used the F1 score for the breakout class specifically, since accuracy alone is misleading when breakout are rare. I tuned class weighting and the decision threshold to better catch the minority class, since only 8 percent of the players seasons are actual breakouts. The whole project is wrapped in a streamlit dashboard so anyone, not just someone comfortable reading CSV, can explore the predictions.

Challenges we ran into

The biggest challenge was the class imbalance. Breakouts are genuinely rare, so early versions of the model barely caught any of them. I tried pulling nearly twenty seasons of extra historical data thinking more data would fix it, but it barely moved the needle. That taught me something more useful than a better score would have: the real bottleneck wasn't data volume, it was feature signal. A single season snapshot just doesn't capture things like coaching changes or a teammate's injury opening up more minutes, which are often what actually drives a real breakout. I ended up optimizing for recall over precision on purpose. For a tool meant to surface candidates worth watching, missing a real breakout is worse than flagging a few extra names a scout can filter out by eye.

Accomplishments that we're proud of

Getting a real, working prediction pipeline built end to end in under three days, using actual NBA API data instead of a static dataset, is the thing I'm most proud of. It's easy to fake a demo with hardcoded numbers. This one pulls live historical stats, trains a real classifier, and outputs predictions someone could genuinely use. I'm also proud of how I handled the class imbalance problem honestly instead of hiding it. Rather than reporting a misleadingly high accuracy number (which is easy to get when 92 percent of the data is "no breakout"), I focused on F1 and recall for the minority class and explained clearly why those numbers look the way they do. That felt like the more useful, more honest way to present the work. And the dashboard actually works. Filters, tabs, a leaderboard that updates by season, all built and running locally without anything breaking.

What we learned

That chasing a better metric isn't always the right move. I could have kept tuning indefinitely, but being honest about where the model's limits are, and explaining why, ended up being more valuable than squeezing out another percentage point.

What's next for NBA Breakout Predictor

The clearest next step is better features. Right now the model only sees one season at a time, so it misses trajectory, how a player has trended over the past two or three seasons, not just where they stand right now. Adding that would likely help more than anything else I tried this round. I'd also like to bring in context the box score doesn't capture: coaching changes, shifts in a team's offensive scheme, or a teammate's injury opening up minutes. These are often the real drivers behind a breakout season, and no amount of stat tuning replaces having that signal in the model. Longer term, I'd want to validate predictions against real outcomes as new seasons happen, turning this from a one-time model into something that gets checked and retrained every year. And extending the same approach to defensive metrics, since this version leans heavily on offensive efficiency, would make the tool useful for a wider range of players, not just scorers.

Built With

Share this project:

Updates

Submission history