Machine learning desde cero · Lección 3.3 · 16 de 33 lecciones listas · 12 min
Curvas de aprendizaje: ¿más datos o un modelo mejor?
En pocas palabras
Las curvas de aprendizaje muestran la nota en entrenamiento y validación al crecer los datos. Su forma dice si reunir más datos o pasar a un modelo más rico.
Calentamiento Dos preguntas de lecciones anteriores. Un minuto, y no bloquea la lección.
En la lección 3.1 el modelo era demasiado simple o demasiado complejo, con la misma cantidad de datos. Hoy cambias la cantidad de datos. Es una pregunta diaria de quien practica: el modelo funciona regular, ¿reúnes más ejemplos o cambias de modelo? La respuesta la da una curva de aprendizaje: la nota en entrenamiento y en validación, dibujada para un conjunto de entrenamiento cada vez mayor.
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: Alrededor del 82 %, más de diez puntos menos que en sus imágenes
La validación da un 82,3 % (media de 5 sorteos de 50 imágenes), así que la brecha es de 17,7 puntos. Con todo el entrenamiento, 1438 imágenes, la validación sube al 95,8 % y la brecha baja a 2,2 puntos. Con pocos datos, el 100 % en entrenamiento es en gran parte memoria.
Prueba esto
- Con el modelo detallado, mueve el control de 50 a 1438 imágenes. ¿Qué curva cambia más: la de entrenamiento o la de validación?
- Cambia al modelo de dígitos difuminados. ¿Dónde se juntan sus curvas y a qué altura?
- Compara el modelo detallado con 100 imágenes y el difuminado con 1438. ¿Cuál gana?
Cuando lo hayas comprobado en el lab, pongamos nombre a lo que ves.
La idea en pocas palabras
Una curva de aprendizaje son dos líneas: la exactitud con los datos de entrenamiento y en validación, según el número de ejemplos de entrenamiento. Con unas decenas de imágenes el modelo memoriza cada una: el entrenamiento da un 100 % y la validación un 82,3 %. Cuantos más datos, más difícil memorizarlo todo, así que el entrenamiento baja (al 98,0 %) y la validación sube (al 95,8 %). La brecha entre ambas baja de 17,7 a 2,2 puntos.
De la forma de esas líneas lees la decisión:
- Brecha grande y validación que sigue subiendo (varianza alta): el modelo conoce sus datos de entrenamiento mucho mejor que los nuevos. Más datos ayudarán, igual que la regularización.
- Brecha pequeña y las dos líneas abajo (sesgo alto): el modelo es demasiado simple. Las curvas ya se juntaron y más datos casi no ayudarán. Ayudará un modelo más rico o mejores variables.
El modelo de dígitos difuminados ve cada dígito como una imagen de 4 × 4, 16 píxeles en lugar de 64. Con 1438 imágenes tiene un 86,9 % en entrenamiento y un 85,0 % en validación, una brecha de solo 1,9 puntos. La validación normalmente no supera al entrenamiento, y este solo tiene un 86,9 %. El modelo detallado ya llega al 87,6 % con solo 100 imágenes.
Jak to policzono
- Dígitos: Optical Recognition of Handwritten Digits, UCI, licencia CC BY 4.0. 1797 imágenes de 8 × 8 píxeles, 10 dígitos.
- Una partición 80/20 estratificada, la misma que en el widget del Atlas: 1438 imágenes para aprender, 359 para validar. Para cada tamaño, la media de 5 sorteos de qué imágenes se usan para aprender.
- Modelo: regresión logística (softmax) con una penalización de 0,001 a los pesos grandes. El modelo difuminado ve las medias de bloques de 2 × 2 píxeles.
Por qué funciona
En el entrenamiento el modelo ve las respuestas, así que con pocos datos puede memorizarlas. Cada ejemplo nuevo hace más difícil memorizar y más fácil encontrar una regla que también funcione fuera del entrenamiento. Por eso las líneas se acercan: el entrenamiento baja y la validación sube. Se encuentran en el nivel que ese modelo puede alcanzar en absoluto.
Ese nivel depende del modelo, no de los datos. Una imagen difuminada pierde los detalles que distinguen, por ejemplo, un 3 de un 8, y ningún número de ejemplos los devuelve. En el código de abajo el mismo experimento se hace con 50 particiones distintas: con todos los datos el modelo difuminado tiene un 86,4 % en entrenamiento y un 85,1 % en validación, y el detallado un 96,6 % en validación. El modelo detallado con 100 imágenes gana al difuminado con 1437 en 49 particiones de 50.
Error frecuente
¿Verdadero o falso?: «más datos siempre ayudan». Falso. Más datos ayudan cuando el modelo es demasiado potente para la cantidad de datos: entonces la brecha es grande y la validación sigue subiendo. Cuando el modelo es demasiado simple, las curvas se juntan pronto y se quedan planas. En el lab el modelo difuminado tiene un 83,6 % en validación con 400 imágenes y un 85,0 % con un conjunto casi cuatro veces mayor. El modelo detallado tiene un 95,8 % con los mismos datos. Antes de pagar por reunir datos, dibuja una curva de aprendizaje: si la nota de entrenamiento ya es baja, los datos no ayudarán.
Nota: dibuja las curvas en validación o en validación cruzada, no en el conjunto de test. El test se reserva para la evaluación final.
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
- Una curva de aprendizaje es la nota en entrenamiento y en validación para un conjunto de entrenamiento creciente.
- Brecha grande y validación al alza: el modelo memoriza, más datos ayudarán.
- Brecha pequeña con nota baja: el modelo es demasiado simple; ayudará un modelo más rico o mejores variables, no más datos.
- Dibuja la curva antes de pagar por datos; dibújala en validación y guarda el test para el final.
Más a fondo: fórmula, código, práctica
Las matemáticas
Sean A_tr(n) y A_val(n) la exactitud con n ejemplos de entrenamiento y en validación. La curva de aprendizaje son las dos funciones de n. Normalmente A_tr(n) baja, A_val(n) sube y ambas se acercan al mismo nivel A*, la mejor exactitud que alcanza esa familia de modelos.
La brecha A_tr(n) − A_val(n) mide la varianza: cuánto depende la nota de qué ejemplos se usaron para aprender. La distancia 1 − A es el sesgo de esta familia de modelos junto con un ruido que ningún modelo elimina (dígitos ilegibles incluso para una persona): ningún dato la elimina. Más datos reducen la brecha; solo un cambio de modelo sube A.
La regresión logística del lab minimiza L = pérdida media + (λ / 2) · ‖W‖² con λ = 0,001. En scikit-learn la misma penalización es C = 1 / (λ · n) = 1000 / n.
En código (Python)
El mismo experimento en scikit-learn con 50 particiones distintas: un modelo con 64 píxeles y otro con el dígito difuminado a 16 píxeles, con cada vez más imágenes de entrenamiento.
import numpy as np
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
X, y = load_digits(return_X_y=True)
X = X / 16 # 8 × 8 = 64 píxeles de 0 a 1, como en el lab
X16 = X.reshape(-1, 4, 2, 4, 2).mean(axis=(2, 4)).reshape(len(X), -1) # el mismo dígito difuminado a 4 × 4 = 16 píxeles
def run(Z, n, seed):
Xtr, Xva, ytr, yva = train_test_split(Z, y, test_size=0.2, stratify=y, random_state=seed)
i = np.random.default_rng(seed).permutation(len(ytr))[:n] # las primeras n imágenes de entrenamiento tras barajar
m = LogisticRegression(C=1000 / n, max_iter=5000).fit(Xtr[i], ytr[i]) # C = 1000 / n es la penalización 0,001 del lab
return m.score(Xtr[i], ytr[i]), m.score(Xva, yva)
for name, Z in (("64 pixels", X), ("16 pixels", X16)):
for n in (50, 100, 400, 800, 1437):
tr, va = np.mean([run(Z, n, s) for s in range(50)], axis=0) # media de 50 particiones distintas
print(f"{name}, {n} images: training {tr:.1%}, validation {va:.1%}, gap {(tr - va) * 100:.1f} points")
wins = sum(run(X, 100, s)[1] > run(X16, 1437, s)[1] for s in range(50))
print(f"64 pixels from 100 images beat 16 pixels from 1437 images in {wins} of 50 splits")
Resultado
64 pixels, 50 images: training 100.0%, validation 81.2%, gap 18.8 points
64 pixels, 100 images: training 100.0%, validation 89.5%, gap 10.5 points
64 pixels, 400 images: training 99.7%, validation 94.9%, gap 4.8 points
64 pixels, 800 images: training 99.0%, validation 96.0%, gap 2.9 points
64 pixels, 1437 images: training 98.2%, validation 96.6%, gap 1.6 points
16 pixels, 50 images: training 98.5%, validation 72.6%, gap 25.9 points
16 pixels, 100 images: training 94.1%, validation 79.8%, gap 14.4 points
16 pixels, 400 images: training 87.7%, validation 83.8%, gap 3.8 points
16 pixels, 800 images: training 86.9%, validation 84.6%, gap 2.3 points
16 pixels, 1437 images: training 86.4%, validation 85.1%, gap 1.3 points
64 pixels from 100 images beat 16 pixels from 1437 images in 49 of 50 splits
El lab muestra una partición y 5 sorteos, el código 50 particiones, así que los números difieren un poco: con 50 imágenes la validación da un 82,3 % en el lab y un 81,2 % de media. La forma de las curvas y la conclusión son las mismas.
Descargar el notebook (.ipynb). Ábrelo en Jupyter o súbelo a Google Colab; descarga por sí solo los datos que falten.
Para profesionales
- En scikit-learn las curvas salen de
learning_curve(con validación cruzada) yLearningCurveDisplay. Para clasificación usaStratifiedKFold, para que cada tamaño tenga todas las clases. - Dibuja el número de ejemplos en escala logarítmica: así se ve mejor lo que aporta cada duplicación de los datos.
- Una curva de validación (
validation_curve) es otra cosa: la nota según un ajuste del modelo, como la fuerza de la regularización, con los datos fijos. - Antes de reunir datos, estima lo que dará una duplicación: si la última dio una fracción de punto, la siguiente dará aún menos.
¿Te ha sido útil?
¡Gracias! Nos ayuda a mejorar.
Profundiza en el Atlas
Entradas de la enciclopedia sobre las ideas de esta lección: