La idea de la aplicación es predecir en streaming la popularidad de las canciones de las new_releases de Spotify. Para ello haremos uso de un modelo de regresión lineal previamente entrenado a partir de un dataset que contine unas 160k canciones que contienen diferentes parámetros y métricas de los distintos temas.
Necesitamos Big Data para poder almacenar y manejar tanto los datos iniciales como los futuros que cogeremos de Spotify.
También necesitamos Large Parallel Processing para procesar los datos y entrenar al modelo de aprendizaje supervisado que predice la popularidad de los nuevos lanzamientos.
Datasheet
songs
albums
of Data
Para crear el modelo de predicción, partimos de un dataset que contine unas 160k canciones alojadas en Spotify cuyo año de publicación va desde 1921 hasta la actualidad. Cada canción viene descrita en el dataset por las siguientes variables: id, name, artists, year, valence, acousticness, danceability, duration_ms, energy, explicit, instrumentalness, key, liveness, loudness, mode, popularity, release_date, speechiness y tempo. Podemos observar que se trata de una serie de variables y métricas muy heterogénes y quizá no todas sean relevantes para nuestro modelo de regresión. Por ello conviene relizar un estudio y limpieza previa del conjunto para conservar solo aquellas veriables útiles para el predictor.
A grandes rasgos podemos diferenciar dos grandes tipos de columnas en el conjunto: las variables no numéricas (describen atributos de la pista como su nombre, artista, identificador) y las variables numéricas (describen diversas métricas del sonido, duración o incluso otros atributos como el año de lanzamiento). Para nuestro modelo de regresión, utilizaremos las variables numéricas. Es conveniente además conocer cuáles de estás métricas guardan un mayor grado de correlación con la variable a predecir ya que así nuestro modelo de regresión ofrecerá resultados más precisos y fiables que si utilizamos variables menos significativas.
Observamos que con mucha diferencia la variable que más correlacionada está con la popularidad de una pista es, con diferencia year, seguida de otras que tambien lo están en manor medida como energy, acousticness o loudness. El resto de variables guardan un grado de correlación con la popularidad bastante residual, por lo que será conveniente descartarlos de cara a la construcción de nuestro modelo ya que quizá sean perjudiciales.
Optamos finalmente por utilizar un modelo de regresión lineal múltiple para establecer una relación estadística entre las variables seleccionadas y la popularidad. En este caso hemos optado por utilizar el modelo LinearRegression de scikit-learn. Su funcionamiento es simple, genera el modelo con el metodo fit(x,y) a partir de una matriz de datos (cada fila describe una pista mediante las variables elegidas) y un vector de etiquetas que en nuestro caso contiene la popularidad de cada pista descrita en la matriz ya que esta es la variable objetivo. Una vez entrenado, podemos medir el error medio de sus predicciones comparandolas con las etiquetas originales. Con el modelo ya genereado, el método predict(x) devolverá las etiqutas que el modelo asocie a cada nueva pista descrita parámetro. Además, podemos usar el error medio del modelo para emitir nuestra predicción como un rango en vez de un único valor (predicción ± error_medio).
Partiendo de un esquema similar en el que recibimos en streaming nuevas canciones, podemos proponer otros modelos alternativos con los que trabajar con los datos que no sean la prediccion de popularidad mediante regresión lineal que hemos implementado.
En este modelo nos valemos de la libería nativa de Spark Spark-ML , para construir y entrenar el modelo. Tratamos de predecir si una canción contiene contenido explícito (que no es recomendable para niños o lenguaje ofensivo) o no. Para ellos hemos utilizado las columnas valence,year,acousticness y danceability del dataset y la característica a predecir es explicit, las pruebas muestran en torno a un 75% de acierto.
Para este modelo hemos empleado Scikit-Learn, hemos tranformado con ayuda de la función "popularidad", los valores de la polularidad que van del rango 0 a 100 en ceros o unos, en función de si este valor es mayor o menor que 30. De esta forma transformamos el problema de clasifación de 100 clases a 2 clases. Con este modelo se obtuvo un porcentaje de acierto en torno al 99%.
Hemos empleaso Scikit-Learn con este modelo y se pretende predecir la popularidad y clasificarla en 100 clases (0...100). Con este modelo se obtuvo un porcentaje de acierto en torno al 60%.
La aplicación está basada en un modelo cliente-servidor comunicados a través de un socket TCP. La idea es tener un proceso conectado a la interfaz python de spotify (spotipy) para recibir los álbumes new_releases a través de ella y poder enviarlos al segundo proceso en formato csv para que este pueda realizar la predicción a traves del modelo de regresión. A continuación exponemos los detalles de ambos scripts:
Spotipy es una interfaz python que ofrece Spotify a los desarrolladores para tener completo acceso a los datos que ofrece Spotify. Para poder utilizarla, se requiere un proceso previo de autenticación mediante un identificador del cliente y una clave secreta que se pueden pasar como argumento del objeto SpotifyClientCredentials() o colocarse como variables de entorno en que se ejecuta el proceso. Para obtener dichas claves se deben seguir los siguientes pasos:
Como ya detallamos en el anterior apartado La aplicación, el programa está formado por dos scripts de python comunicados a través de un socket, por lo que necesitaremos dos terminales en las que ejecutar cada uno de ellos.
Para poder ejecutar la aplicación es necesario instalar las siguientes dependencias:
PySpark: siguiendo este tutorial
Spotipy: $ pip install spotipy , librería de python para conectar con la API de Spotify
SKlearn: $ pip install -U scikit-learn , librería para construir los modelos de Machine Learning
Pandas: $ pip install pandas , librería de Python para el análisis de datos
Primero ejecutamos el script spotify_releases.py como un script python ordinario (asumiendo que se cumplen los requisitos de autenticación de spotify detallados en el apartado anterior).
Terminal 1: $ python3 spotipy_releases.py
Cuando el primer proceso quede a la espera de una conexión TCP, lanzamos el script spotify_processing.py como un spark job.
Terminal 2: $ spark-submit spotify_processing.py
Waiting for TCP connection...
Connection established. Starting to receive new releases...
--------- NEW ALBUM RELEASED ---------
- Name: Utopia
- Year: 2019
- Tracks:
--- Intro
--- Canalla
--- Payasos
--- La Demanda
--- Millonario
--- El Beso Que No Le Di
--- ileso
--- Amor Enterrado
--- Me Quedo
--- Los Últimos
--- Años Luz
--- Bellas (feat. Romeo Santos)
--- Inmortal
------------------------------------------
Intro → Predicted popularity: [51.089655 - 67.222184]
Canalla → Predicted popularity: [54.423761 - 70.556289]
Payasos → Predicted popularity: [54.038490 - 70.171018]
La Demanda → Predicted popularity: [54.627449 - 70.759977]
Millonario → Predicted popularity: [54.384552 - 70.517080]
El Beso Que No Le Di → Predicted popularity: [54.904522 - 71.037050]
Ileso → Predicted popularity: [54.383425 - 70.515953]
Amor Enterrado → Predicted popularity: [54.552172 - 70.684700]
Me Quedo → Predicted popularity: [54.127291 - 70.259819]
Los ltimos → Predicted popularity: [54.070513 - 70.203041]
Aos Luz → Predicted popularity: [54.461848 - 70.594376]]
Los ltimos → Predicted popularity: [54.070513 - 70.203041]
Bellas (feat. Romeo Santos) → Predicted popularity: [54.411454 - 70.543982]
Inmortal → Predicted popularity: [54.013395 - 70.145923]
El rendimiento está condicionado por factores externos como el número de álbumes y canciones que devuelve Spotipy o la latencia de comunicación con la API de Spotify. Es decir, la aplicación depdende de la velocidad con la que la API nos devuelve los nuevos lanzamientos.
Las ejecuciones realizadas tanto el local como en AWS demuestran que la conexión a la API de Spotify es un cuello de botella. La aplicación podría no escalar con la misma eficiencia con la que escala nuestra infraestructura. El escalado horizontal de la aplicación, es decir, el aumentar el número de cores no provoca una mejora del rendimiento de la aplicación.
El tiempo medio de análisis de 100 álbumes, es decir, aproximadamente unas 1000 canciones es de 2 minutos.
Somos un grupo de estudiantes de la facultad de informática de Universidad Complutense de Madrid.
Estamos haciendo un proyecto para la asignatura de Cloud & BigData
Martinez
Cantador
Zamorano
Jimenez