Saltar al contenido

# machine-learning-clasico-con-python

Machine Learning con scikit-learn y XGBoost

Volver a la portada del curso
Notebook

Notebook: regresión lineal para predecir popularidad

Sección 3 · Regresión y clasificación: modelos lineales, KNN, SVM y Naive Bayes

Ejemplo en Python: Regresión Lineal

En este notebook predices la popularidad (0 a 100) de las canciones de PyRitmo con regresión lineal, paso a paso: primero una sola variable, después todas, y al final una transformación que cambia el resultado por completo. Esta guía acompaña al notebook regresion-popularidad y te dice qué hace cada sección y qué cifra debes ver.

1. Partir y medir la línea base

El notebook genera las 1500 canciones, usa X = df[NUMERICAS + CATEGORICAS] y y = df["popularidad"], y parte con test_size=0.25 y random_state=42. En regresión no se usa stratify: la respuesta es un número, no una clase. Quedan 1125 canciones en train y 375 en test.

La línea base es DummyRegressor, que predice siempre la media de train (48.42). Su error absoluto medio (MAE) en test es 8.68 puntos de popularidad. Todo modelo debe bajar de ahí.

2. Una recta con una sola variable

La primera regresión usa solo bailabilidad:

from sklearn.linear_model import LinearRegression

m = LinearRegression().fit(X_tr[["bailabilidad"]], y_tr)
print(m.coef_[0].round(3), m.intercept_.round(2))
print(round(m.score(X_te[["bailabilidad"]], y_te), 3))

Busca tres números: pendiente 29.871, intercepto 31.58 y $R^2$ en test 0.183 (MAE 7.98). La recta dice: popularidad ≈ 31.58 + 29.871 × bailabilidad. Una canción con bailabilidad 0.5 recibe 46.5 y una con 0.9 recibe 58.5. Mejora al Dummy, pero explica menos de una quinta parte de la variación.

El notebook repite el ejercicio con seguidores_miles y obtiene un $R^2$ de −0.530. Un $R^2$ negativo significa que el modelo predice peor que la media constante. Guarda esa pista: algo pasa con los seguidores.

3. Regresión múltiple con pre

Ahora entran todas las columnas, con el preprocesamiento estándar pre (escalar numéricas y one-hot de genero) dentro de un pipeline:

from sklearn.pipeline import make_pipeline

lin = make_pipeline(pre, LinearRegression())
lin.fit(X_tr, y_tr)
pred = lin.predict(X_te)
print(round(mean_absolute_error(y_te, pred), 2))   # 6.35
print(round(r2_score(y_te, pred), 3))              # -0.074

El MAE baja a 6.35, pero el $R^2$ queda en −0.074. ¿Cómo puede el error típico mejorar y el $R^2$ empeorar? El $R^2$ castiga los errores al cuadrado, y unos pocos errores enormes lo hunden. El notebook los encuentra: el artista con más seguidores del test (19863 mil) recibe una predicción de 246.1, en una escala que termina en 100; su popularidad real es 76. La columna seguidores_miles está muy sesgada (mediana 88.5, media 220.75), y la recta extiende la tendencia sin freno hacia esos gigantes.

4. El logaritmo de los seguidores

Pasar de 10 mil a 100 mil seguidores no pesa lo mismo que pasar de 10 millones a 10.09 millones, aunque ambos saltos sumen 90 mil. Lo que importa es cuántas veces se multiplica la audiencia. El logaritmo base 10 convierte esos saltos multiplicativos en pasos iguales:

import numpy as np

def con_log(d):
    d = d.copy()
    d["log_seguidores"] = np.log10(d["seguidores_miles"])
    return d.drop(columns="seguidores_miles")

print(df["seguidores_miles"].corr(df["popularidad"]).round(3))            # 0.255
print(np.log10(df["seguidores_miles"]).corr(df["popularidad"]).round(3))  # 0.501

La correlación con la popularidad casi se duplica, de 0.255 a 0.501. Con la columna transformada (y pre ajustado a ese nombre) el modelo múltiple llega a MAE 4.56, RMSE 5.73 y $R^2$ 0.734. En train el $R^2$ también es 0.734: el modelo no sobreajusta. Esta sección es la lección central del notebook: transformar bien una columna vale más que cambiar de algoritmo.

5. Leer los coeficientes en lenguaje de negocio

Para interpretar en unidades reales, el notebook ajusta la misma regresión sin escalar (con pd.get_dummies para el género). Cada coeficiente es cuántos puntos de popularidad cambian por unidad de la columna, con lo demás fijo:

  • bailabilidad 15.34: pasar de 0 a 1 suma unos 15 puntos.
  • log_seguidores 10.55: cada 10 veces más seguidores suma 10.55 puntos.
  • en_playlist 10.07: entrar a una playlist editorial suma unos 10 puntos.
  • energia 9.60 y colaboracion 5.63.
  • genero_reguetón 2.71 y genero_electrónica −3.01.
  • duracion_seg −0.01 por segundo: un minuto más resta unos 0.6 puntos.

El intercepto es 9.15. Con este modelo, la canción de reguetón de prueba del notebook (850 mil seguidores, bailabilidad 0.84, colaboración, en playlist) recibe una popularidad estimada de 78.5.

6. Revisar los residuos

El residuo es la diferencia entre el valor real y la predicción. El notebook grafica los residuos contra las predicciones y su histograma. Qué buscar: media cercana a cero (−0.09) y dispersión de 5.73 puntos, sin forma de embudo ni curva. De las 375 canciones de test, solo 30 tienen un error mayor a 10 puntos, y el mayor es de 21.2. Si los residuos formaran un patrón, el modelo estaría dejando una relación sin capturar.

7. Comparar con un bosque aleatorio

Como referencia, el notebook entrena un RandomForestRegressor con las columnas originales, sin logaritmo: MAE 5.12 y $R^2$ 0.644. Los árboles toleran mejor los valores extremos que la recta cruda, pero la recta con logaritmo les gana (4.56 contra 5.12). En la sección de árboles y ensambles verás cómo funcionan estos modelos.

Qué debes obtener

Al final tu tabla debe mostrar: Dummy MAE 8.68; bailabilidad sola $R^2$ 0.183; múltiple crudo $R^2$ −0.074; múltiple con logaritmo MAE 4.56 y $R^2$ 0.734; bosque MAE 5.12. Si tus cifras difieren, revisa la semilla, que popularidad no esté dentro de X y que con_log se aplique igual a train y a test. Como práctica, quita en_playlist del modelo con logaritmo y observa cuánto sube el MAE.

Recursos