Deep learning para predecir precio de productos de supermercado
Actualización: nueva versión web disponible aquí. La versión web utiliza TensorFlow.js y el modelo entrenado con TensorFlow. Su código también lo he subido a github.
A continuación crearemos una red neuronal paso a paso con TensorFlow 2 y Keras, con el objetivo de entrenarla con información de productos de supermercado y poder así predecir precios de productos desconocidos.
La idea surge como curiosidad para contestar a esto: sabiendo cuánto vale el hummus y cuánto vale el chocolate en un supermercado, ¿Cuánto valdría el hummus de chocolate? ¿Cómo de buena puede ser una predicción del precio de productos no conocidos por la red neuronal?
Los datos iniciales no son todo lo buenos que nos gustaría, al contar solo para el entrenamiento con solo esta info de cada producto:
- Nombre del producto.
- Precio.
- Tipo de envase.
- Medida (en kilogramos, metros, litros o unidades).
- Si es agua o no.
- Si es para +18 años.
No se tiene info de los ingredientes de los productos (más allá de los que puedan aparecer en el nombre del producto), ni del proceso de fabricación, ni lugar de procedencia… a priori podemos pensar que no vamos a conseguir buenos resultados…
Ejemplo de resultados obtenidos para productos que no existen:
- hummus de chocolate, tarrina 240gr, 1.95 euros
- hummus de chocolate hacendado, tarrina 240gr, 1.52 euros
- hummus de chocolate nestlé, tarrina 240gr, 2.27 euros
Hacendado el más barato sin bajar la calidad (:
Durante la fase de entrenamiento se llega a un error absoluto medio (Mae) de 0.10 € y a un error de 0.60 € en la fase de test. Hay un overfitting pendiente de resolver (ver apartado siguiente).
Disclaimer y trabajo futuro
Es la primera red neuronal que hago, seguro que hay muchas cosas que se pueden mejorar y seguiré aprendiendo.
La base de datos de productos utilizada para el entrenamiento es de 2018 y se ha obtenido de internet. Contiene 6.000 productos aproximadamente.
Trabajo futuro (ToDo):
- Evitar el overfitting de la versión actual.
- Reducir el error obtenido durante la fase de test.
- Comparar resultados eliminando los productos anómalos que se «salen» de las gráficas de distribución (palillos en cajas de 800, jamón de 300 euros, etc…)
- Comparar resultados normalizando / no normalizando los datos de entrada.
- Comparar resultados preprocesando los nombres de los productos (ideas: quitar números, quitar palabras «de», «la», «el»…).
- Hacer pruebas con diferentes meta parámetros de la red neuronal.
- Aplicar Data augmentation, para crear productos derivados en el set de entrenamiento (ejemplo: crear productos «pack» con mayor peso y mayor precio).
- Tener en cuenta la semántica de las palabras del nombre del producto. Ahora mismo por ejemplo ‘casera’ y ‘caseras’ son 2 palabras diferentes en la codificación one-hot encoding que he usado. Idea: utilizar técnica word embedding con una red preentrenada que conozca semántica de las palabras.
He publicado el código fuente del cuaderno en github. Puedes importarlo en Google Colab.