Recommender System con Turi Create

Vivimos rodeados de sistema de recomendación hasta tal punto que casi resultan transparentes.

Los primeros que vienen a la cabeza son los sistema de recomendación de las plataformas de streaming como Netflix o HBO, pero hay muchos más, por ejemplo cuando visitas Amazon siempre te recomienda algo en función a tu últimas compras, o Goodreads cuando te sugiere cual puede ser tu próximo libro.

Qué son estos sistemas de recomendación, cómo se crean y cuál es la manera en la hacen sus recomendaciones es lo que vamos a tratar de ver a lo largo de este artículo.

¿Qué es un sistema de recomendación?

Pues en su nombre está su explicación, son aquellos sitemas que proporcionan recomendación personalizadas para cada usuario. O como lo definen los ingenieros de Turi Create…

A recommender system allows you to provide personalized recommendations to users.

¿Y qué hemos aprendido que necesitan todos los modelos de Machine Learning o Deep Learning para poder hacer bien su trabajo?

Eso es, necesitan datos, muchos datos, pero en este caso en concreto, además de los datos para entrenar el modelo, también hay que tener en cuenta que contra más datos le proporcione el usuario sobre sus gustos acerca de series de televisión o libros, mejor serán sus predicciones.

¿Y qué vas a recomendar?

Una de las cosas que más me gustan son las series de televisión, así que vamos a desarrollar precisamente eso, un recomendador de series de televisión.

Recolectando datos. Geoffrey entra en acción

Acabamos de decir que necesitamos datos para entrenal al modelo o sistema y para eso tengo a Geoffrey una web que le pide al usuario que marque las series que más le gustan, nada más.

Luego veremos que ese nada más es sólo por parte del usuario, nosotros tendremos que sacar algo más de información asociada a las series de televisión.

Llegados a este punto me tenéis que permitir hacer un inciso para decir que no se guardan ni un sólo dato de caracter personal de los usuarios de la web. Para saber más os invito a que leas la declaración de privacidad de Geoffrey.

¿Y de dónde salen todos estos datos de series?

Todos estos datos salen del fantástico API que pone a disposición de los desarrolladores de forma gratuita The Movie Database. No dejeís de visitar su web y echarle un vistazo a su API.

Ya he recolectado datos. ¿Y ahora qué?

Ahora lo que tenemos que decidir es qué tipo modelo de recomendación vamos a usar, y lo mejor es hacer en dos pasos:

En el primero paso debemos casar el tipo de dato con el modelo o modelos y en el segundo y último paso es evaluar el rendimiento del modelo y medir su eficacia en las recomendaciones.

Los tipos de modelos de recomendación son tres y vienen definidos por el tipo de dato que emplean

Explicit Data

Este es el más común de todos y te sonará porque es el que emplea el sistema de valorción de cada elemento, por ejemplo cuando se te pide que valores una película usando de 1 a 5 estrellas o el sistema de “Me gusta / No me gusta”

¿Te suena el sistema que emplea Netflix de pulgares para indicar si te gusta o no una serie? Pues es este.

Su objetivo normalmente es precedir la valoración que va a hacer un usuario sobre un elemento determinado (película, libro…)

Implicit Data

En este caso no hay información sobre valoración de los elementos.

En este caso las recomendación se basan en encontrar los elementos que son semejantes con aquellos con los que interactua un usuario.

Buscará listas de otros usuarios en las que el ratio de coincidencias con nuestra lista se alta y extraerá aquellos elementos que no estén presentes en nuestra lista.

Item Content Data

Para este modelo necesitamos más información de cada serie, como por ejemplo el género al que pertenece, la duración de cada episodio, el servicio de streaming que lo emite, etc.

Este modelo no se mira tanto la interacción que hace el usuario con los elementos, sino que se busca la similitud en la información asociada de dichos elementos para hacer las recomendaciones.

Turi Create

Al principio un grupo de ingenieros y matemáticos decidieron acercar las operaciones de Machine Learning y Deep Learning a todos los desarrolladores de una forma fácil y sencilla.

Turi Create simplifies the development of custom machine learning models. You don’t have to be a machine learning expert to add recommendations, object detection, image classification, image similarity or activity classification to your app.

Para que te hagas una idea Turi Create convierte esto

en esto

Hará cosa de un par de años la gente de Apple vio el potencial que tenía el proyecto y lo compró poniéndolo al alcance todos los desarrolladores, no sólo los del ecosistema Apple, a través del repositorio del proyecto en GitHub.

¿Que si Apple lo usa? Sólo tienes que abrir Create ML para darte cuenta que por debajo emplea Turi Create, vamos, que todavía nos hace más fácil aún desarrollar modelos de Machine Learning / Deep Learning a nuestras apps.

Explicit Data Recommender

En este caso el juego de datos contiene un columna llamada rating que puede tener dos valores:

  • 1 Si me gusta la serie
  • 0 No me gusta el programa

Sería algo como los pulgares que emplea Netflix para valorar las series.

Si lo hacemos de esta manera al usar la función ranking_factorization_recommender hay que emplear el parámetro binary_target y asignarle un valor de True. Al hacerlo Turi Create espera que el valor de la columna rating sea un valor de 0 o 1.

La función sabe cual es la columna con las valoraciones gracias al parámetro target, que es donde indicamos el nombre de la columna que las contiene.

¿Y qué es el parámetro user_id? Es el que hace las veces de identificador de usuario

¿Y item_id? Es lo que queremos recomendar, en nuestro caso identificadores de series de televisión

Para crear este ripo de recomendadores se suele emplear un factorization_recommender, aunque si estamos interesados en que la respuesta del modelo tenga más en cuenta el ranking de los elementos podemos emplear item_similarity_recommender o ranking_factorization_recommender, siendo este último muy útil cuando el valor del ranking es binario (como en nuestro caso)

Explicit Data with Side Information Recommender

El concepto de Side Information se aplica cuando aportamos más información a nuestro modelo para que pueda llevar a cabo unas mejores predicciones.

Por ejemplo, en nuestro caso, además del juego de datos con las valoraciones, vamos a pasarle al modelo un dataset con información de cada serie, como por ejemplo los géneros a los que pertenece, los servios que lo emiten, etc.

El código es casi idéntico al caso anterior, con la salvedad que en este caso a la función create de ranking_factorization_recommender le pasamos un parámetro llamado item_data al que le pasamos un SFrame con los datos sobre cada serie de televisión

Cuando llega el momento de exportar el modelo al formato Core ML se producirá un error:

Currently, only item similarity models can be exported to Core ML (use turicreate.item_similarity.create to make such a model).

Esto se debe a limitaciones impuestas por el framework CoreML.

Implicit Data Recommender

El más sencillo (y entre muchas comillas) de todos. Como hemos comentados antes, buscamos similitudes entre la colección de items del usuario y con las del modelo además de las interacciones que tienen los usuarios con dichos elementos.

Podemos elegir crearlo con item_similarity_recommender o ranking_factorization_recommender pudiendo en este último escoger el algoritmo que llevará a cabo para calcular la regresión. Las opciones disponibles son…

  • auto Turi Create elige el que cree que es mejor
  • als Implicit Alternating Least Squares.
  • adagrad Adaptive Gradient Stochastic Gradient Descent.
  • sgd Stochastic Gradient Descent

Podría parecerse al sistema que emplea HBO, en el que el usuario añade series y películas a su lista.

Item Content Data Recommender

Este modelo es muy parecido al Implicit Data, pero en este caso no se tienen en cuanta las interacciones, sólo el contenido de las colecciones de cada usuario.

Lo creamos con la función item_content_recommender

Obteniendo resultados

Desarrollar este modelo tiene la finalidad de que genere recomendaciones, bien por usuario o por items (series de televisión).

El el caso de las recomendaciones por usuario podemos hacerlas personalizadas para usuarios que ya tienen datos en el sistema o para aquellos que son nuevos y no tenemos información de ellos, lo que se conoce como el problema del cold-start

En ambos casos la solución pasa por pasarle como parámetros a la fución recommend() el parametro users que no es más que un array con los identificadores de los usuarios para los que queremos obtener recomendaciones.

En caso de que el usuario no esté en el sistema se asume que es un nuevo usuario y se recomiendan los items más populares entre todos los usuarios.

Si el usuario existe se afinan más las recomendaciones, como en el caso de este usuario que parece que tiene predilección por las series de cienci-ficción con un futuro distópico

Si lo que queremos es hacer recomendaciones basadas en elementos debemos emplear la función get_similar_items del modelo al que le pasamos el parámetro items que es un array con los códigos de items (en este caso ID de series de TV) de los queremos averiguar elementos similares

Turi Create Visualization

Hasta ahora todas las salidas de datos han sido en el Terminal, pero si eres usuario de Mac puede ver esta información con gráficos gracias a la herramienta Turi Create Visualization

Para poder invocarla debes llamar a la función show() del SFrame del que quieras ver los detalles.

Código fuente

Como siempre podéis acceder a los datasets, scripts y modelos CoreML generados en este repositorio de GitHub

Enlaces de interés

Nota

No hace falta decir que los sistemas de recomendación que emplean tanto Netflix como HBO están a años luz de lo expuesto en este artículo, recordad que Turi Create es un proyecto cuya finalidad es la de facilitar la creación de modelos de Machine Learning / Deep Learning.