Recomendación de post - Roar-Network/roar-recommender GitHub Wiki
Los algoritmos de recomendación tienen dos enfoques principales:
- Basados en el contenido de los posts o Content-based filtering donde se analiza el contenido de los mismos utilizando técnicas de NLP en caso de textos, de visión por computadoras en el caso de fotos y vídeos. El objetivo final es construir un índice de los posts y sugerir al usuario final items que contengan contenidos afines a sus gustos.
- Filtros colaborativos o Collaborative Filtering donde se ignora por completo el contenido de los post y se asume que usuarios similares tendrán gustos similares, y se utiliza como enfoque una matriz de preferencia, la cual se va utilizando para sugerir post a usuarios similares.
Las técnicas de Collaborative Filtering son buenas pues olvidan la naturaleza de los elementos a recomendar y solo se basan en las interacciones del usuario con los post y de los usuarios similares, pero esta técnica tiene ciertos problemas como el el conocido start cold o comienzo en frío, en el cual para un usuario nuevo o tímido no se conoce qué recomendarle pues no ha interactuado y no tiene usuarios similares. Para enfrentar este problema una de las soluciones habituales es mezclar las interacciones explícitas con las ímplicitas para recomendar. Se consideran interacciones explícitas aquellas en las que los usuarios expresan públicamente sus gustos o disgustos por ciertos elementos a través de likes, comentarios, shares. Mientras las interacciones implícitas son aquellas en las que los usuarios no dejan rastros públicos de su actividad pero sí realizan click en ciertas publicaciones, se detienen más tiempo a leer ciertas publicaciones, repiten su visita, dejan comentarios y luego lo borran, etc. Suponga que cuando entra un nuevo usuario al sistema de recomendación este recibe sugerencias según las publicaciones más populares en el momento. Si el usuario está haciendo scroll entre estas y se detiene 15 segundos en una de ellas, entonces está interacción indica que esta captó su atención por lo tanto es probable que en un usuario que haya interactuado anteriormente con esa publicación sea similar a ese. Además, como solución al problema también se busca mezclar las técnicas de Collaborative filtering con las basadas en contenido. De esta forma se obtiene un recomendador que utiliza los contenidos de las publicaciones y las interacciones entre usuarios similares para sugerir posts a nuevos usuarios.
Roar utiliza las técnicas de Collaborative filtering mezclada con Content-based filtering, así como un recomendador de post más populares.
Se escogió la técnica de Matrix Factorization que consiste en: dada una matriz R
de n x m
donde n
es la cantidad de usuarios y m
la cantidad de posts en el sistema, y en la posición Ri,j
se encuentra una medida de la interación del usuario i
con el post j
. Entonces, se busca obtener dos matrices U
y P
de menor dimensión tal que el producto de las mismas de como resultado una matriz R'
que cumple R'i,j = Ri,j
si Ri,j
no es 0 y si Ri,j = 0
entonces R'i,j
tiene una predicción.
El algoritmo seleccionado se conoce como Neural Matrix Factorization (NeuMF) el cual consiste en un Perceptrón Multicapa y una Generalización de la factorización de matrices. Se ha demostrado que este modelo de red neuronal resuelve el caso general de la factorización de matrices, haciendo la multiplicación de los embeddings obtenidos en la primera capa.
El principal inconveniente de este modelo es que cuando la cantidad de usuarios o de elementos a recomendar cambia el modelo no tiene cómo defenderse con eso. Pues en su representación interna se crean las dos matrices de tamaño n x latent_factor
y m x latent_factor
, al cambiar el n
o m
la multiplicación de las matrices U
y P
no es la nueva matriz R*
de n* x m*
.
La solución es reentrenar con los datos nuevos, aunque se proponen soluciones temporales que pueden ser útiles mientras el modelo está en producción y un nuevo algoritmo está siendo entrenado.
Una vez un nuevo usuario entra al sistema este debe ingresar a lo sumo cuatro categorías de su preferencia, expresando el orden de las mismas. Si se realiza un clúster de usuarios se puede saber a qué clúster pertenece este nuevo usuario, y por ende a qué usuarios es similar en el modelo. Por tanto, se pudieran sugerir los mismos post que a los usuarios que están en el clúster. También pudieran sugerirse los post más populares dentro del clúster y a nivel global.
Una vez un usuario publica un nuevo post este se clasifica en una de las categorías anteriormente mencionada y se pudiera recomendar como sustituta a alguna de las recomendaciones hechas por el modelo con cierta probabilidad.
Se implementó el clúster de los usuarios utilizando el algoritmo DBSCAN con los siguientes parámetros:
eps=0.5
metric=manhattan
algorithm=kd_tree
obteniéndose un total de 39 clúster y algunos usuarios (4) para los cuales el algoritmo no fue capaz de asociarle un clúster. El resultado del algoritmo se muestra a continuación:

Dado que DBSCAN no tiene un método para nuevos datos, se entrenó un algoritmo SVM para dado un dato nuevo obtener el clúster al que pertenece. Se utilizó una estrategia Stratifield K-fold dado que los datos estaban desbalanceados, esto es que existían clúster con más datos que otros. Se obtuvo un score en promedio en el entrenamiento de 0.9857.
Se dividió el dataset en dos grandes conjuntos:
-
train
de tamaño 0.8 del tamaño original, el cual se dividió en un conjunto de validación de tamaño 0.1 del tamaño detrain
. -
test
para verificar el entrenamiento final de la red.
Se realizaron 100 epochs con batch de tamaño 512 y 1024, se hicieron checkpoints cada 10 epochs. El entrenamiento de la red se realizó en Google Colab para agilizar el mismo utilizando los pocos recursos de GPU que están a disposición en las cuentas free. Se utilizó la métrica de MeanSquaredLogaritmicError para conocer cuánto se está equivocando el algoritmo y se obtuvo un error en el entrenamiento de 0.38 en promedio, mientras en el conjunto de prueba se tuvo 0.4135 aproximadamente.
En todo momento en la aplicación se conoce cuáles son los post a los que el usuario ha dado feedback, entonces se escoge el complemento de este grupo o una porción del complemento y se pide una valoración a la red, luego se hace un ranking de aquellos con mayor rating y se recomiendan en dicho orden.