Machine learning desde cero · Lección 0.1 · 1 de 33 lecciones listas · 15 min
Todo el proceso en 15 minutos, de principio a fin
En pocas palabras
El camino completo de un proyecto de machine learning con un solo conjunto de datos, de la pregunta a la evaluación. Sin referencia, el resultado no dice nada.
Antes de aprender las partes, mira el juego completo. Así se aprende el fútbol: primero un partido, luego los ejercicios de pase. En esta lección recorres un proyecto entero de machine learning en un cuarto de hora, con un solo conjunto de datos: pingüinos de tres especies, medidos por investigadores en islas frente a la costa de la Antártida. Cada módulo posterior del curso abre uno de los seis pasos que aquí ves a la vez.
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: A casi todos, más de 9 de cada 10
Dos preguntas aciertan 98 de 103 (95,1 %), una pregunta 81 (78,6 %). Adivinar sin más, «siempre Adelie», sin ningún modelo, acierta 45 veces (43,7 %), y eso es lo que dice si 95,1 % es mucho. Una tercera pregunta no ayuda: 96 de 103 (93,2 %).
Prueba esto
- Pon 0 preguntas. Es adivinar sin modelo: ¿a cuántos pingüinos les encaja «siempre Adelie»?
- Pasa a 1 y luego a 2 preguntas. Lee las preguntas del árbol bajo el gráfico: ¿sobre qué medidas pregunta?
- Con 2 preguntas, mueve el control de la partición. ¿Hay alguna partición en la que desaparezca la ventaja sobre adivinar?
- Vuelve a la partición 1 y pon 3 preguntas. ¿Una pregunta más ayuda siempre?
Cuando lo hayas comprobado en el lab, pongamos nombre a los pasos que acabas de recorrer.
La idea en pocas palabras
Todo proyecto de machine learning, de los pingüinos a la detección de fraude en un banco, pasa por los mismos seis pasos:
- Pregunta. ¿Qué predices exactamente y a partir de qué? Aquí: la especie de un pingüino a partir de cuatro medidas del cuerpo. Una buena pregunta se puede comprobar, porque conocemos la especie real.
- Datos. El archivo tiene 344 pingüinos, pero 2 no tienen ninguna medida, así que quedan 342. El sexo falta en 11 filas. Si quitáramos toda fila con algún hueco quedarían 333, pero aquí no usamos el sexo, así que solo perdemos esos 2.
- Partición. 103 pingüinos, es decir el 30 %, se esconden del modelo. El modelo aprende con los otros 239 y solo lo probamos con los escondidos. La parte para aprender es el conjunto de entrenamiento; la parte escondida, el conjunto de prueba.
- Referencia. Antes de construir un modelo, cuenta cuánto logra una respuesta sin pensar. Entre los pingüinos de aprendizaje el más común es Adelie, así que «siempre Adelie» acierta 45 de los 103 de prueba: 43,7 %.
- Modelo. Un árbol de decisión es una serie de preguntas de sí o no. Con dos preguntas, primero pregunta por la aleta (hasta 207 mm o más larga) y luego por la longitud o la profundidad del pico.
- Evaluación. El árbol acierta 98 de 103, es decir el 95,1 %: 51,5 puntos más que adivinar.
Los módulos siguientes del curso abren estos pasos uno a uno: cómo aprende un modelo de ejemplos y con qué compararlo (módulo 1), cómo medir un resultado (módulo 2), si el resultado aguanta datos nuevos (módulo 3), qué estropea los datos (módulo 4), qué modelos elegir (módulo 5) y qué le pasa a un modelo en el mundo real (módulo 6).
Jak to policzono
- Datos: Palmer Penguins (Gorman, Williams y Fraser, 2014; paquete palmerpenguins: Horst, Hill y Gorman, 2020), licencia CC0. 344 pingüinos en el archivo, 342 con las cuatro medidas.
- Partición: 70/30 con la misma mezcla de especies en ambas partes; la partición 1 es la misma que
train_test_split(test_size=0.3, stratify=y, random_state=1)en scikit-learn. - Modelo: árbol de decisión (CART, índice de Gini), como mucho 1, 2 o 3 preguntas en cada camino.
- Referencia: la especie más común entre los pingüinos de aprendizaje.
Por qué funciona
El resultado con los pingüinos escondidos significa algo porque el modelo no los ha visto. Probado con los pingüinos de aprendizaje, podría limitarse a recordar las respuestas. Por eso el árbol con tres preguntas logra 97,5 % con los pingüinos de aprendizaje, pero solo 93,2 % con los escondidos, menos que el árbol con dos preguntas. La tercera pregunta empezó a aprender pingüinos concretos en lugar de una regla. Eso es sobreajuste, el tema del módulo 3.
El árbol funciona tan bien porque las especies tienen de verdad cuerpos distintos. Los Gentoo tienen aletas largas, así que la primera pregunta casi los separa: entre los pingüinos de aprendizaje con aleta de más de 207 mm, 85 de 91 son Gentoo. Entre las aletas más cortas, un pico largo delata a un Chinstrap y uno corto a un Adelie: en el grupo con aleta de hasta 207 mm y pico de hasta 43,4 mm, 101 de 103 pingüinos de aprendizaje son Adelie.
La referencia hace falta porque la exactitud depende de la tarea. Con tres especies, tirar un dado acertaría una vez de cada tres, y «siempre la especie más común» acierta el 43,7 %. Un modelo solo tiene sentido si supera con claridad esa respuesta simple.
Una partición es un sorteo. En 20 particiones del lab, dos preguntas aciertan entre 94 y 100 de los 103 pingüinos (de 91,3 % a 97,1 %), y adivinar logra 43,7 % siempre. La ventaja se mantiene, aunque el número exacto cambie.
Error frecuente
¿Verdadero o falso?: «Una exactitud del 95 % es un resultado excelente». Falso, o mejor dicho: el número solo no lo dice. La exactitud depende de las proporciones de las clases y de lo fácil que sea la tarea. Aquí adivinar da 43,7 %, así que 95,1 % es una mejora enorme. Pero si 95 de cada 100 correos son mensajes normales, un filtro que no hace nada y deja pasar todos los correos también tiene un 95 % de exactitud y no atrapa ningún spam. Primero la referencia, luego el entusiasmo.
Dónde falla la analogía: un partido de fútbol tiene final, y un proyecto rara vez va en línea recta. Tras la evaluación sueles volver a la pregunta o a los datos, porque el resultado mostró lo que falta.
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
- Todo proyecto de machine learning pasa por los mismos pasos: pregunta, datos, partición, referencia, modelo y evaluación.
- Un modelo se juzga con datos que no ha visto; el resultado con los datos de aprendizaje está inflado.
- Un número sin referencia no dice nada: 95,1 % es mucho porque adivinar sin más da 43,7 %.
- Una partición es un sorteo, así que comprueba el resultado con varias.
Más a fondo: fórmula, código, práctica
Las matemáticas
La exactitud es la proporción de respuestas correctas: exactitud = correctas / todas. Adivinar «siempre Adelie» da 45 / 103 ≈ 0,437, y el árbol con dos preguntas 98 / 103 ≈ 0,951. La diferencia es 98 / 103 − 45 / 103 = 53 / 103 ≈ 0,515, es decir, 51,5 puntos.
La respuesta «siempre la clase más común» tiene una exactitud igual a la proporción de esa clase en el conjunto de prueba. Los Adelie son 151 de 342 pingüinos (44,2 %); la partición conserva la mezcla de especies, así que en la prueba hay 45 de 103. Elegir al azar una de las tres especies acertaría de media 1 / 3 ≈ 33,3 % de las veces.
Un árbol de profundidad d divide los datos en como mucho 2^d grupos: con 2 preguntas son 4 grupos, y cada uno predice la especie que domina en él entre los pingüinos de aprendizaje.
En código (Python)
El mismo experimento en scikit-learn: la partición 1 del lab, la referencia, árboles de profundidad 1–3 y el árbol de dos preguntas en 100 particiones distintas. El notebook enlazado bajo el resultado descarga los datos por sí solo.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
df = pd.read_csv("data/raw/penguins.csv")
cols = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]
d = df.dropna(subset=cols) # solo pingüinos con todas las medidas
print(f"penguins {len(df)}, with measurements {len(d)}, without any gap {len(df.dropna())}")
X, y = d[cols], d["species"]
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, stratify=y, random_state=1)
guess = ytr.value_counts().idxmax() # referencia: la especie más común entre los de aprendizaje
print(f"train {len(Xtr)}, test {len(Xte)}; always {guess}: {(yte == guess).sum()} of {len(yte)} = {(yte == guess).mean():.3f}")
for depth in (1, 2, 3):
tree = DecisionTreeClassifier(max_depth=depth, random_state=0).fit(Xtr, ytr)
print(f"depth {depth}: {(tree.predict(Xte) == yte).sum()} of {len(yte)} = {tree.score(Xte, yte):.3f} (train {tree.score(Xtr, ytr):.3f})")
scores = []
for seed in range(100): # 100 particiones al azar distintas
a, b, c, e = train_test_split(X, y, test_size=0.3, stratify=y, random_state=seed)
scores.append(DecisionTreeClassifier(max_depth=2, random_state=0).fit(a, c).score(b, e))
print(f"depth 2 on 100 splits: mean {sum(scores) / 100:.3f}, min {min(scores):.3f}, max {max(scores):.3f}")
Resultado
penguins 344, with measurements 342, without any gap 333
train 239, test 103; always Adelie: 45 of 103 = 0.437
depth 1: 81 of 103 = 0.786 (train 0.791)
depth 2: 98 of 103 = 0.951 (train 0.967)
depth 3: 96 of 103 = 0.932 (train 0.975)
depth 2 on 100 splits: mean 0.949, min 0.883, max 0.990
Con la partición 1 los resultados son los mismos que en el lab. En 100 particiones distintas, el árbol de dos preguntas acierta de media el 94,9 %, en el peor caso el 88,3 % y en el mejor el 99,0 %, y adivinar logra 43,7 % siempre.
Descargar el notebook (.ipynb). Ábrelo en Jupyter o súbelo a Google Colab; descarga por sí solo los datos que falten.
Para profesionales
- Empieza siempre por una referencia. En scikit-learn lo hace
DummyClassifier(strategy="most_frequent"); en regresión, la media. - Esconde el conjunto de prueba al principio y no lo mires mientras eliges el modelo. Para elegir está la validación (módulo 3).
- Si las clases tienen tamaños distintos, parte con estratificación (
stratify=y), para que ambas partes conserven las proporciones. - Da el resultado de varias particiones o de validación cruzada, no un número de un solo sorteo.
- Anota la semilla aleatoria (
random_state) para que otros puedan reproducir el resultado, y revisa la licencia de los datos antes de usarlos.
¿Te ha sido útil?
¡Gracias! Nos ayuda a mejorar.
Profundiza en el Atlas
Entradas de la enciclopedia sobre las ideas de esta lección: