Construyendo motores de recomendación usando Pandas

En este artículo, aprendemos cómo construir un motor de recomendación básico desde cero usando Pandas.

Creación de motores de recomendación de películas con Pandas

Un Motor de Recomendación o Sistemas de Recomendación o Recommender Systems es un sistema que predice o filtra preferencias según los gustos de cada usuario. Los sistemas de recomendación supervisan la entrega de un índice de sugerencias mediante filtrado colaborativo o filtrado basado en contenido.

Un motor de recomendación es una de las aplicaciones de aprendizaje automático más populares y ampliamente utilizadas. Casi todas las grandes empresas de tecnología, como los sitios web de comercio electrónico, Netflix, Amazon Prime y más, utilizan motores de recomendación para recomendar artículos o películas adecuados a los usuarios. Se basa en el instinto de que es más probable que tipos de usuarios similares tengan calificaciones similares en elementos o entidades de búsqueda similares.

Ahora comencemos a crear nuestro motor de recomendación muy básico y simple usando pandas. Concentrémonos en ofrecer un motor de recomendación simple al presentar las cosas que son más comparables con un determinado objeto en función de la correlación y la cantidad de calificaciones, en este caso, películas. Simplemente indica qué películas se consideran equivalentes a la elección de película del usuario.

Para descargar los archivos: archivo .tsv , Movie_Id_Titles.csv .

Filtrado basado en la popularidad

El filtrado basado en la popularidad es una de las técnicas de filtrado más básicas y no tan útiles para construir un sistema de recomendación. Básicamente, filtra el elemento que está más de moda y oculta el resto. Por ejemplo, en nuestro conjunto de datos de películas, si una película es calificada por la mayoría de los usuarios, significa que muchos usuarios la ven y está de moda ahora. Por lo tanto, el sistema de recomendación solo sugerirá a los usuarios aquellas películas con un número máximo de calificaciones. Hay una falta de personalización ya que no es sensible a algún gusto particular de un usuario.

Ejemplo:

Primero, importaremos la biblioteca pandas de python con la ayuda de la cual crearemos el motor de recomendación. Luego cargamos los conjuntos de datos de la ruta dada en el código a continuación y le agregamos los nombres de las columnas.

Python3

# import pandas library
import pandas as pd
  
# Get the column names
col_names = ['user_id', 'item_id', 'rating', 'timestamp']
  
# Load the dataset
path = 'https://media.geeksforgeeks.org/wp-content/uploads/file.tsv'
  
ratings = pd.read_csv(path, sep='\t', names=col_names)
  
# Check the head of the data
print(ratings.head())
  
# Check out all the movies and their respective IDs
movies = pd.read_csv(
    'https://media.geeksforgeeks.org/wp-content/uploads/Movie_Id_Titles.csv')
print(movies.head())
  
# We merge the data
movies_merge = pd.merge(ratings, movies, on='item_id')
movies_merge.head()

Producción

Ahora clasificaremos las películas según el número de calificaciones de las películas. Como estamos filtrando en función de la popularidad, las películas que ven más usuarios tendrán más calificaciones.

Python3

pop_movies = movies_merge.groupby("title")
pop_movies["user_id"].count().sort_values(
    ascending=False).reset_index().rename(
  columns={"user_id": "score"})
  
pop_movies['Rank'] = pop_movies['score'].rank(
  ascending=0, method='first')
pop_movies

Producción

Luego visualizamos las 10 mejores películas con el mayor número de calificaciones:

Python3

import matplotlib.pyplot as plt
  
plt.figure(figsize=(12, 4))
plt.barh(pop_movies['title'].head(6), 
         pop_movies['score'].head(6), 
         align='center',
         color='RED')
  
plt.xlabel("Popularity")
plt.title("Popular Movies")
plt.gca().invert_yaxis()

Producción

Filtración colaborativa

Filtrado basado en el usuario: 

Estas técnicas sugieren resultados a un usuario que los usuarios coincidentes han elegido. Podemos aplicar la correlación de Pearson o la similitud del coseno para estimar el parecido entre dos usuarios. En el filtrado colaborativo basado en el usuario, localizamos la puntuación de similitud o similitud entre los usuarios. El filtrado colaborativo tiene en cuenta la fuerza de la masa. Por ejemplo, si muchas personas ven el libro electrónico A y B y un nuevo usuario lee solo el libro B, el motor de recomendaciones también sugerirá que el usuario lea el libro A.

Filtrado colaborativo basado en elementos: 

En lugar de calcular el parecido entre varios usuarios, el filtrado colaborativo basado en elementos sugiere elementos en función de su similitud con los elementos que clasificó el usuario objetivo. Asimismo, la semejanza se puede calcular con la Correlación de Pearson o la Semejanza del Coseno. Por ejemplo, si al usuario A le gusta la película P y un nuevo usuario B es similar a A, entonces el recomendador sugerirá la película P al usuario B.

El siguiente código demuestra el filtrado colaborativo basado en elementos de usuario.

Ejemplo:

Primero, importaremos la biblioteca pandas de python con la ayuda de la cual crearemos el motor de recomendación. Luego cargamos los conjuntos de datos de la ruta dada en el código a continuación y le agregamos los nombres de las columnas.

Python3

# import pandas library
import pandas as pd
  
# Get the column names
col_names = ['user_id', 'item_id', 
             'rating', 'timestamp']
  
# Load the dataset
path = 'https://media.geeksforgeeks.org/\
wp-content/uploads/file.tsv'
  
ratings = pd.read_csv(path, sep='\t', 
                      names=col_names)
  
# Check the head of the data
print(ratings.head())
  
# Check out all the movies and their respective IDs
movies = pd.read_csv(
    'https://media.geeksforgeeks.org/\
    wp-content/uploads/Movie_Id_Titles.csv')
print(movies.head())

Producción

Ahora fusionamos los dos conjuntos de datos sobre la base de item_id, que es la clave principal común para ambos.

Python3

movies_merge = pd.merge(ratings, movies,
                        on='item_id')
movies_merge.head()

Producción

Aquí calculamos la media del número de calificaciones otorgadas a cada una de las películas. Luego calculamos el recuento de la cantidad de calificaciones otorgadas a cada una de las películas. Los ordenamos en orden ascendente como podemos ver en la salida.

Python3

print(movies_merge.groupby('title')[
      'rating'].mean().sort_values(
  ascending=False).head())
  
print(movies_merge.groupby('title')[
      'rating'].count().sort_values(
  ascending=False).head())

Producción

Ahora creamos un nuevo marco de datos llamado ratings_mean_count_data y agregamos las nuevas columnas de calificación media y calificación al lado de cada título de película, ya que estos dos parámetros son necesarios para filtrar las mejores sugerencias para el usuario.

Python3

ratings_mean_count_data = pd.DataFrame(
    movies_merge.groupby('title')['rating'].mean())
ratings_mean_count_data['rating_counts'] = pd.DataFrame(
    movies_merge.groupby('title')['rating'].count())
ratings_mean_count_data

Producción

En el marco de datos recién creado, podemos ver las películas junto con el valor medio de las calificaciones y el número de calificaciones. Ahora queremos crear una array para ver la calificación de cada usuario en cada película. Para ello haremos el siguiente código.

Python3

user_rating = movies_merge.pivot_table(
    index='user_id', columns='title', values='rating')
user_rating.head()

Producción

Aquí, cada columna contiene todas las calificaciones de todos los usuarios de una película en particular, lo que nos facilita encontrar las calificaciones de nuestra película preferida.

Aquí, cada columna contiene todas las calificaciones de todos los usuarios de una película en particular, lo que nos facilita encontrar las calificaciones de nuestra película preferida.

Así que veremos las calificaciones de Star Wars (1977) ya que tiene la mayor cantidad de calificaciones. Dado que queremos encontrar la correlación entre las películas con la mayor cantidad de calificaciones, este será un buen enfoque. Veremos las primeras 25 valoraciones.

Python3

Star_Wars_ratings = user_rating['Star Wars (1977)']
Star_Wars_ratings.head(15)

Producción

Ahora encontraremos las películas que se correlacionan con Star Wars (1977) usando la función corrwith() . A continuación, almacenamos los valores de correlación en la columna Correlación en un nuevo marco de datos llamado corr_Star_Wars. Eliminamos los valores de NaN del nuevo conjunto de datos.

Mostramos las primeras 10 películas que están altamente correlacionadas con Star Wars (1977) en orden ascendente usando el parámetro ‘ascending=False’.

Python3

movies_like_Star_Wars = user_rating.corrwith(Star_Wars_ratings)
  
corr_Star_Wars = pd.DataFrame(movies_like_Star_Wars, 
                              columns=['Correlation'])
corr_Star_Wars.dropna(inplace=True)
corr_Star_Wars.head(10)
corr_Star_Wars.sort_values('Correlation',
                           ascending=False).head(25)

Producción

Del resultado anterior, podemos ver que las películas que están altamente correlacionadas con Star Wars (1977) no son todas famosas y conocidas.

Puede haber casos en los que solo un usuario vea una película en particular y le otorgue una calificación de 5 estrellas. En ese caso, no será una calificación válida ya que ningún otro usuario la ha visto.

Por lo tanto, la correlación puede no ser una buena métrica para filtrar la mejor sugerencia. Así que agregamos la columna de rating_counts al marco de datos para tener en cuenta el número de calificaciones junto con la correlación.

Python3

corr_Star_Wars_count = corr_Star_Wars.join(
    ratings_mean_count_data['rating_counts'])

Asumimos que las películas que vale la pena ver tendrán al menos algunas calificaciones superiores a 100. Por lo tanto, el siguiente código filtra las películas más correlacionadas con calificaciones de más de 100 usuarios.

Python3

corr_Star_Wars_count[corr_Star_Wars_count[
  'rating_counts'] > 100].sort_values(
    'Correlation', ascending=False).head()
corr_Star_Wars_count = corr_Star_Wars_count.reset_index()
corr_Star_Wars_count

Producción

Podemos visualizar mejor ver el conjunto final de películas recomendadas

Python3

import matplotlib.pyplot as plt
  
plt.figure(figsize=(12, 4))
plt.barh(corr_Star_Wars_count['title'].head(10),
         abs(corr_Star_Wars_count['Correlation'].head(10)), 
         align='center',
         color='red')
plt.xlabel("Popularity")
plt.title("Top 10 Popular Movies")
plt.gca().invert_yaxis()

Producción

Por lo tanto, las películas anteriores se recomendarán a los usuarios que acaban de terminar de ver o han visto Star Wars (1977). De esta forma, podemos construir un sistema de recomendación muy básico con pandas. Definitivamente, para los motores de recomendación en tiempo real, los pandas no satisfarán las necesidades. para eso, tendremos que implementar complejos algoritmos y marcos de aprendizaje automático.

Publicación traducida automáticamente

Artículo escrito por rijushree100guha y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *