# machine-learning-clasico-con-python
Machine Learning con scikit-learn y XGBoost
Volver a la portada del cursoNotebook: agrupar canciones por cómo suenan
Sección 4 · Aprendizaje no supervisado
Ejemplo en Python: Clustering
El equipo de PyRitmo quiere armar playlists por cómo suena cada canción, sin usar el género que escribió el sello. No hay una etiqueta que predecir: hay que descubrir grupos. Esta guía acompaña al notebook clustering-estilos y te dice qué buscar en cada sección, desde escalar las columnas hasta asignarle un grupo a una canción nueva.
1. Solo los rasgos de audio
El notebook genera las 1500 canciones y se queda con las 5 columnas de AUDIO: energia, bailabilidad, acustica, tempo_bpm y duracion_seg. No entran top50 ni popularidad (aquí no hay objetivo), ni los seguidores del artista (no describen cómo suena la canción), ni el genero (es justo lo que queremos contrastar al final). generar_canciones también devuelve los 4 estilos con los que se crearon los datos; el notebook los guarda aparte y solo los usa al final para comprobar el resultado. En un problema real no existirían.
2. Escalar no es opcional
KMeans agrupa por distancia. Sin escalar, el tempo (de 60 a 159) y la duración (de 95 a 446 segundos) pesan cientos de veces más que la energía o la acústica, que van de 0 a 1. El notebook lo demuestra con el índice ARI, que mide cuánto coinciden los grupos encontrados con los 4 estilos reales (1 es coincidencia perfecta y 0, azar):
- KMeans con k=4 sin escalar: ARI 0.413. Los grupos se forman casi solo por duración y tempo.
- KMeans con k=4 con
StandardScaler: ARI 0.998. Recupera los estilos casi a la perfección.
Con escalado y KMeans en un mismo pipeline, una canción nueva se escala con la media y la desviación aprendidas en las 1500:
modelo = make_pipeline(StandardScaler(),
KMeans(n_clusters=4, n_init=10, random_state=42))
modelo.fit(df[AUDIO])
etiquetas = modelo[-1].labels_
print(np.bincount(etiquetas)) # [389 515 182 414]
n_init=10 repite el algoritmo con 10 arranques distintos y se queda con el mejor; random_state=42 hace que el resultado no cambie entre ejecuciones.
3. ¿Cuántos grupos? El codo y la silueta
En clustering nadie te dice el número de grupos. El notebook prueba k de 2 a 8 y anota dos medidas: la inercia (suma de distancias al cuadrado de cada canción a su centro; siempre baja al subir k) y la silueta (de −1 a 1; alta si cada canción está cerca de su grupo y lejos de los demás).
| k | Inercia | Silueta |
|---|---|---|
| 2 | 3874 | 0.478 |
| 3 | 2500 | 0.490 |
| 4 | 1191 | 0.582 |
| 5 | 1106 | 0.453 |
| 6 | 1021 | 0.364 |
| 8 | 910 | 0.243 |
De 3 a 4 grupos la inercia cae a menos de la mitad (de 2500 a 1191); de 4 a 5 apenas baja 85. Ese quiebre es el codo. La silueta coincide: su máximo, 0.582, está en k=4. Cuando las dos medidas apuntan al mismo k, la elección es fácil. No siempre pasa.
4. Leer los perfiles
Un cluster solo sirve si puedes describirlo. El notebook agrega la etiqueta al DataFrame y saca la media de cada columna por grupo, incluidas la popularidad y el Top 50, que no se usaron para agrupar:
df_c = df.assign(cluster=etiquetas)
cols = AUDIO + ["popularidad", "top50"]
perfil = df_c.groupby("cluster")[cols].mean().round(2)
perfil["n"] = df_c["cluster"].value_counts().sort_index()
print(perfil)
- Cluster 0, «acústicas»: acústica 0.75, energía 0.30, 81 bpm. 389 canciones, popularidad 43.2, 13 % en el Top 50.
- Cluster 1, «para bailar»: bailabilidad 0.80, energía 0.70, 98.5 bpm y 188 segundos. 515 canciones, popularidad 55.31, la mitad en el Top 50 (0.50).
- Cluster 2, «largas y ambientales»: 378 segundos de duración y energía 0.40. 182 canciones, popularidad 37.86 y casi ninguna en el Top 50 (0.01).
- Cluster 3, «enérgicas»: energía 0.88 y 137.6 bpm. 414 canciones, popularidad 49.3, 25 % en el Top 50.
Los nombres los pones tú leyendo las medias: KMeans solo entrega números. El número de cada cluster es arbitrario; con otra versión o semilla, el grupo «para bailar» podría llamarse 2.
5. Los clusters no son géneros
Con pd.crosstab(df_c["cluster"], df_c["genero"]) se ve la relación. El cluster 1 reúne 239 de los 271 reguetones; el 3, 221 rocks; el 2, 155 electrónicas. Pero el cluster 0 mezcla 156 canciones pop con 146 de regional. Los grupos se forman por cómo suena la canción, no por la etiqueta del sello: una balada pop y una de regional se parecen más entre sí que a un pop para bailar.
6. Verlo en dos dimensiones
Cinco columnas no se pueden dibujar. El notebook usa PCA(2) sobre los datos escalados para proyectarlas en un plano: los dos primeros componentes explican 0.531 y 0.301 de la varianza, 0.831 en total. El gráfico, coloreado por cluster, te deja ver si cada grupo ocupa su propia zona del plano. PCA aquí solo sirve para mirar; el agrupamiento se hizo con las 5 columnas.
7. Una canción nueva
El sello envía una canción con energía 0.25, bailabilidad 0.38, acústica 0.82, 78 bpm y 230 segundos. modelo.predict la escala con lo aprendido y la asigna al cluster 0, el de las acústicas: va a la playlist tranquila.
Qué debes obtener
Tamaños de grupo [389 515 182 414], silueta máxima 0.582 en k=4 y la canción nueva en el cluster 0. Si tus grupos tienen otros tamaños, revisa que escalaste y que usas n_init=10 y random_state=42. Como práctica, repite el análisis quitando duracion_seg de las columnas y observa si el grupo de canciones largas sobrevive.