Subajuste y sobreajuste
Parte de la sección Aprendizaje supervisado del Journey de Machine Learning de Coddy. Lección 32 de 58.
Te has encontrado con la mayor trampa del aprendizaje automático: k = 1 y árboles profundos memorizados. Este capítulo le pone nombre y termina con gráficos como este:
La trampa: 15 plantas de albahaca, regadas de manera diferente, y tres curvas ajustadas a su cosecha:
El grado 1 es demasiado simple: subajuste. El grado 12 pasa por cada punto de entrenamiento, oscilando entre ellos: sobreajuste, memoriza, no aprende.
np.polyval(coefs, x) da las alturas de una curva. RMSE de entrenamiento y de prueba, en gramos:
for degree in [1, 3, 12]:
coefs = np.polyfit(water_train, grams_train, degree)
train_err = np.sqrt(mean_squared_error(grams_train, np.polyval(coefs, water_train)))
test_err = np.sqrt(mean_squared_error(grams_test, np.polyval(coefs, water_test)))
print(degree, round(train_err), round(test_err))Imprime:
1 156 138
3 15 19
12 9 173La señal del sobreajuste: poco error de entrenamiento, mucho error de prueba.
Desafío
IntermedioUn parque eólico modela la potencia de una turbina a partir de la velocidad del viento. El código inicial divide sus 24 mediciones y lee max_degree.
- Para cada grado del 1 a
max_degree, ajusta una curva con las filas de entrenamiento; imprime su RMSE de entrenamiento y de prueba en kW enteros. - Imprime el primer grado cuyo error de prueba sea más del doble de su error de entrenamiento, o
No overfitting up to degreeymax_degree.
Para otra turbina y 7:
Degree 1: train 117 kW, test 172 kW
Degree 2: train 115 kW, test 182 kW
Degree 3: train 64 kW, test 85 kW
Degree 4: train 63 kW, test 79 kW
Degree 5: train 47 kW, test 67 kW
Degree 6: train 47 kW, test 65 kW
Degree 7: train 23 kW, test 85 kW
Overfitting starts at degree 7Pruébalo tú mismo
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
max_degree = int(input())
# No cambies las líneas siguientes: velocidad del viento (m/s) y potencia (kW) de un aerogenerador
speed = np.array([3.8, 4.3, 5.1, 5.6, 5.6, 6.7, 6.8, 7.2, 7.8, 8.5, 8.9, 9.1,
10.2, 10.9, 11.4, 11.9, 12.2, 12.4, 12.6, 13.2, 13.9, 14.4, 15.5, 16.5])
power = np.array([0, 85, 179, 22, 17, 126, 255, 273, 419, 545, 612, 665,
913, 1120, 1114, 1227, 1299, 1400, 1293, 1329, 1396, 1493, 1461, 1552])
speed_train, speed_test, power_train, power_test = train_test_split(
speed, power, test_size=0.25, random_state=0)
# Escribe tu código a continuación
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Aprendizaje supervisado
1Tu primer modelo
Aprender de ejemplosConjuntos de entrenamiento y pruebaAjustar y predecirEvaluar un modeloRepaso: clasificador de semillas4Regresión logística
Predicciones de sí o noEl umbral de decisiónLos pesos como evidenciaVarias clasesRepaso: filtro de spam7Sobreajuste
Subajuste y sobreajusteCurvas de aprendizajeRegularizaciónConjuntos de validaciónRepaso: Ajustar un árbol2Vecinos más cercanos
Cómo decide k-NNCómo elegir kFronteras de decisiónEscalado para los vecinosRepaso: vecinos del vino5Medición de clasificadores
La matriz de confusiónPrecisión y exhaustividadLa puntuación F1Clases desequilibradasCurvas ROCRepaso: prueba de detección8Validación cruzada
Validación K-FoldComparación justa de modelosBúsqueda en cuadrículaRepaso: reparaciones de monopatines11Proyecto: especies de pingüinos
Conoce a los pingüinosPrepara los datosElige un modeloAjusta el modelo ganadorPublica el modelo3Regresión lineal
Predicción de númerosVarias característicasMedición de erroresGráficos de residuosRepaso: alquiler de bicicletas6Árboles de decisión
Los árboles hacen preguntasLeer un árbolProfundidad del árbolImportancia de las característicasRepaso: decisiones de préstamosPractica por tu cuenta: Compilador de Python online