Fuente: Elaboración propia
A continuación se lista el contenido de este proyecto.
- Introducción
- Descripción del Problema
- Información
- Ingeniería de datos
- Análisis Exploratorio de Datos (EDA)
- Feature Engineering)
- Desarrollo de la API
- Modelo de Recomendación
- Deploy en Render
- Video
- Conclusión
- Tecnologías utilizadas
En este proyecto, se desarrollará el rol de un Ingeniero MLOps en Steam (plataforma de juegos). El objetivo principal es crear un sistema de recomendación de videojuegos utilizando técnicas de Machine Learning. Los datos necesitan un respectivo tratamiento (ETL, EDA), y la tarea es transformarlos para disponer de ellos y desarrollar un Producto Mínimo Viable (MVP) que luego sea desplegado como una API.
Es necesario crear un modelo de aprendizaje automático para un sistema de recomendación de videojuegos. El estado actual de los datos es crudo y no procesado. Nuestro objetivo es empezar desde cero, realizar tareas rápidas de Ingeniería de Datos y entregar un MVP al final del proyecto.
En este proyecto, Se trabajó con tres archivos JSON que contienen datos acerca de los juegos en la plataforma Steam:
-
steam_games.json.gz
Este conjunto de datos proporciona las características principales de cada juego, incluye información vital como títulos, desarrolladores, precios, géneros y etiquetas.
-
users_reviews.json.gz
Este conjunto de datos presenta opiniones de usuarios sobre los juegos que han adquirido. Contiende detalles sobre recomendación de los juegos y conteo sobre la utilidad de los comentarios.
-
users_items.json.gz
Contiene información de los juegos consumidos y su dedicación a lo largo del tiempo.
Fuente de datos: Dataset
Limpieza y Transformación de Datos (ETL):
-
Leer el conjunto de datos en el formato correcto.
-
Eliminar columnas innecesarias para optimizar el rendimiento de la API y el entrenamiento del modelo.
-
En la siguiente tabla se muestra la ubicación del ETL realizado.
Dataset | Ubicación |
---|---|
steam_games | ETL Games |
user_items | ETL Reviews |
user_reviews | ETL Items |
Análisis de Sentimiento: Crear una nueva columna, 'sentiment_analysis', aplicando análisis de sentimiento mediante Procesamiento de Lenguaje Natural (NLP) a las reseñas de usuarios. La escala que se utilizo fue: '0' para comentarios negativos, '1' para neutrales y '2' para positivos.
Exploración Manual: Realizar un EDA manual después del ETL para investigar las relaciones entre variables, identificar valores atípicos y descubrir patrones interesantes dentro del conjunto de datos, para esta tarea se utilizan diferentes librerías para hacer visualizaciones y medidas estadísticas. EDA
Creación de DataFrames Auxiliares: Antes de desarrollar las funciones de la API, se crearon DataFrames auxiliares para optimizar el espacio y mejorar el rendimiento de las funciones. Estos DataFrames se utilizaron para almacenar datos específicos necesarios para las consultas de la API. En la siguiente tabla se muestran los datasets creados:
Nombre | Archivo |
---|---|
gasto_items | 04-gasto-items.parquet |
ranking_genero | 05-ranking-genero.parquet |
tiempo_juego_genero | 06-tiempo-juego-genero.parquet |
items_developer | 07-items-developer.parquet |
user_time_year | 08-user-time-year.parquet |
top_dev | 09-top-dev.parquet |
Los datasets se encuentran en la siguiente carpeta data
Framework: Utilizar el framework FastAPI para exponer los datos de la empresa a través de endpoints RESTful.
Endpoints (funciones objetivo):
-
developer(desarrollador : str)
: Cantidad de items y porcentaje de contenido Free por año según empresa desarrolladora. -
userData(user_id : str)
: Debe devolver cantidad de dinero gastado por el usuario, el porcentaje de recomendación en base a reviews.recommend y cantidad de items. -
userForGenre(genero : str)
: Debe devolver el usuario que acumula más horas jugadas para el género dado y una lista de la acumulación de horas jugadas por año de lanzamiento. -
bestDeveloperYear(año : int)
: Devuelve el top 3 de desarrolladores con juegos MÁS recomendados por usuarios para el año dado. (reviews.recommend = True y comentarios positivos) -
developerReviewsAnalysis(desarrollador : str)
: Según el desarrollador, se devuelve un diccionario con el nombre del desarrollador como llave y una lista con la cantidad total de registros de reseñas de usuarios que se encuentren categorizados con un análisis de sentimiento como valor positivo o negativo.
Dentro de la carpeta /data se encuentran los dataframes utilizados para cada función y en el siguiente enlace se encuentran las funciones documentadas antes de la creación de la API FastAPI: Funciones API
En caso de querer ejecutar la API desde localHost se deben seguir los siguientes pasos:
-
Clonar el proyecto haciendo
git clone https://github.com/Ivan2125/MLOps-Steam.git
-
Preparación del entorno de trabajo en Visual Studio Code:
-
Crear entorno
python -m venv env
-
Ingresar al entorno haciendo
source env\Scripts\activate
-
Instalar dependencias con
pip install -r requirements.txt
-
-
Ejecutar el archivo main.py desde consola activando uvicorn. Para ello, hacer
uvicorn main:app --reload
-
Hacer Ctrl + clic sobre la dirección
http://XXX.X.X.X:XXXX
(se muestra en la consola). -
Una vez en el navegador, dar click en
Consulta API
para acceder a la API. -
En cada una de las funciones hacer clic en
Try it out
y luego introducir el dato que requiera o utilizar los ejemplos por defecto. Finalmente Ejecutar y observar la respuesta.
Sistema de Recomendación: Se implementa un sistema de recomendación de filtrado colaborativo item-item. En este caso el sistema de recomendación funciona tomando un item (juego) y encontrando cinco similares a este. Para poder lograr desplegar(deploy) el modelo con espacio de memoria limitado se utiliza la técnica de muestreo, esto significa que se usa solo una muestra de los datos para realizar la recomendación aunque esto puede conllevar a predicciones no tan precisas.
Nombre | Archivo |
---|---|
Modelo de recomendación | 07-modelo_recomendacion.ipynb |
Integración con la API: Se aseguró que las recomendaciones del modelo puedan accederse a través de un endpoint API GET/POST, como recomendacionJuego(item : str)
.
Para el deploy de la API se seleccionó la plataforma Render que es una nube unificada para crear y ejecutar aplicaciones y sitios web, permitiendo el despliegue automático desde GitHub. Para esto se siguieron estos pasos:
- Generación de un Dockerfile cuya imagen es Python 3.11.8. Se puede ver el detalle del documento Dockerfile.
- Se generó un servicio nuevo en
render.com
, conectado al presente repositorio y utilizando Docker como Runtime. - Finalmente, el servicio queda corriendo en https://repo-deploy.onrender.com.
Note
Para el despliegue automático, Render utiliza GitHub y dado que el servicio gratuito cuenta con una limitada capacidad de almacenamiento, se realizó un repositorio exclusivo para el deploy, el cual se encuentra aquí.
En este link se encuentra el video donde se explica brevemente el desarrollo del proyecto y el correcto funcionamiento de la API desplegada en el servicio web de Render.
El presente proyecto de MLOps logró transformar datos de juegos en bruto en un sistema funcional de recomendación desplegado en un servicio web como una API de consulta. La optimización del espacio mediante datasets auxiliares es una estrategia clave para mejorar el rendimiento de las funciones al igual que utilizar el muestreo en el modelo de recomendación. Al abordar la ingeniería de datos, el desarrollo de la API, el EDA y el aprendizaje automático, se cumplió con el objetivo de proporcionar recomendaciones acerca de los juegos presentes en la plataforma de Steam.
En el desarrollo de este proyecto, aprovechamos varias tecnologías para llevar a cabo las distintas etapas del proceso: