Motores de Recomendación con Python (parte 1).

<  VOLVER
Por: Datahack
junio 8, 2022
Datahack
junio 8, 2022

Lee la parte 2 aquí.

Las recomendaciones tienen una influencia muy importante en muchas de las decisiones que tomamos en el día a día. Algunos ejemplos de recomendaciones directas podrían ser las que nos dan nuestros amigos sobre los restaurantes a los que han ido el fin de semana o la recomendación de un determinado modelo de teléfono basada en los comentarios de una web.

Graphical user interface, website

Description automatically generated
Figura 1. Motor de recomendación de Disney+.

Otras recomendaciones más indirectas podrían ser las que lanza Disney+ sobre las películas o programas que pueden ser más afines a nuestros gustos, o las propuestas de items que hace Amazon en relación al producto que estás comprando actualmente.

En este y en los próximos posts vamos a hablar sobre la ciencia detrás de estos motores y cómo construirlos de forma sencilla usando Python.

1. Introducción a los motores de recomendación

¿Qué son los motores de recomendación?


Los motores de recomendación son herramientas que usan el feedback de los usuarios para encontrar nuevos elementos que puedan ser afines a estos usuarios u otros, asumiendo que los usuarios con preferencias similares en el pasado probablemente tendrán las mismas preferencias en el futuro.

Estos métodos de recomendación se benefician de multiples emparejamientos entre los usuarios que dan su opinión y los elementos sobre los que opininan. De este modo, se proporcionarán mejores recomendaciones de un producto cuanto mayor sea el feedback recibido sobre el mismo. También se darán recomendaciones más personalizadas a aquellos usuarios que hayan dado más opiniones.

¿Cuándo es interesante usar los motores de recomendación?

Los motores de recomendación pretenden resolver un problema específico de Machine Learning: sugerencia de productos, servicios, entidades a un usuario en base a sus opiniones y de otros usuarios. 

Lo que es importante tener claro si vamos a diseñar un motor de recomendación es que los datos son registros de preferencias de diferentes usuarios. En función de cómo se miden estas preferencias los datos se clasifican en implícitos y explícitos. Los datos explícitos contienen feedback directo de un usuario como por ejemplo su opinión sobre un producto expresada en forma de puntuación (por ejemplo: el número de estrellas con el que puntuamos un producto en Amazon). Por contra, los datos implícitos sacan información de las acciones del usuario para resumir sus preferencias (por ejemplo: histórico de reproducciones en Spotify, que te puede permitir identificar los estilos de música preferidos por ese usuario).

2. Recomendaciones basadas en contenido

Las recomendaciones pueden realizarse basadas en la opinión general. Sin embargo, este tipo de recomendaciones no son personalizadas. En este post os vamos a enseñar distintos modelos para hacer recomendaciones a un usuario basándonos en la similitud de unos items con otros que le gustaron al usuario en el pasado. Es decir, si al usuario en cuestión le gustó la película A, y mi modelo determina que las películas A y B son similares, entonces es bastante probable que al usuario le guste la película B también. En este post os mostraremos como determinar qué items son similares. Estas recomendaciones que se llevan a cabo encontrando elementos con atributos similares se denominan recomendaciones basadas en contenido.

Figura 2. Recomendaciones basadas en contenido.

Atributos o características de cada elemento

Pongamos por caso que tenemos un dataset de películas. Los atributos de cada película podrían ser: título, director, fecha de estreno, género, actores protagonistas, duración, idioma, etc. Dentro de estos atributos podríamos incluir cualquier información descriptiva. La gran ventaja de usar estos atributos junto a la opinión de los usuarios es que se pueden hacer recomendaciones de cualquier elemento con atributos. Esto permite recomendar incluso nuevos items que los usuarios no tengan en el radar aún.

Los modelos basados en contenido usan cualquier característica disponible para construir perfiles de items que nos permitan a los científicos de datos compararlos matemáticamente. Esto nos permitirá identificar elementos similares y recomendarlos.

Figura 3. Atributos de una película.

Vectorización de atributos

La mejor manera de extraer información de estos atributos es vectorizándolos. A continuación se muestra un ejemplo donde aparecen diferentes elementos por filas y las características o atributos posibles por columnas.

Y os preguntareis, ¿por qué organizar los datos de esta manera?. Organizar la información de forma tabular nos permite calcular la distancia o similitud entre elementos de forma sencilla, lo cual es vital para hacer las recomendaciones de las que estamos hablando en este post.

Figura 4. Vectorización de los datos (formato tabular).

A continuación, aprenderemos a generar estas tablas a partir de los datos. En esta ocasión, vamos a usar un dataset de películas (movies.csv). A partir de la tabla que se muestra a continuación, queremos obtener una nueva tabla que contenga una fila por película (una película puede aparecer varias veces en el dataset original porque puede clasificarse dentro de varios géneros) con un 1 en aquellos atributos que la representen y ceros en los que no.

Figura 5. Carga del dataset original.

Para transformar los datos podemos usar la función crosstab de pandas. El primer argumento que le pasemos a la función se convertirá en las filas y el segundo en las columnas. A continuación obtenemos el resultado deseado.

Figura 6. Cross_tab de películas y géneros con Pandas.

Con nuestros datos en el formato adecuado estamos en disposición de comenzar a hacer comparaciones y recomendaciones. Pero para ello, tenemos que encontrar la manera de calcular el grado de similitud entre filas.

Introducción al coeficiente de similitud de Jaccard

La métrica que vamos a usar para medir el grado de similitud entre los distintos elementos de nuestra tabla "encodeada" se llama coeficiente de similitud de Jaccard. Este coeficiente es el ratio de atributos que dos elementos tienen en común, dividido por el número total de atributos de ambos. Este coeficiente toma valores entre 0 y 1, y adquiere valores más altos cuanto mayor es el número de atributos en común de los dos elementos.

Figura 7. Coeficiente de similitud de Jaccard (fórmula).

Pasamos a calcular el coeficiente de similitud de Jaccard para los datos con los que hemos empezado a trabajar. Empezaremos importando jaccard_score de la biblioteca sklearn metrics. Esta función toma dos filas y calcula el grado de similitud entre ellas. 

A continuación mostramos el resultado de comparar dos películas del género animación ('Tangled' y 'WALL-E'). Puesto que pertenecen al mismo género el coeficiente de similitud de Jaccard es 1. Sin embargo, cuando comparamos dos de distinto género como 'Remember me' que es un Drama y WALL-E, el resultado es 0.

Figura 8. Cálculo del coeficiente de similitud de Jaccard con Scikit Learn.

Si queremos establecer similitudes entre todos los elementos de nuestro dataset de una vez hacemos uso de dos funciones del paquete Scipy. En primer lugar, pdist (el nombre corto para pairwise distance) nos ayuda a calcular las distancias de todos los pares posibles, usando como argumento la métrica Jaccard. El resultado es una matriz que contiene todas las distancias en formato 1D array. Por ello, tendremos que usar la función squareform para transformar estos datos en 1D a la forma rectangular de matriz deseada.

Figura 9. Calculo de la distancia de Jaccard con Scipy.

Nótese que el cálculo que hacemos con la función pdist es la distancia, que expresa el grado de diferencia entre cada uno de los registros. Los elementos de la diagonal, que comparan un elemento con el mismo, muestran una distancia de 0 porque son iguales y por tanto el grado de diferencia es nulo. Como estamos interesados en calcular el grado de similitud que es el complementario de la operación que acabamos de realizar, restaremos a 1 los valores de matriz_cuadrada_distancias.

Figura 10. Cálculo del coeficiente de similitud de Jaccard on Scipy.

Para poder usar esta información con mayor comodidad, podemos pasar estos datos a un DataFrame. El DataFrame contendrá como argumento principal los valores de coeficiente_similitud_jaccard y como índices y columnas los nombres de las películas.

Figura 11. DataFrame con coeficientes de similitud de Jaccard.

Ahora podemos buscar cómodamente la distancia entre pares.

Figura 12. Comparación del grado de similitud entre dos películas.

Sigue en parte 2 aquí.

Si quieres más información sobre nuestro master, puedes contactar con nosotros bien por teléfono al +34 910 91 28 42 o +34 630 88 13 53, por whatsapp directamente pinchando aquí o aquí, o mandando un mail con tus datos de contacto (nombre completo y teléfono) a: info@datahack.es

Suscríbete a nuestra Newsletter

Recibe nuestra programación mensual de eventos online y la apertura de nuevas convocatorias de cursos




    En Datahack Consulting SL trataremos los datos que nos facilites con la finalidad de enviarte información relacionada con tu solicitud sobre nuestros servicios, así como enviarte comunicaciones informativas sobre nuestra actividad. Podrás ejercer los derechos de acceso, rectificación, limitación, oposición, portabilidad, o retirar el consentimiento enviando un email a administracion@datahack.es. También puedes solicitar la tutela de derechos ante la Autoridad de Control (AEPD). Puedes consultar información adicional y detallada sobre protección de datos en nuestra Política de Privacidad.

    Estamos para ayudarte con cualquier duda, pequeña o grande

    Llámanos, escríbenos al email o por WhatsApp o inicia un chat en la web y hablamos

    chevron-down