🎯 Inspiration
Nos inspiramos en el desafío de optimizar la cadena de suministro de moda, donde el equilibrio entre sobreproducción y escasez es crítico. Ver cómo Mango necesitaba predecir la demanda exacta de miles de productos nos motivó a crear un sistema que minimice tanto el exceso de stock (coste de almacenamiento) como las ventas perdidas (oportunidades perdidas). Queríamos demostrar que la simplicidad y la robustez superan a la complejidad cuando se trata de generalización.
🛍️ What it does
Ding Dong es un sistema de predicción de demanda para productos de moda que:
- Predice la cantidad exacta de producción necesaria para 2.250 productos de Mango
- Procesa 32 features clave: precio, distribución (tiendas × tallas), características temporales, colores, categorías y embeddings de imágenes
- Utiliza K-Fold Cross-Validation (5 folds) con LightGBM para generar predicciones robustas
- Minimiza tanto el exceso de stock como las ventas perdidas mediante un score compuesto
- Genera submissions automáticas y validaciones del modelo
- Score público alcanzado: 51.73/100 con un enfoque minimalista y generalizable ## 📊 Pipeline general
Data (95K registros)
⬇️
Feature Engineering (32 features)
- Label Encoding para categorías
- One-hot encoding para colores top
- Features temporales (mes, quarter, temporada)
- Features numéricas (
price_log,num_stores_log) - Embeddings similarity (k-NN en espacio de 512D)
- Interacción:
distribution_capacity
⬇️
K-Fold Cross-Validation (5 folds)
⬇️
LightGBM Ensemble (promedio de 5 modelos)
⬇️
Predicciones finales (2.250 productos)
🧰 Stack Tecnológico
- Python 3.11 + pandas, numpy, scikit-learn
- LightGBM para gradient boosting
- K-Fold para validación cruzada robusta
- Git para control de versiones
- Procesamiento de CSV con formato europeo (
;y,)
🚧 Challenges we ran into
1. Overfitting masivo (Score cayó de 51.73 → 47.40)
- Problema: Añadimos target encoding, RobustScaler y features complejas
- Solución: Volver a las 32 features básicas (“menos es más”)
2. Data leakage con features basadas en target
- Problema: Features como
demand_per_storesolo existían en train - Solución: Eliminación inmediata
3. Formato CSV europeo
- Problema:
35,99se leía como string - Solución:
pd.read_csv(delimiter=';', decimal=',')
4. Errores de indentación
- Solución: Corrección sistemática de todos los bloques de código
5. Archivos grandes en Git (544 MB)
- Solución:
.gitignoreexcluyendodata/,models/,outputs/
6. Balance entre velocidad y precisión
- Problema: 15 folds era muy lento
- Solución: Optimización a 5 folds (estándar)
🏆 Accomplishments that we're proud of
- Recuperamos 4.33 puntos después del overfitting (47.40 → 51.73)
- Implementamos K-Fold robusto con ensemble de múltiples modelos
- Pipeline reproducible:
deploy.py,validate.py,ensemble_submissions.py - Mejor comprensión del overfitting y aplicación de la navaja de Occam
- 32 features bien seleccionadas sin ruido
- Código limpio y documentado con Git
- Entrenamiento 3× más rápido al pasar de 15 a 5 folds
📚 What we learned
Técnicas
- El target encoding es muy peligroso si no se controla
- Normalización (RobustScaler) no siempre mejora (LightGBM es robusto)
- Más folds ≠ mejor: 5 folds es óptimo para ~10K muestras
- Embeddings de imágenes aportan información útil
Lecciones
- “Menos es más”: 32 features simples > 44 complejas
- Validación ≠ Test, sempre hi ha un gap
- Iteración rápida con cambios pequeños
- Git es esencial para revertir errores
- El formato CSV importa más de lo que parece
🚀 What's next for Ding Dong
Corto plazo
- Probar transformación logarítmica del target
- Optuna para búsqueda de hiperparámetros
- Explorar XGBoost, CatBoost y stacking
- Nuevas features:
- Interacción color × categoría
- Ciclo de vida del producto
- Embeddings de texto
- Interacción color × categoría
Medio plazo
- Modelos de series temporales con histórico semanal
- Modelos especializados por categoría
- Ensemble avanzado (weighted average por categoría)
- Interpretabilidad con SHAP values
Log in or sign up for Devpost to join the conversation.