Guía para Principiantes: Cómo Construir un Sistema de Recomendación Simple con Python y Scikit\-Learn ===================================================================================================== Los sistemas de recomendación forman parte fundamental de muchas aplicaciones actuales, desde plataformas de streaming hasta tiendas en línea. Su función principal es sugerir contenido o productos relevantes basados en los gustos o comportamientos previos del usuario. En esta *guía para principiantes*, aprenderemos cómo construir un sistema de recomendación básico utilizando Python y la biblioteca **Scikit\-Learn**, con un enfoque claro y didáctico. ¿Qué es un Sistema de Recomendación? ------------------------------------ Los sistemas de recomendación son algoritmos que filtran información para ofrecer opciones personalizadas a cada usuario. Se dividen principalmente en dos tipos: * **Filtrado Colaborativo:** basado en las preferencias y comportamientos de usuarios similares. * **Filtrado Basado en Contenido:** basado en las características o atributos del contenido. En este artículo, construiremos un sistema sencillo basado en filtrado colaborativo usando la similitud entre usuarios. Requisitos Previos ------------------ Para seguir esta guía necesitarás: * Python 3 instalado (preferiblemente 3\.7\+) * Bibliotecas: `scikit-learn`, `pandas` y `numpy` Si no las tienes instaladas, puedes hacerlo fácilmente con: ``` pip install scikit-learn pandas numpy ``` Descripción del Dataset de Ejemplo ---------------------------------- Usaremos un conjunto reducido de datos simulado que incluye valoraciones de usuarios para ciertos productos (por ejemplo, películas). La estructura es una matriz donde filas son usuarios, columnas son productos y valores son puntuaciones. ``` import pandas as pd data = { 'Producto A': [5, 4, 0, 1, 0], 'Producto B': [3, 0, 4, 2, 1], 'Producto C': [0, 2, 5, 4, 0], 'Producto D': [1, 0, 2, 5, 4], 'Producto E': [0, 1, 3, 0, 5] } usuarios = ['Usuario 1', 'Usuario 2', 'Usuario 3', 'Usuario 4', 'Usuario 5'] ratings = pd.DataFrame(data, index=usuarios) print(ratings) ``` Esto generará un DataFrame con puntuaciones asignadas por cada usuario a cada producto. Construyendo el Sistema de Recomendación Básico ----------------------------------------------- El objetivo es recomendar productos que un usuario no haya valorado aún pero que usuarios con gustos similares sí hayan calificado positivamente. Para ello usaremos la similitud entre usuarios: 1. Calcular la similitud entre usuarios usando la distancia del coseno. 2. Encontrar los usuarios más parecidos a un usuario objetivo. 3. Predecir puntuaciones para productos no valorados sumando las valoraciones ponderadas de usuarios similares. ``` from sklearn.metrics.pairwise import cosine_similarity import numpy as np # Calculamos la matriz de similitud entre usuarios sim_matrix = cosine_similarity(ratings.fillna(0)) sim_matrix_df = pd.DataFrame(sim_matrix, index=usuarios, columns=usuarios) print(sim_matrix_df) # Función para recomendar productos a un usuario def recomendar(usuario_objetivo, ratings_df, sim_df, n_recomendaciones=3): if usuario_objetivo not in ratings_df.index: return "Usuario no encontrado en el dataset." # Obtenemos índices y puntuaciones del usuario objetivo usuario_idx = ratings_df.index.get_loc(usuario_objetivo) # Calculamos puntuaciones ponderadas usando la similitud sim_scores = sim_df.iloc[usuario_idx] # Productos que el usuario objetivo no ha valorado productos_no_valorados = ratings_df.columns[ratings_df.iloc[usuario_idx] == 0] predicciones = {} for producto in productos_no_valorados: # Valoraciones de otros usuarios para el producto ratings_producto = ratings_df[producto] # Eliminamos valoraciones cero para que no afecten mask = ratings_producto > 0 if mask.sum() == 0: predicciones[producto] = 0 continue # Suma ponderada de valoraciones score = np.dot(sim_scores[mask], ratings_producto[mask]) / sim_scores[mask].sum() predicciones[producto] = score # Ordenamos predicciones y seleccionamos las mejores recomendaciones = sorted(predicciones.items(), key=lambda x: x[1], reverse=True)[:n_recomendaciones] return recomendaciones # Ejemplo de recomendación para Usuario 1 recoms = recomendar('Usuario 1', ratings, sim_matrix_df, n_recomendaciones=2) print('Recomendaciones para Usuario 1:', recoms) ``` Este código proporcionará recomendaciones basadas en los gustos de usuarios similares. Explicación Detallada de la Implementación ------------------------------------------ **Similitud Coseno:** mide el ángulo entre dos vectores de puntuaciones, lo que indica la similitud en preferencias independientemente de la escala numérica absoluta. **Puntuaciones ponderadas:** Las recomendaciones se basan en la combinación ponderada de valoraciones de usuarios similares, dando mayor peso a los usuarios más parecidos. **Manejo de valores faltantes:** En este ejemplo se asume que la puntuación 0 significa no valorado. En implementaciones reales puede utilizarse *NaN* para mayor precisión y evitar sesgos. Pasos siguientes para mejorar el sistema ---------------------------------------- * Incorporar filtrado basado en contenido usando atributos de productos. * Usar matrices dispersas para mejorar rendimiento con grandes volúmenes de datos. * Implementar sistemas híbridos que combinen filtrado colaborativo y basado en contenido. * Explorar librerías especializadas para recomendación como `Surprise` o `LightFM`. Conclusión ---------- Con esta introducción hemos construido un sistema básico de recomendación colaborativo usando Python y Scikit\-Learn. Aunque muy simple, este modelo sirve como base para entender el funcionamiento de estos algoritmos tan presentes actualmente. A partir de aquí, ampliando el dataset y mejorando las técnicas, es posible crear sistemas potentes para aplicaciones reales.