# machine-learning-clasico-con-python
Machine Learning con scikit-learn y XGBoost
Volver a la portada del cursoNotebook: 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 conC.
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))
| modelo | AUC CV | accuracy | precision | recall | F1 | AUC test |
|---|---|---|---|---|---|---|
| Logística | 0.830 | 0.811 | 0.722 | 0.505 | 0.594 | 0.846 |
| SVC RBF | 0.826 | 0.819 | 0.740 | 0.524 | 0.614 | 0.827 |
| KNN(15) | 0.817 | 0.816 | 0.730 | 0.524 | 0.610 | 0.820 |
| Árbol(4) | 0.785 | 0.795 | 0.697 | 0.447 | 0.544 | 0.799 |
| GaussianNB | 0.783 | 0.749 | 0.536 | 0.650 | 0.588 | 0.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
- 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.
- Explicar por qué GaussianNB queda último en AUC CV aunque tenga el mejor recall con umbral 0.5.
- 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.