🎯 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_store solo existían en train
  • Solución: Eliminación inmediata

3. Formato CSV europeo

  • Problema: 35,99 se 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: .gitignore excluyendo data/, 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

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

Built With

Share this project:

Updates