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