Introducción

En la entrada de blog anterior vimos qué eran los sistemas de recomendación y lo presentes que se encuentran en nuestra vida diaria. Hoy vamos a ver el primer tipo de sistema de recomendación; desde qué es, pasando por cómo se implementa y terminando por las ventajas e inconvenientes que presenta.

Imaginemos el siguiente escenario donde tenemos una aplicación para ver películas online y quisiéramos recomendarle películas nuevas a un usuario:

En este escenario existe un usuario (en color naranja), el cúal es similar a n usuarios (tres en este caso), pues han visto las mismas películas. Sin embargo, estos tres usuarios han visto más peliculas que el usuario naranja. Es por ello por lo que se podría tratar de predecir cuál sería la valoración que ese usuario le asignaría a esa película. Después, se puede aplicar algún tipo de regla de negocio. Por ejemplo, si la valoración o rating supera el 2,5 en una escala del 0 al 5, podría ser una película de su interés y por lo tanto se le recomendaría, desechándose en caso contrario.

Si esto lo quisiéramos ver en datos tabulares, como los de Excel, tendrían la siguiente pinta:

En este caso podemos ver que Bob es similar a Alex pues las valoraciones de las películas Avengers, Star Wars y Thor son bastante parejas. Si tratáramos, a ojo de buen cubero, de predecir cuál sería la valoración que Bob le asignaría a Spider-man seguramente sería 0, 1 o 2, basándonos en las valoraciones anteriores. Los sitemas de filtro colaborativo buscan similitudes en n usuarios similares, tratando de encontrar aquellos productos que todavía no ha consumido y recomendándoselos tras aplicarle una regla de negocio.

El primer problema es que esta tabla puede hacerse inmensamente grande. Pensemos en un cliente como Amazon con millones de productos y clientes. Es por ello por lo que se necesita un protocolo para poder calcular estas valoraciones. Permitidme que me ponga un poco friki:

La matriz (conjunto de números ordenados en filas y columnas) R es la matriz que teníamos antes de usuarios en filas y películas en columnas. Nuestro objetivo será factorizar esta matriz en dos matrices cuyo producto de como resultado una aproximación de la original. Es como tratar de conseguir factorizar el número 33; podría ser tan sencillo como encontrar el 3 y el 11. Pero no os austéis con tanto tecnicismo. A la hora de la práctica el open-source hace milagros, pero era inevitable alguna alusión a lo que realmente está sucediendo en la trastienda.

Ahora ya sí, podemos empezar a construir nuestro sistema de recomendación con el lenguaje de programación Python.

%load_ext autoreload
%autoreload 2
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import json
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.metrics.pairwise import linear_kernel, cosine_similarity
from ast import literal_eval
from nltk.stem.snowball import SnowballStemmer
import matplotlib.pyplot as plt
import solidml as ml
import torch
from sklearn.model_selection import train_test_split
from scipy.sparse import csr_matrix
from sklearn.neighbors import NearestNeighbors
from surprise import Reader, Dataset, SVD, evaluate, KNNBasic
from surprise import NMF
from gensim.models import KeyedVectors

Lo primero que debemos hacer es añadir todas las librerías que vamos a utilizar para realizar el recomendador. Cabe destacar que también existen librerías que utilizaremos en la próxima entrada de blog donde explicaremos el sistema de recomendación basado en contenido.

Posteriormente, vamos a cargar los datos necesarios. Para este y siguientes ejemplos vamos a hacer uso de la base de datos de películas tmdb que podrás descargar aquí.

Carga de datos

Una vez hecho esto, ya podemos cargar los datos:

md = pd.read_csv('movies_metadata.csv')

Los metadatos tienen esta pinta, donde tendremos el título de la película, su presupuesto, los actores, directores, géneros y un largo etcétera.

Elección de un subconjunto de películas

Para no usar todas las películas que aparecen (pues son muchas), vamos a filtrarlas usando un csv dónde aparecen sólo un subconjunto de las mismas:

links_small = pd.read_csv('links_small.csv')
links_small = links_small[links_small['tmdbId'].notnull()]['tmdbId'].astype('int')
md['id'] = md['id'].astype('int')
smd = md[md['id'].isin(links_small)]
smd = smd.groupby('id').head(1)
links_small = links_small[links_small.isin(smd['id'])]

Este código es como lanzar si hubiéramos lanzado una SELECT de T-SQL con una subquery dentro de un IN (SELECT … FROM … WHERE … IN (SELECT…)).

Carga de ratings de las películas

Por último, necesitamos cargar las valoraciones de películas de los usuarios:

ratings = pd.read_csv('ratings.csv')
ratings = ratings[ratings['movieId'].isin(linked_small)]

Una vez tenemos filtrados los datos preparados, ya podemos empezar nuestro sistema de recomendación.

Sistema de recomendación de filtro colaborativo

Tal y como os he comentado anteriormente, para crear nuestra matriz de usuarios-películas y ser capaces de extraer los n usuarios similares y luego ser capaces de predecir el rating de la película parece una auténtica locura a nivel técnico. Sin embargo, afortunadamente el open-source una vez más hace el trabajo por nosotros. En nuestro caso vamos a usar Singular Value Decomposition (SVD):

svd = SVD() # creamos el modelo
data = Dataset.load_from_df(ratings[['userId', 'movieId', 'rating']] # creamos el dataset
cross_validate(svd, data, reader), measures=['RMSE', 'MAE'], cv=5, verbose=True) # entrenamos con cross-validation

En este momento ya tendremos nuestro modelo entrenado. Hemos usado la técnica de cross-validation o validación cruzada para ello, la cual consiste en usar todo el dato disponible, dividirlo en porciones y realizar el entrenamiento y la predicción de los mismos realizando iteraciones para que cada vez el conjunto de test sea uno distinto:

Esta técnica nos permite no sólo usar todos los datos disponibles (lo cuál es crucial en proyectos con pocos datos), sino que también evita que se produzca overfitting, es decir, que el modelo se ajuste demasiado a los datos de entrenamiento, no siendo capaz de generalizar para casos que todavía no ha visto.

Una vez hecho esto, podemos ver los resultados:

Si nos fijamos en la media de la métrica que nos interesa (MAE), podemos ver que tenemos 0,65 de error (es decir, de media fallamos en 0,65 de rating). Básicamente la métrica MAE o Mean Absolute Error muestra la suma de la diferencia entre las predicciones y los valores reales. Justificar que esa cifra es baja o alta debería venir desde negocio, donde deberían habernos provisto de métricas extra para evaluarlo. No obstante, podemos tratar de reducir la métrica MAE aplicando técnicas tales como el tuneo de hiperparámetros.

Análisis filtro colaborativo

Los sistemas de recomendación de filtro colaborativo tienen (como todo en la vida) ciertos pros y ciertos contras.

Pros:

  • Tienen en cuenta las recomendaciones de otros usuarios
  • Provee recomendaciones personalizadas para cada usuario

Contras:

  • No se tiene en consideración los metadatos de las películas (es decir, género, actores, directores, etc.)
  • Cold start. De un usuario que no conocemos nada, no podemos saber a qué otros usuarios es similar y, por lo tanto, no podemos recomendarle películas

Conclusiones

Tal y como podemos ver, los sistemas de recomendación de filtro colaborativo tienen ciertos pros y ciertos contras que debemos valorar y ser conscientes. Por otro lado, su implementación es muy sencilla gracias a las librerías open-source.

En la siguiente entrada de blog veremos los sistemas de recomendación basado en contenido, en el que sólo se tendrá en cuenta los metadatos.

Si no has visto la primera parte, puedes verla aquí.

En caso de tener algún problema para visualizar el código, puedes consultarlo en mi repositorio de GitHub.

¿Quieres formarte en Machine Learning? En SolidQ venimos trabajando en proyectos de Machine Learning desde hace algunos años y esta experiencia nos ha servido para adaptar nuestro conocimiento y crear los contenidos formativos objeto de este Módulo de Machine Learning con el que adquirir nuevos conceptos y conocimientos relacionados con analítica avanzada, dar el salto para no quedarte en el BI Tradicional” y seguir creciendo como profesional. Aprovecha la oportunidad y no dejes escapar el descuento que tenemos para ti… ¡antes de que se agote!

¿Quieres poner en marcha tu proyecto de Machine Learning? Conseguir el éxito en proyectos de analítica avanzada y su monetización requiere de datos, un buen modelo… y su interpretación asociada al caso de negocio. Esta combinación es imprescindible para que el proyecto tenga sentido y sea rentable. Por esta razón, durante nuestro Ideation Workshop nos reunimos en una sesión con todas las partes implicadas de tu equipo, para poner en contexto el proyecto y asegurar tanto su viabilidad técnica como los hitos de negocio en términos de rentabilidad. ¡Infórmate! Mira: Machine Learning Ideation Workshop: ¿Cómo empiezo mi proyecto?

Pablo Corral