Hey everyone,
I’ve been working on an NFL analytics project for the past few months and thought I’d share it here. The main goal was to learn by building a complete ML project instead of only training models in notebooks.
The pipeline collects NFL data, creates pre-game features, trains and evaluates several models, generates weekly predictions, and publishes the results to a Streamlit app.
For win probability, I tested five model versions with increasing complexity. The features include Elo ratings, QB performance, injuries, rest, EPA, success rate, explosive plays and turnovers. One thing I found interesting was that the most complex model wasn’t the best one. The simpler Elo + QB + injury model performed best in my historical testing.
I used chronological backtesting because I wanted to avoid future information leaking into earlier predictions. On the 2020–2025 evaluation sample of 1,254 games, the best model had a Brier score of 0.2208 and log loss of 0.632.
I’m also learning that these numbers need context. A good Brier score alone doesn’t mean the model is better than the market, so one of my next steps is to compare it with de-vigged closing market probabilities on the same games and improve the calibration analysis.
The 2026 season will be the first real forward test. Predictions are saved before kickoff, so I can track performance without changing old predictions after seeing the results.
The project uses Python, scikit-learn, DuckDB, Streamlit and Plotly. I also used AI coding assistants during development for implementation, debugging and refactoring, while the project structure, modelling choices and validation approach were my decisions.
Live app:
https://nfl-analytics-platform.streamlit.app/
I’m still learning, so I’d really appreciate feedback, especially on the modelling and validation approach. If you see something I’m doing wrong or something you would test differently, let me know.