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
- Repositorio oficial de Turi Create en GitHub
- Documentación sobre Sistemas de Recomendación con Turi Create
- Cold-Start Problem
- Preference Elicitation
- Site dedicado a los Sistemas de Recomendación del grupo de Research en Netflix
- Site de Machine Learning del grupo de Research en Netflix
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.