Flight Price Intelligence
XGBoost + SerpAPI: compara el precio real de Google Flights con la predicción del modelo y emite una señal Compra ahora / Espera con % de confianza.
XGBoost MAE 2,088 INR · R² 0.97 — supera KNN y Regresión Lineal en la misma comparativa
Pipeline completo: Kaggle → Supabase → MLflow → FastAPI (Render) → Streamlit Cloud
Precio en tiempo real via SerpAPI (Google Flights) + señal BUY/WAIT accionable
Resumen ejecutivo
Contexto de negocio
Los precios de los vuelos cambian decenas de veces al día. Sin un punto de referencia, el viajero no sabe si el precio que ve es bueno o si conviene esperar. Se entrenó un modelo con 300k vuelos domésticos de India (Kaggle) para construir ese punto de referencia y convertirlo en una señal accionable.
Mi rol
Construí el pipeline completo: EDA en Supabase, feature engineering, tracking de 3 modelos en MLflow, exportación del mejor a joblib, FastAPI con endpoints /predict y /price_curve deployada en Render, y app Streamlit con tarjetas estilo Google Flights, gauge y curva de precios por anticipación.
Stakeholders
Sistemas y fuentes
Preguntas de negocio que responde
- ¿El precio actual está por encima o por debajo del precio esperado para esta ruta?
- ¿Cuánto conviene anticipar la compra en esta ruta? ¿7 días o 30?
- ¿Qué aerolínea ofrece mejor relación precio/predicción en este trayecto?
Tecnologías
Por qué este proyecto
Las herramientas existentes de precios de vuelos muestran gráficos históricos pero no dan una recomendación. Este proyecto cierra esa brecha: el modelo emite una señal directa COMPRA / ESPERA — no solo un gráfico.
Selección del modelo
| Modelo | MAE (INR) | R² |
|---|---|---|
| Linear Regression | 9,842 | 0.71 |
| KNN (k=10) | 4,201 | 0.88 |
| XGBoost | 2,088 | 0.97 |
XGBoost fue seleccionado porque el precio de los vuelos es intrínsecamente no-lineal: la misma ruta cuesta 3× más dependiendo de la aerolínea, la clase y la anticipación de compra. Los árboles en ensemble capturan estas interacciones sin cruces manuales de features.
Decisiones técnicas clave
Endpoint /price_curve server-side — en lugar de que Streamlit llame 10 veces a /predict para construir el gráfico de ventana de compra, un único GET genera todas las predicciones del lado de la API. Un round-trip en vez de diez.
days_until_flight como proxy de anticipación — el dataset no tiene fecha de compra, solo fecha de vuelo y fecha de scraping. La diferencia se usó como proxy para la anticipación de compra. Limitación documentada honestamente en el Model Card.
Banda de tolerancia del 5% en BUY/WAIT — precios dentro del ±5% de la predicción son BUY. La confianza escala con la distancia al precio predicho: min(|diff| / 30, 1.0).
Lo que aprendí
- MLflow rinde desde el primer experimento. Comparar 3 runs en paralelo — mismas features, mismo split — elimina toda subjetividad en la selección del modelo.
- El cold start en free tier es un problema de UX. Render Free se duerme por inactividad. Un timeout de 15s muestra un error; 45s con mensaje claro lo convierte en una demora conocida.
- La normalización de SerpAPI es inevitable. Google Flights devuelve ‘IndiGo’, el modelo fue entrenado con ‘Indigo’. Un mapa de normalización entre ambos mundos es obligatorio en el boundary de la API.
¿Qué te pareció este proyecto?
Si tienes preguntas sobre cómo lo hice o quieres charlar sobre datos, escríbeme.