Image for post Guía Práctica para Construir un Sistema de Recomendación Basado en Filtrado Colaborativo con Python

Guía Práctica para Construir un Sistema de Recomendación Basado en Filtrado Colaborativo con Python


Introducción

Los sistemas de recomendación se han convertido en uno de los pilares fundamentales de muchas plataformas digitales, desde tiendas online hasta servicios de streaming. Permiten sugerir productos, películas o contenido personalizado basado en el comportamiento y preferencias del usuario. En esta guía intermedia, aprenderemos a construir un modelo sencillo de recomendación usando filtrado colaborativo con Python y librerías como pandas y scikit-learn.

¿Qué es el Filtrado Colaborativo?

El filtrado colaborativo es una técnica que se basa en la idea de que si usuarios A y B tienen gustos similares, entonces A podría gustarle el contenido que B ha disfrutado pero A aún no ha visto. Se basa exclusivamente en las interacciones y preferencias de los usuarios y no en las características del producto.

Existen dos tipos principales:

  • Filtrado colaborativo basado en usuarios: Encuentra usuarios similares y recomienda artículos que esos usuarios hayan consumido.
  • Filtrado colaborativo basado en ítems: Encuentra artículos similares según los patrones de los usuarios y recomienda ítems similares a los que el usuario ya ha interactuado.

Pasos para construir un sistema básico

  1. Preparación de datos: Obtener y estructurar datos con usuarios, ítems y sus valoraciones o interacciones.
  2. Cálculo de similitud: Medir qué tan parecidos son usuarios o ítems entre sí.
  3. Predicción de puntuaciones: Estimar qué tan probable es que un usuario valore positivamente un ítem.
  4. Recomendación: Ordenar y presentar ítems recomendados para cada usuario.

Ejemplo práctico con Python

Usaremos un dataset pequeño simulado para mostrar el funcionamiento paso a paso.

import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# Creamos un DataFrame con valoraciones de usuarios a ítems
ratings_dict = {
    'item1': [5, 3, 0, 1],
    'item2': [4, 0, 0, 1],
    'item3': [1, 1, 0, 5],
    'item4': [0, 1, 5, 4],
    'item5': [0, 0, 5, 4],
}

users = ['User1', 'User2', 'User3', 'User4']
df = pd.DataFrame(ratings_dict, index=users)

# Mostrar la matriz de valoraciones
print("Matriz de valoraciones:\n", df)

# Calcular la similitud entre usuarios usando cosine similarity
cos_sim = cosine_similarity(df)

# Convertir la matriz a DataFrame para mayor legibilidad
sim_df = pd.DataFrame(cos_sim, index=users, columns=users)
print("\nMatriz de similitud entre usuarios:\n", sim_df)

# Predecir puntos para User1 basados en usuarios similares
# Peso por similitud normalizada
sim_sums = sim_df.loc['User1'].sum() - 1  # excluir la similitud consigo mismo
prediction = {}
for item in df.columns:
    if df.loc['User1', item] == 0:  # ítems no valorados
        weighted_sum = 0
        for user in users:
            if user != 'User1' and df.loc[user, item] > 0:
                weighted_sum += sim_df.loc['User1', user] * df.loc[user, item]
        pred_score = weighted_sum / sim_sums if sim_sums != 0 else 0
        prediction[item] = pred_score

# Mostrar predicciones ordenadas
predicted_ratings = pd.Series(prediction).sort_values(ascending=False)
print("\nPredicciones para User1 sobre ítems no valorados:\n", predicted_ratings)

En este ejemplo el usuario "User1" no ha valorado algunos ítems y queremos predecir qué le podrían gustar basándonos en usuarios similares.

Consideraciones y mejores prácticas

  • Escalabilidad: En proyectos reales, los datasets son mucho mayores. Se deben usar herramientas y frameworks optimizados para procesar grandes datos, como implicit o motores como Spark.
  • Problema de datos dispersos (sparsity): La mayoría de usuarios no valoran muchos ítems, lo que puede afectar la calidad de la similitud. Técnicas adicionales como modelos basados en matrix factorization pueden ayudar.
  • Sobrefitting y actualización dinámica: Las recomendaciones deben actualizarse continuamente con datos nuevos que reflejen cambios en gustos y preferencias.
  • Estrategias híbridas: Combinar filtrado colaborativo con recomendaciones basadas en contenido puede mejorar resultados en escenarios escasos o con nuevos usuarios/ítems.

Conclusiones

El filtrado colaborativo es una técnica poderosa y ampliamente utilizada para generar recomendaciones personalizadas basadas en el comportamiento conjunto de usuarios. A través de este artículo, vimos cómo abordarlo desde una perspectiva práctica, usando Python para estructurar datos, calcular similitudes y hacer predicciones sencillas.

Si bien este ejemplo es introductorio e ideal para entender la lógica conceptual, la industria actual utiliza modelos más complejos e integrados que contemplan múltiples fuentes de información y estrategias avanzadas. Sin embargo, dominar estos fundamentos es esencial para quienes desean avanzar en el desarrollo de productos con IA personalizada.