Machine learning desde cero · Lección 5.6 · 31 de 33 lecciones listas · 12 min
¿Qué modelo y cuándo?
En pocas palabras
Cinco modelos, cinco conjuntos, 20 particiones. Ningún modelo está en cabeza en todas partes, y 0,3 puntos pueden ser un empate: 10 contra 7.
Calentamiento Dos preguntas de lecciones anteriores. Un minuto, y no bloquea la lección.
Ya conoces cinco familias de modelos: la regresión logística, los k vecinos más cercanos (kNN), el bosque aleatorio, el gradient boosting y la SVM con núcleo RBF. ¿Cuál elegir? La respuesta honesta: el que mejor rinda en validación con tus datos. Esta lección comprueba cuánto depende el resultado de los datos y cómo distinguir una diferencia real del ruido. Montamos un zoo de modelos: cada uno de los cinco modelos con su configuración por defecto, sin ajustar, en cinco conjuntos, y en cada conjunto con las mismas 20 particiones. Cada vez el 75% de las filas va al aprendizaje y el 25% a la validación.
Elige una respuesta y tu grado de seguridad.
Responde para desbloquear el experimento.
Experimento interactivo
Este experimento interactivo funciona en un navegador con JavaScript activado. El texto que lo rodea describe lo que muestra.
Ver la respuesta
Respuesta correcta: No: la SVM gana a la regresión en los dígitos y pierde con ella en los pingüinos
No. En los dígitos la SVM acierta más que la regresión logística en 17 particiones de 20, y la regresión más que la SVM en 3. En los pingüinos la regresión acierta más en 9 particiones, la SVM en ninguna, y en 11 hay empate. La mejor media también la tienen modelos distintos en conjuntos distintos, pero en cuatro conjuntos el líder acierta más que el segundo como mucho en 10 de 20 particiones. Quién va en cabeza ahí depende en gran parte de las particiones.
Prueba
- Al empezar: dígitos, kNN contra SVM. La diferencia de medias es menor que la dispersión de kNN entre particiones. ¿En cuántas de las 20 particiones acierta más la SVM?
- Pasa a los tumores de mama y compara la SVM con el gradient boosting. ¿Cuánto difieren las medias y cómo se reparten las particiones?
- Encuentra una pareja de modelos en la que uno va en cabeza en los dígitos y el otro en los pingüinos.
- En cada conjunto mira lo lejos que quedan la peor y la mejor partición de un mismo modelo.
Cuando lo hayas comprobado en el lab, pongamos nombre a lo que ves.
La idea en palabras sencillas
El mismo modelo en el mismo conjunto da resultados distintos en particiones distintas, porque a la validación llegan unas veces ejemplos más fáciles y otras más difíciles. En los tumores de mama la regresión logística logra entre el 89,4% y el 96,5% en particiones sueltas. Las diferencias entre modelos suelen ser mucho menores. Así que una partición no basta para ordenarlos.
Es mejor comparar los modelos por pares: en la misma partición los dos lo tienen igual de fácil o igual de difícil. Contamos en cuántas particiones acierta más cada uno. En los tumores la SVM logra de media un 94,2% y el gradient boosting un 93,9%. La SVM acierta más en 10 particiones, el boosting en 7, y en 3 hay empate. Una diferencia así, de 0,3 puntos, es un empate, no una victoria. También puede pasar lo contrario. En los dígitos la SVM supera a kNN en solo 0,7 puntos, mientras que el resultado de kNN salta entre particiones del 96,0% al 99,1%. Aun así, la SVM acierta más en 16 particiones de 20, y kNN en 2. Lo que cuenta es si la ventaja se repite, no lo grande que sea la media.
¿Cuándo se repite una ventaja? Si los dos modelos fueran igual de buenos, cada partición sin empate sería como lanzar una moneda. Una moneda da 16 a 2 menos de una vez en 100 series, y 10 a 7 a menudo. El lab llama repetida a una ventaja cuando un resultado así saldría menos de una vez en 100 series. Es la prueba de los signos. Los empates no le pesan: sencillamente no se cuentan.
Lo más importante: el orden depende de los datos. En los dígitos la SVM acierta más que la regresión logística en 17 particiones de 20, y la regresión más que la SVM en 3. En los pingüinos es al revés: la regresión acierta más en 9 particiones, la SVM en ninguna, y en 11 hay empate. Las dos ventajas pasan la prueba de los signos. En los dígitos la SVM acierta más que cada uno de los otros modelos en al menos 16 particiones.
Todo esto con la configuración por defecto, sin ajustar, en conjuntos pequeños (de 150 a 1797 filas) y solo con variables numéricas. No es un veredicto sobre los modelos en general. En tablas más grandes, con variables de distinto tipo y tras ajustar, el orden puede ser otro (del boosting habla la lección 5.3). La conclusión es otra: un ranking no se copia de la tabla de otro, se comprueba con tus datos.
También es fácil sobrevalorar al líder. Toma el modelo con la mejor media en las particiones 1–10 y mira quién va en cabeza en las particiones 11–20. En los iris, los vinos y los pingüinos ahí va en cabeza otro modelo. Cuando varios modelos están cerca, el ruido decide en buena parte cuál queda primero, como al elegir la configuración en la lección 3.5.
Jak to policzono
- Datos: Iris (Fisher, 1936), Wine (Aeberhard y Forina, 1992), Breast Cancer Wisconsin (Wolberg et al., 1993; 10 medidas «mean») y Digits (Alpaydin y Kaynak, 1998), todos de UCI con licencia CC BY 4.0; Palmer Penguins (Gorman et al., 2014; Horst et al., 2020; licencia CC0 1.0), 342 pingüinos con 4 medidas corporales.
- Modelos: configuración por defecto de scikit-learn, sin ajustar. Regresión logística (C = 1), kNN (k = 5), bosque aleatorio (100 árboles), gradient boosting (100 árboles, paso 0,1, profundidad 3), SVM con núcleo RBF (C = 1). La regresión, kNN y la SVM reciben variables escaladas en cada partición solo con la parte de aprendizaje.
- Concordancia con scikit-learn en las mismas 20 particiones: la SVM acierta las mismas filas en cada partición, la regresión y kNN difieren como mucho en 3 filas por partición. Los árboles del lab cortan cada variable en como mucho 32 intervalos, mientras que scikit-learn construye árboles exactos, así que aquí las diferencias son mayores: en los tumores el bosque da el mismo resultado en 3 particiones de 20, y el boosting en 4. Con árboles exactos la mejor media en los tumores es la del boosting, no la de la SVM. Las conclusiones sobre parejas de esta lección salen iguales en las dos versiones.
- Particiones: 20 particiones estratificadas, 75% para aprender y 25% para validar, las mismas para cada modelo. Aquí no hay prueba. Los 500 resultados los calculó el código del lab, y el test los recalcula desde cero. La prueba de los signos es bilateral, sobre las particiones sin empate, con un umbral del 1%.
Por qué funciona
El teorema «no hay almuerzo gratis» (Wolpert, 1996) dice que, promediado sobre todas las tareas posibles, ningún algoritmo de aprendizaje es mejor que otro. Un modelo gana solo cuando sus supuestos encajan con los datos concretos: fronteras rectas para la regresión logística, vecinos parecidos para kNN, umbrales en variables sueltas para los árboles. Por eso elegir un modelo es una medición, no un saber de tabla.
Comparar por pares funciona porque la dificultad de una partición afecta a los dos modelos a la vez y se anula en la diferencia. Un aviso: 20 particiones del mismo conjunto comparten filas, así que no son 20 lanzamientos de moneda independientes. Las pruebas estadísticas habituales sobre estos resultados tienden a ser demasiado seguras (Dietterich, 1998). Por eso el umbral es estricto, y una ventaja repetida es una buena guía, no una demostración.
Un modelo también puede tener su propio azar. El bosque sortea filas y variables para cada árbol. En los dígitos, con las mismas 20 particiones, el bosque con semilla aleatoria 1 acierta más que la regresión en 15 particiones y menos en 5, y con la semilla 4 más en 11 y menos en 9. Con ninguna semilla de 1 a 5 esta ventaja pasa la prueba de los signos. Por eso los ejemplos de esta lección se apoyan en modelos sin azar: la regresión, kNN y la SVM.
El código de abajo hace lo mismo en scikit-learn, con otras particiones y con árboles exactos. La cabeza cambia: allí la SVM tiene la mejor media en cuatro conjuntos y la regresión logística en los pingüinos. La dirección de las parejas de esta lección se mantiene, pero no toda ventaja pasa allí la prueba de los signos. Otra razón para no llamar victoria a diferencias dentro del ruido.
Un error frecuente
Verdadero o falso: «un modelo con una media 0,3 puntos más alta es mejor». Falso. En los tumores la SVM logra un 94,2% y el gradient boosting un 93,9%, pero la SVM acierta más solo en 10 particiones de 20, y el boosting en 7. En el código de abajo la misma pareja se reparte las particiones 10 a 7, y la diferencia de medias es 0,002.
Otro error frecuente: «usa siempre boosting, por ejemplo XGBoost». En este zoo, con la configuración por defecto, en los vinos la regresión logística acierta más que el gradient boosting en 15 particiones de 20, y el boosting más que ella en 2. No es un veredicto contra el boosting, sino contra elegir sin validar.
Test
Tres preguntas para comprobar lo aprendido. Elige una respuesta o despliega la solución bajo cada pregunta. Con el teclado: las flechas eligen, Enter o Espacio confirma.
Ideas clave
- Ningún modelo está en cabeza en todas partes: la SVM gana a la regresión logística en los dígitos (17 particiones contra 3) y pierde en los pingüinos (9 contra 0).
- La partición sola mueve el resultado unos cuantos puntos, así que 0,3 puntos de diferencia entre medias pueden ser un empate (10 particiones contra 7).
- Compara los modelos en las mismas particiones y cuenta en cuántas gana cada uno; una ventaja pequeña pero repetida también cuenta (la SVM frente a kNN en los dígitos: 0,7 puntos, 16 a 2).
- Elige por validación con tus datos, ante un empate toma el modelo más simple y mira la prueba una vez, al final.
Más a fondo: fórmula, código, práctica
Las matemáticas
Para las particiones k = 1, …, K la diferencia en una pareja es d_k = acc_A(k) − acc_B(k); miramos la media d̄ = (1/K) · Σ_k d_k y el número de particiones con d_k > 0.
Varianza de la diferencia: Var(A − B) = Var(A) + Var(B) − 2 · Cov(A, B). Cuando una partición es difícil para los dos modelos a la vez, la covarianza es grande, así que la diferencia varía mucho menos que cada resultado por separado.
Prueba de los signos: el modelo A gana en w particiones, B en l, sin contar empates. Con modelos igual de buenos, el número de victorias de A sigue Bin(w + l, ½), y p = min(1, 2 · P(X ≤ min(w, l))). Para 16 a 2 sale p ≈ 0,001.
En código (Python)
El mismo experimento en scikit-learn: cinco modelos con su configuración por defecto en cinco conjuntos y 20 particiones, y después cuatro parejas partición a partición, con la prueba de los signos.
import pandas as pd
from scipy.stats import binomtest
from sklearn.datasets import load_iris, load_wine, load_breast_cancer, load_digits
from sklearn.model_selection import StratifiedShuffleSplit, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.svm import SVC
body = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]
peng = pd.read_csv("data/raw/penguins.csv").dropna(subset=body)
cancer = load_breast_cancer()
data = {"iris": load_iris(return_X_y=True), "wine": load_wine(return_X_y=True), "cancer": (cancer.data[:, :10], cancer.target),
"penguins": (peng[body].values, peng["species"].values), "digits": load_digits(return_X_y=True)}
# el escalador está dentro de cada pipeline, así que aprende sus medias solo con la parte de aprendizaje de cada partición
models = {"logistic": make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000)),
"kNN": make_pipeline(StandardScaler(), KNeighborsClassifier()),
"forest": RandomForestClassifier(random_state=0),
"boosting": GradientBoostingClassifier(random_state=0),
"SVM": make_pipeline(StandardScaler(), SVC())}
splits = StratifiedShuffleSplit(n_splits=20, test_size=0.25, random_state=0)
acc = {}
for name, (X, y) in data.items():
acc[name] = {m: cross_val_score(model, X, y, cv=splits) for m, model in models.items()}
row = " | ".join(f"{m} {a.mean():.3f}" for m, a in acc[name].items())
best = max(acc[name], key=lambda m: acc[name][m].mean())
print(f"{name:8s} {row} best: {best}")
# prueba de los signos: solo las particiones sin empate; con modelos igual de buenos, cada una sería lanzar una moneda
for name, a, b in [("digits", "SVM", "kNN"), ("digits", "SVM", "logistic"), ("penguins", "logistic", "SVM"), ("cancer", "SVM", "boosting")]:
d = acc[name][a] - acc[name][b]
win, lose = (d > 0).sum(), (d < 0).sum()
print(f"{name}: {a} beats {b} in {win} of 20 splits, loses in {lose}; sign test p = {binomtest(win, win + lose).pvalue:.3f}; mean difference {d.mean():.3f}")
Resultado
iris logistic 0.955 | kNN 0.945 | forest 0.949 | boosting 0.947 | SVM 0.959 best: SVM
wine logistic 0.982 | kNN 0.964 | forest 0.981 | boosting 0.946 | SVM 0.986 best: SVM
cancer logistic 0.931 | kNN 0.938 | forest 0.930 | boosting 0.939 | SVM 0.942 best: SVM
penguins logistic 0.988 | kNN 0.985 | forest 0.978 | boosting 0.973 | SVM 0.983 best: logistic
digits logistic 0.969 | kNN 0.974 | forest 0.975 | boosting 0.964 | SVM 0.979 best: SVM
digits: SVM beats kNN in 14 of 20 splits, loses in 4; sign test p = 0.031; mean difference 0.006
digits: SVM beats logistic in 17 of 20 splits, loses in 3; sign test p = 0.003; mean difference 0.010
penguins: logistic beats SVM in 7 of 20 splits, loses in 1; sign test p = 0.070; mean difference 0.005
cancer: SVM beats boosting in 10 of 20 splits, loses in 7; sign test p = 0.629; mean difference 0.002
Las particiones y la implementación de los árboles son distintas de las del lab, así que la cabeza también: la SVM tiene la mejor media en cuatro conjuntos, y la regresión logística en los pingüinos. Tampoco aquí gana ningún modelo en todas partes. La dirección de las parejas de la lección se mantiene: en los dígitos la SVM gana a la regresión en 17 particiones de 20 y a kNN en 14, y en los pingüinos la regresión gana a la SVM en 7 y pierde en 1. Aquí solo la primera pareja pasa la prueba de los signos (p = 0,003). Las otras dos tienen la misma dirección, pero pocas victorias en estas particiones, así que una conclusión sacada de un juego de particiones conviene comprobarla en otro. La SVM y el boosting en los tumores vuelven a repartirse las particiones 10 a 7.
Descargar el notebook (.ipynb). Ábrelo en Jupyter o súbelo a Google Colab; descarga por sí solo los datos que falten.
Para profesionales
- Empieza con una referencia (lección 1.3) y luego toma varios modelos de distinto tipo: lineal, vecinos, árboles, núcleo. Evalúalos todos con las mismas particiones (
cross_validatecon un solocv) y con el preprocesamiento en un pipeline (lección 4.6). - Mira la dispersión y las parejas, no solo las medias. Comprueba una ventaja con la prueba de los signos (
binomtestde SciPy) en las particiones sin empate. Ante un empate elige el modelo más barato de mantener o más fácil de explicar. - Ajusta solo a los finalistas (lección 3.5). La configuración por defecto puede quedar lejos de la mejor, sobre todo en el boosting y las SVM.
- Trata los rankings de «qué modelo y cuándo» de internet como una lista de candidatos para validar, no como un veredicto. Guarda la prueba para el final y mírala una vez.
¿Te ha sido útil?
¡Gracias! Nos ayuda a mejorar.
Profundiza en el Atlas
Entradas de la enciclopedia sobre las ideas de esta lección: