Explorando Sistemas de Recomendación con Surprise: Aprendizajes y Aplicaciones

Edu Pintado
4 min readJun 26, 2024

--

Introducción

Los sistemas de recomendación se han convertido en una herramienta esencial para personalizar la experiencia del usuario en plataformas en línea. Desde recomendaciones de películas en Netflix hasta sugerencias de productos en Amazon, estos sistemas utilizan datos de usuario para proporcionar contenido relevante y personalizado. En este artículo, compartiré los principales aprendizajes obtenidos durante un módulo de estudio sobre sistemas de recomendación, enfocándome en la implementación práctica con la librería Surprise en Python.

Personalización Creada por Datos

La personalización es el núcleo de los sistemas de recomendación. Utilizando grandes cantidades de datos, estos sistemas pueden identificar patrones y preferencias individuales, ofreciendo sugerencias que se alinean con los gustos del usuario. Durante el módulo, aprendimos cómo los datos pueden ser utilizados para mejorar la relevancia de las recomendaciones, lo que no solo aumenta la satisfacción del usuario sino también el engagement y la retención en las plataformas.

Popularidad, Contenidos e Híbridos

Existen varios enfoques para los sistemas de recomendación:

  1. Basados en Popularidad: Recomiendan los ítems más populares sin personalización.
  2. Basados en Contenido: Utilizan las características de los ítems y las preferencias previas del usuario para hacer recomendaciones.
  3. Enfoques Híbridos: Combinan métodos colaborativos y basados en contenido para mejorar la precisión y relevancia de las recomendaciones.

El uso de métodos híbridos es particularmente efectivo, ya que puede compensar las limitaciones de los enfoques individuales.

Filtrado Colaborativo y Cálculo de Distancias

El filtrado colaborativo es una técnica popular que se basa en las interacciones de los usuarios con los ítems. Utiliza las similitudes entre usuarios o ítems para hacer recomendaciones. Aprendimos a calcular estas similitudes mediante varias métricas de distancia, como la distancia euclidiana, la similitud coseno y la correlación de Pearson. Estas métricas son fundamentales para entender las relaciones entre usuarios o ítems y para construir modelos precisos de recomendación.

Aplicaciones, Tendencias y Retos de los Sistemas de Recomendación

Los sistemas de recomendación tienen aplicaciones en diversas industrias, desde el entretenimiento hasta el comercio electrónico. Sin embargo, también enfrentan varios retos:

  • Escalabilidad: Manejar grandes volúmenes de datos en tiempo real.
  • Privacidad: Proteger los datos personales de los usuarios.
  • Diversidad y Novedad: Equilibrar entre recomendar ítems populares y nuevos.

Las tendencias actuales apuntan hacia el uso de modelos más sofisticados, como los basados en aprendizaje profundo, para mejorar la precisión y la capacidad de personalización.

KNN y Librería Surprise

Uno de los algoritmos que exploramos en detalle fue K-Nearest Neighbors (KNN). KNN es simple pero poderoso, ya que utiliza la similitud entre usuarios o ítems para hacer recomendaciones. Implementamos este algoritmo utilizando la librería Surprise, una herramienta robusta para construir y evaluar sistemas de recomendación en Python.

El Proyecto Final

En nuestro proyecto final, aplicamos lo aprendido utilizando el dataset Ratings, que contiene calificaciones de usuarios para diversas películas. Utilizamos varios algoritmos de la librería Surprise, incluyendo KNNBasic, KNNWithMeans y SVD++, para construir y evaluar modelos de recomendación.

Implementación y Evaluación

Comenzamos cargando y dividiendo los datos en conjuntos de entrenamiento y prueba. Luego, definimos y entrenamos nuestros modelos. A continuación, realizamos predicciones y evaluamos el rendimiento utilizando métricas como el RMSE (Root Mean Squared Error).

# Instalamos librería surprise
pip install scikit-surprise

# Realizamos las importaciones
import pandas as pd
from surprise import KNNBasic, KNNWithMeans
from surprise import Dataset
from surprise import Reader
from surprise import accuracy
from surprise.model_selection import train_test_split

# Definimos el formato de lectura del dataset
reader = Reader(line_format='user item rating timestamp', sep='::'

# Cargamos los datos desde el archivo ratings.dat
file_path = '/content/sample_data/ratings (1).dat'
data = Dataset.load_from_file(file_path, reader=reader)

# Dividir datos
trainset, testset = train_test_split(data, test_size=0.3)

# Definimos los modelos
knn = KNNBasic(k=50, sim_options={'name': 'pearson', 'user_based': True})
kMeans = KNNWithMeans(k=50, sim_options={'name': 'cosine', 'user_based': False})

# Entrenamos los modelos
knn.fit(train)
kMeans.fit(train)user_id = str(42) # Convertimos el ID a string
item_id = str(7) # Convertimos el ID a string

# Predicción para el modelo KNNBasic
knn_user_prediction = knn.predict(user_id, item_id)
print("Predicción KNNBasic para el usuario", user_id, "y el item", item_id)
print(knn_user_prediction)

# Predicción para el modelo KNNWithMeans
kMeans_user_prediction = kMeans.predict(user_id, item_id)
print("\nPrediccion KNNWithMeans para el usuario", user_id, "y el item", item_id)
print(kMeans_user_prediction)

# Evaluación sobre el conjunto de prueba
knn_test_predictions = knn.test(test)
kMeans_test_predictions = kMeans.test(test)

# Calculamos el RMSE
knn_rmse = accuracy.rmse(knn_test_predictions)
kMeans_rmse = accuracy.rmse(kMeans_test_predictions)

# Mostramos los resultados
print("\nRMSE para KNNBasic:", knn_rmse)
print("RMSE para KNNWithMeans:", kMeans_rmse)

#Importamos el modelo SVD++
from surprise import SVDpp

# Definimos el algoritmo SVD++
svdpp = SVDpp()

# Entrenamos el modelo con los datos de entrenamiento
svdpp.fit(train)

# Evaluamos el modelo en el conjunto de prueba
svdpp_test_predictions = svdpp.test(test)

# Calculamos el RMSE
svdpp_rmse = accuracy.rmse(svdpp_test_predictions)

# Imprimimos el resultado del RMSE para SVD++
print("RMSE para SVD++:", svdpp_rmse)

Resultados y Reflexiones

Los resultados de nuestro proyecto mostraron que el algoritmo SVD++ tuvo el mejor rendimiento en términos de RMSE, seguido por KNNWithMeans y KNNBasic. Esto destaca la importancia de considerar diferentes enfoques y algoritmos para mejorar la precisión de las recomendaciones.

Conclusión

Este proyecto nos permitió aplicar conceptos teóricos en un entorno práctico, utilizando la librería Surprise para construir y evaluar sistemas de recomendación. Los aprendizajes obtenidos son valiosos para futuras aplicaciones y proyectos en este campo. La experiencia práctica de implementar estos algoritmos y evaluar su rendimiento refuerza la importancia de los sistemas de recomendación en la personalización de contenido y en la mejora de la experiencia del usuario.

--

--