ML Atlas

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.
De la lección 3.2: Validación y validación cruzada ¿Por qué es un error escalar las características con todas las filas antes de la validación cruzada?

Ver la respuesta

Respuesta correcta: Porque información de la validación se filtra al entrenamiento y las puntuaciones salen demasiado optimistas

Cada paso que aprende de los datos debe ajustarse solo con los pliegues de entrenamiento; si no, los pliegues de validación dejan de ser datos no vistos.

De la lección 3.1: Sobreajuste: cuando un modelo memoriza Al aumentar el grado del polinomio, ¿qué le pasa al error de entrenamiento?

Ver la respuesta

Respuesta correcta: Sigue bajando o se mantiene, porque una curva más flexible puede copiar una simple

Un polinomio de grado mayor contiene a todos los de grado menor como caso particular, así que nunca puede ajustarse peor a los puntos de entrenamiento.

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.

Predice y comprueba Una regresión logística aprende a reconocer dígitos escritos a mano con 50 imágenes. Con esas 50 imágenes acierta el 100 %. ¿Cuánto acertará más o menos con dígitos nuevos de validación?
¿Qué tan seguro estás?

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.

1. El entrenamiento da un 100 %, la validación un 82,3 % y la curva de validación sigue subiendo. ¿Qué ayudará con más probabilidad?
Ver la respuesta

Respuesta correcta: Más datos de entrenamiento, porque una brecha grande indica memoria

Brecha grande y validación al alza significan varianza alta. Con todo el entrenamiento el mismo modelo llega al 95,8 % en validación, y la brecha baja a 2,2 puntos.

2. Con 1438 imágenes el modelo difuminado tiene un 86,9 % en entrenamiento y un 85,0 % en validación. ¿Qué hacer?
Ver la respuesta

Respuesta correcta: Pasar a un modelo más rico, porque las dos curvas se juntaron abajo

Es sesgo alto: la validación no saltará por encima del entrenamiento, y este solo tiene un 86,9 %. El modelo con los 64 píxeles llega al 95,8 % con los mismos datos.

3. ¿Por qué la exactitud en entrenamiento baja cuando crecen los datos de entrenamiento?
Ver la respuesta

Respuesta correcta: Porque memorizar cada ejemplo es cada vez más difícil, y el modelo generaliza

Con 50 imágenes el modelo las acierta todas, con 1438 acierta el 98,0 %. La validación, en cambio, sube del 82,3 % al 95,8 %.

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.

Para profesionales
  • En scikit-learn las curvas salen de learning_curve (con validación cruzada) y LearningCurveDisplay. Para clasificación usa StratifiedKFold, 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.

Profundiza en el Atlas

Entradas de la enciclopedia sobre las ideas de esta lección: