Tutoriales y ejercicios de 4Geeks Coding Projects para personas que están aprendiendo a codificar o mejorando sus habilidades de codificación
Dificultad
beginnerRepositorio
No disponible
Video
No disponible
Demo en vivo
No disponible
Duración promedio
2 hrs
Tecnologías
Al leer la lección de teoría de k-nearest neighbors, también leemos una introducción a los sistemas de recomendación. En este proyecto guiado, aprenderemos cómo construir un sistema de recomendación de películas simple utilizando el algoritmo de k-nearest neighbors.
Este proyecto contiene 2 conjuntos de datos con características diferentes para las mismas 5000 películas, por lo que debes fusionarlos.
Esta vez no se hará Fork, tómate un tiempo para leer estas instrucciones:
Una vez que hayas terminado de resolver los ejercicios, asegúrate de confirmar tus cambios, hazle "push" al fork de tu repositorio y ve a 4Geeks.com para subir el enlace del repositorio.
Sistema de recomendación de películas
¿Podemos predecir qué películas tendrán una calificación alta, incluso si no son un éxito comercial?
Este conjunto de datos es un subconjunto de la enorme API de base de datos de películas de TMDB, que contiene solo 5000 películas del número total.
Enlaces de conjuntos de datos:
tmdb_5000_movies: https://raw.githubusercontent.com/4GeeksAcademy/k-nearest-neighbors-project-tutorial/main/tmdb_5000_movies.csv
tmdb_5000_credits zip file to download: https://github.com/4GeeksAcademy/k-nearest-neighbors-project-tutorial/blob/main/tmdb_5000_credits.zip
Paso 1:
Importa las bibliotecas necesarias e importa el conjunto de datos.
1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4import seaborn as sns 5%matplotlib inline 6 7movies = pd.read_csv('../data/tmdb_5000_movies.csv') 8credits = pd.read_csv('../data/tmdb_5000_credits.csv')
Paso 2:
Explora el conjunto de datos mirando las primeras filas y el número de filas y columnas.
1movies.head() 2 3movies.shape 4 5credits.head() 6 7credits.shape
Paso 3:
Combina ambos marcos de datos en la columna 'título'.
1movies = movies.merge(credits, on='title')
Paso 4:
Trabajaremos únicamente con las siguientes columnas:
-movie_id
-title
-overview
-genres
-keywords
-cast
-crew
1movies = movies[['movie_id','title','overview','genres','keywords','cast','crew']]
Paso 5:
Como solo faltan 3 valores en la columna "resumen", suéltelos.
1movies.isnull().sum() 2 3movies.dropna(inplace = True)
Paso 6:
Como puedes ver, hay algunas columnas con formato json. Con el siguiente código, puedes ver qué géneros se incluyen en la primera fila.
1movies.iloc[0].genres 2 3>>>>[{"id": 28, "name": "Action"}, {"id": 12, "name": "Adventure"}, {"id": 14, "name": "Fantasy"}, {"id": 878, "name": "Science Fiction"}]
Comenzaremos a convertir estas columnas usando una función para obtener solo los géneros, sin formato json. Solo estamos interesados en los valores de las claves de 'nombre'.
1import ast 2 3def convert(obj): 4 L = [] 5 for i in ast.literal_eval(obj): 6 L.append(i['name']) 7 return L
1movies.dropna(inplace = True)
1movies['genres'] = movies['genres'].apply(convert) 2movies.head()
Repite el proceso para la columna "palabras clave".
1movies['keywords'] = movies['keywords'].apply(convert)
Para la columna 'cast' crearemos una función nueva pero similar. Esta vez limitaremos el número de elementos a tres.
1def convert3(obj): 2 L = [] 3 count = 0 4 for i in ast.literal_eval(obj): 5 if count < 3: 6 L.append(i['name']) 7 count +=1 8 return L
1movies['cast'] = movies['cast'].apply(convert3)
Puedes ver cómo va nuestro conjunto de datos:
1movies.head(1)
Las únicas columnas que quedan por modificar son 'crew' (equipo) y overview (resumen). Para el 'crew', crearemos una nueva función que permita obtener solo los valores de las claves 'name' (nombre) para cuyo 'job'(trabajo) el valor sea 'Director'. En resumen, estamos tratando de obtener el nombre del director.
1def fetch_director(obj): 2 L = [] 3 for i in ast.literal_eval(obj): 4 if i['job'] == 'Director': 5 L.append(i['name']) 6 break 7 return L
1movies['crew'] = movies['crew'].apply(fetch_director)
Finalmente, veamos la primera fila de la columna 'resumen':
1movies.overview[0]
Para la columna 'overview', la convertiremos en una lista usando el método 'split()'.
1movies['overview'] = movies['overview'].apply(lambda x : x.split())
Paso 7:
Para que el sistema de recomendación no se confunda, por ejemplo, entre 'Jennifer Aniston' y 'Jennifer Conelly', quitaremos los espacios entre palabras con función.
1def collapse(L): 2 L1 = [] 3 for i in L: 4 L1.append(i.replace(" ","")) 5 return L1
Ahora apliquemos nuestra función a las columnas 'genres' (géneros), 'cast' (elenco), 'crew' (equipo) y 'keywords' (palabras clave).
1movies['cast'] = movies['cast'].apply(collapse) 2movies['crew'] = movies['crew'].apply(collapse) 3movies['genres'] = movies['genres'].apply(collapse) 4movies['keywords'] = movies['keywords'].apply(collapse)
Paso 8:
Reduciremos nuestro conjunto de datos combinando todas nuestras columnas convertidas anteriores en una sola columna llamada 'tags' (que crearemos).
Esta columna ahora tendrá TODOS los elementos separados por comas, pero ignoraremos las comas usando lambda x :" ".join(x).
1movies['tags'] = movies['overview']+movies['genres']+movies['keywords']+movies['cast']+movies['crew']
1new_df = movies[['movie_id','title','tags']] 2 3new_df['tags'] = new_df['tags'].apply(lambda x :" ".join(x))
Mira cómo se ve ahora mostrando el primer tag:
1new_df['tags'][0] 2 3>>>>'In the 22nd century, a paraplegic Marine is dispatched to the moon Pandora on a unique mission, but becomes torn between following orders and protecting an alien civilization. Action Adventure Fantasy ScienceFiction cultureclash future spacewar spacecolony society spacetravel futuristic romance space alien tribe alienplanet cgi marine soldier battle loveaffair antiwar powerrelations mindandsoul 3d SamWorthington ZoeSaldana SigourneyWeaver JamesCameron'
Paso 9:
Usaremos el algoritmo KNN para construir el sistema de recomendación. Antes de ingresar al modelo, procedamos con la vectorización de texto que ya aprendiste en la lección de PNL.
1from sklearn.feature_extraction.text import CountVectorizer 2cv = CountVectorizer(max_features=5000 ,stop_words='english')
1vectors = cv.fit_transform(new_df['tags']).toarray()
1vectors.shape
Si deseas conocer las 5000 palabras más utilizadas, puede usar cv.get_feature_names().
Paso 10:
Encontremos la similitud de coseno entre las películas. Continúa y ejecuta las siguientes líneas de código en tu proyecto para ver los resultados.
1from sklearn.metrics.pairwise import cosine_similarity 2cosine_similarity(vectors).shape
1similarity = cosine_similarity(vectors)
1similarity[0]
1sorted(list(enumerate(similarity[0])),reverse =True , key = lambda x:x[1])[1:6]
Paso 11:
Finalmente, crea una función de recomendación basada en cosine_similarity. Esta función debería recomendar las 5 películas más similares.
1def recommend(movie): 2 movie_index = new_df[new_df['title'] == movie].index[0] ##fetching the movie index 3 distances = similarity[movie_index] 4 movie_list = sorted(list(enumerate( distances)),reverse =True , key = lambda x:x[1])[1:6] 5 6 for i in movie_list: 7 print(new_df.iloc[i[0]].title)
Paso 12:
Comprueba tu sistema de recomendación introduciendo una película. Corre a ver las recomendaciones.
1recommend('choose a movie here')
Paso 13:
Como siempre, usa notebook para experimentar y asegúrate de obtener los resultados que deseas.
Usa tu archivo app.py para guardar tus pasos definidos, canalizaciones o funciones en el orden correcto.
En tu archivo README escribe un breve resumen.
Guía de soluciones:
https://github.com/4GeeksAcademy/k-nearest-neighbors-project-tutorial/blob/main/solution_guide.ipynb
Tutoriales y ejercicios de 4Geeks Coding Projects para personas que están aprendiendo a codificar o mejorando sus habilidades de codificación
Dificultad
beginnerRepositorio
No disponible
Video
No disponible
Demo en vivo
No disponible
Duración promedio
2 hrs
Tecnologías