Un 100 % en casa, un 60 % fuera
Una cadena de hoteles de la costa quiere saber qué reservas se cancelarán.
El primer modelo acierta el 100 % de las reservas del año pasado. Con las reservas de este mes, solo el 60 %.
No ha aprendido a predecir cancelaciones. Se ha aprendido las reservas antiguas de memoria.
Al final de esta lección
Nota
Puedo reconocer un modelo que se ha aprendido los ejemplos de memoria.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Sobreajuste | el modelo memoriza los ejemplos y falla con casos nuevos | |
| Subajuste | el modelo es tan simple que falla en todo | |
| Generalizar | acertar con casos que no ha visto | |
| Brecha | la diferencia entre entrenamiento y prueba | 100 % − 60 % = 40 puntos |
| Ruido | casos raros que no siguen la regla |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Memorizar no es aprender
Un modelo con sobreajuste se aprende cada ejemplo, incluso los casos raros. Los casos raros se llaman ruido.
Con los datos de entrenamiento acierta casi todo. Con datos nuevos falla mucho.
La señal es la brecha: la exactitud de entrenamiento menos la de prueba. Si la brecha es grande, el modelo no sabe generalizar.
Ejemplo resuelto: tres modelos de cancelaciones
| Modelo | Entrenamiento | Prueba | Brecha | Diagnóstico |
|---|---|---|---|---|
| A | 100 % | 60 % | 40 puntos | Sobreajuste |
| B | 88 % | 85 % | 3 puntos | Bien |
| C | 55 % | 52 % | 3 puntos | Subajuste |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Memoria frente a una regla sencilla
# Reservas de un hotel: [días de antelación, ¿cancelada?]
train = [[2, False], [30, True], [5, False], [45, True],
[60, True], [3, False], [10, True]]
test = [[40, True], [4, False], [31, True], [50, True]]
# Modelo 1: se aprende cada reserva de memoria.
memory = {}
for row in train:
memory[row[0]] = row[1]
def memorised(days):
if days in memory:
return memory[days]
return False # nunca la ha visto: responde lo de siempre
# Modelo 2: una regla sencilla.
def simple(days):
return days > 20
def accuracy(model, rows):
right = 0
for row in rows:
if model(row[0]) == row[1]:
right = right + 1
return right * 100 // len(rows)
print("Memoria: entrenamiento", accuracy(memorised, train), "%, prueba", accuracy(memorised, test), "%")
print("Regla: entrenamiento", accuracy(simple, train), "%, prueba", accuracy(simple, test), "%")
Un error frecuente
Advertencia
Mucha gente cree que un 100 % en entrenamiento es la mejor noticia posible. Casi nunca lo es: los datos reales tienen ruido, y acertarlo todo suele ser memoria. Mira siempre la exactitud de prueba antes de celebrar nada.
Qué hacer en cada caso
Ante el sobreajuste tienes tres salidas habituales. Consigue más ejemplos. Usa un modelo más sencillo. O para el entrenamiento antes, cuando la prueba deja de mejorar.
El subajuste es lo contrario. El modelo falla incluso en entrenamiento, porque es demasiado simple. Ahí sirve un modelo más completo o mejores características.