Saltar al contenido

# machine-learning-clasico-con-python

Machine Learning con scikit-learn y XGBoost

Volver a la portada del curso
Notebook

Notebook: comparar clasificadores para el Top 50

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

Comparar clasificadores para el Top 50

Este notebook integra el módulo de regresión y clasificación. Entrenas cinco clasificadores con el mismo preprocesamiento para predecir si una canción de PyRitmo entrará al Top 50, los comparas con validación cruzada y con varias métricas en test, y al final mueves el umbral de decisión. Esta guía acompaña al notebook clasificacion-top50: qué hace cada sección y qué cifra debes encontrar.

1. Partición, línea base y cinco modelos

Partición estándar del curso (1125 canciones en train y 375 en test, 103 hits en test) y el pre estándar: numéricas escaladas y genero en one-hot. El Dummy siempre dice «no entra»: accuracy 0.725 con recall 0 y AUC 0.5.

modelos = {
    "Logística": LogisticRegression(max_iter=2000),
    "KNN(15)": KNeighborsClassifier(15),
    "Árbol(4)": DecisionTreeClassifier(max_depth=4, random_state=42),
    "SVC RBF": SVC(kernel="rbf", probability=True, random_state=42),
    "GaussianNB": GaussianNB(),
}
pipes = {n: make_pipeline(crear_pre(), m).fit(X_tr, y_tr) for n, m in modelos.items()}

Accuracy en test: SVC 0.819, KNN 0.816, logística 0.811, árbol 0.795 y GaussianNB 0.749. Para elegir hacen falta más métricas.

2. Matriz de confusión, precision, recall y F1

La logística da [[252 20] [51 52]]: de los 103 hits reales detecta 52. Precision 52 / 72 = 0.722, recall 52 / 103 = 0.505 y F1 0.594. KNN y SVC quedan casi igual (recall 0.524); GaussianNB se sale del patrón con menos precision (0.536) y más recall (0.650), porque marca más canciones como hit.

3. SVC: margen, C y escalado

Un SVM busca la frontera con el mayor margen; las canciones sobre el margen o mal clasificadas son los vectores de soporte. C es el costo de cada error y gamma el alcance de cada vector en el kernel RBF. Qué buscar en la tabla de C:

  • C=0.1: 620 vectores de soporte (margen ancho), AUC test 0.823.
  • C=1: 534 vectores y el mejor AUC, 0.827.
  • C=10: 517 vectores, AUC 0.804; el margen se estrecha y empieza a sobreajustar. El tiempo de ajuste también crece con C.

decision_function da la distancia firmada a la frontera; probability=True agrega una calibración interna más lenta para obtener predict_proba. Sin escalar, el SVC cae a AUC 0.688: el kernel mide distancias y seguidores_miles aplasta al resto.

4. Naive Bayes: rápido pero exagerado

GaussianNB supone columnas independientes dentro de cada clase, y aquí no lo son (energía y acústica tienen correlación −0.833). Al contar la misma evidencia varias veces, el 64.5 % de sus probabilidades en test son extremas (menores que 0.05 o mayores que 0.95), contra 16.8 % de la logística. Su predict_proba no está calibrado, pero ordena razonablemente (AUC 0.792) y sirve como línea base rápida.

5. Validación cruzada y tabla final

cv = StratifiedKFold(5, shuffle=True, random_state=42)
for nombre, modelo in modelos.items():
    s = cross_val_score(make_pipeline(crear_pre(), modelo), X_tr, y_tr, cv=cv, scoring="roc_auc")
    print(nombre, round(s.mean(), 3), round(s.std(), 3))
modeloAUC CVaccuracyprecisionrecallF1AUC test
Logística0.8300.8110.7220.5050.5940.846
SVC RBF0.8260.8190.7400.5240.6140.827
KNN(15)0.8170.8160.7300.5240.6100.820
Árbol(4)0.7850.7950.6970.4470.5440.799
GaussianNB0.7830.7490.5360.6500.5880.792

La logística gana en AUC por validación cruzada y en test; el SVC queda muy cerca. Las desviaciones entre pliegues (de 0.016 a 0.031) son del tamaño de las diferencias entre los tres primeros: están prácticamente empatados, y la logística es la más rápida e interpretable.

6. Mover el umbral

Con umbral 0.3 la logística sube el recall a 0.757 (78 de 103 hits) y baja la precision a 0.542: los falsos positivos pasan de 20 a 66. No hay umbral correcto en abstracto; lo decide el costo de cada error. Los coeficientes muestran a favor genero_reguetón (0.85) y en_playlist (0.68), y en contra duracion_seg (−0.79).

7. Ejercicios

  1. Con el mejor modelo por AUC CV (la logística), el umbral más alto con recall de al menos 0.7: 0.35, con recall 0.718 y precision 0.587.
  2. Explicar por qué GaussianNB queda último en AUC CV aunque tenga el mejor recall con umbral 0.5.
  3. Entrenar el SVC sin escalar y comparar: AUC 0.688 en test y 0.717 por validación cruzada, contra 0.826 con escalado.

Error común: elegir modelo solo por accuracy. Aquí el SVC tiene la mejor accuracy y no es el que mejor ordena.

Recursos