Sports Performance Engine: predecir fútbol con datos StatsBomb y un ensemble LightGBM+XGBoost
El fútbol es ruidoso: gana el peor equipo más de lo que la gente cree. Con datos StatsBomb, features rolling y un ensemble LightGBM+XGBoost validado con TimeSeriesSplit, modelé rendimiento y resultados con explicabilidad SHAP.
El fútbol es uno de los deportes más difíciles de predecir: tiene pocos goles, mucho azar y un equipo inferior gana con sorprendente frecuencia. Eso lo convierte en un banco de pruebas honesto para el machine learning, porque no puedes esconderte detrás de métricas infladas.
Los datos: StatsBomb
Usé los datos abiertos de StatsBomb (vía statsbombpy), que van mucho más allá del marcador: eventos por partido, posición de cada acción, expected goals (xG), presiones, pases progresivos. Cuando faltaban datos, completé con un generador sintético calibrado de partidos de LaLiga y Champions, hasta unos 3.200 partidos analizados.
Feature engineering: el corazón del proyecto
El modelo no mira un partido aislado, sino la forma reciente de cada equipo. Construí features rolling: medias móviles de xG a favor y en contra, de presiones, de rendimiento, en ventanas de los últimos N partidos. Esto captura "este equipo llega en racha" sin que el modelo haga trampa mirando el futuro.
Validación: TimeSeriesSplit, no K-Fold
Este es el error más común en ML deportivo y financiero: usar validación cruzada aleatoria. Si entrenas con partidos de mayo y validas con partidos de enero, estás filtrando el futuro. Usé TimeSeriesSplit (división temporal 70/15/15), de modo que el modelo siempre se evalúa sobre partidos posteriores a los de entrenamiento.
El modelo: ensemble + Optuna
Combiné LightGBM y XGBoost en un ensemble —dos implementaciones de gradient boosting con sesgos ligeramente distintos cuyas predicciones promediadas generalizan mejor— con hiperparámetros buscados por Optuna (30+25 trials).
Resultados
- AUC-ROC: 0.71 — un número modesto en apariencia, pero realista para fútbol; desconfía de cualquiera que te prometa 0.95 prediciendo resultados de fútbol.
- 3.200 partidos analizados, 25+ features.
- Explicabilidad SHAP por predicción.
Qué aprendí
Que un AUC de 0.71 honesto vale más que un 0.95 fruto de fugas de datos. La integridad de la validación temporal es lo que separa un modelo que funciona en producción de uno que solo brilla en el notebook.
Sobre este proyecto
Sports Performance Engine
Motor de análisis de rendimiento deportivo con LightGBM + XGBoost sobre datos StatsBomb. Predice resultados LaLiga y Champions, calcula xG, presiones e índice de rendimiento con SH...