MAT281 - Laboratorio N°17: Overfitting, Validacion y Generalizacion¶
Objetivos del laboratorio¶
- Comprender el problema de la generalizacion y el compromiso sesgo-varianza.
- Diagnosticar sobreajuste comparando error de train y test.
- Aplicar validacion cruzada para estimar el desempeño real.
- Interpretar curvas de aprendizaje y de validacion.
- Usar regularizacion como estrategia para controlar el overfitting.
Instrucciones¶
Lea con atencion cada problema antes de resolverlo. Reemplace cada celda que contiene # FIXME con su propia solucion y, cuando se solicite, responda las preguntas en celdas de texto.
Nota: Puede apoyarse en asistentes virtuales (ChatGPT, Gemini, Claude) o en el autocompletado de Colab, pero asegurese de entender cada linea de codigo que entregue.
In [ ]:
Copied!
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from sklearn.metrics import mean_squared_error
rng = np.random.default_rng(0)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from sklearn.metrics import mean_squared_error
rng = np.random.default_rng(0)
Problema 01 — Datos sinteticos¶
Generaremos datos a partir de una funcion conocida con ruido, para estudiar el sobreajuste de forma controlada.
Tu tarea:
- Genera
xcon 40 puntos en $[0, 1]$ ey = sin(2*pi*x) + ruidonormal. - Divide en train/test.
- Grafica los puntos y la funcion verdadera.
In [ ]:
Copied!
x = np.sort(rng.uniform(0, 1, size=40))
y = np.sin(2*np.pi*x) + rng.normal(0, 0.2, size=40)
# FIXME
x = np.sort(rng.uniform(0, 1, size=40))
y = np.sin(2*np.pi*x) + rng.normal(0, 0.2, size=40)
# FIXME
Problema 02 — Underfitting vs overfitting¶
Tu tarea:
- Ajusta modelos polinomiales de grados 1, 3, 9 y 15 (usa
make_pipeline(PolynomialFeatures(grado), LinearRegression())). - Grafica los ajustes sobre los datos.
- Pregunta: ¿cual grado subajusta (underfitting) y cual sobreajusta (overfitting)?
In [ ]:
Copied!
# FIXME
# FIXME
Respuesta (Problema 02): (escribe aqui)
Problema 03 — Error de train vs test¶
Tu tarea:
- Para grados de 1 a 15, calcula el RMSE en train y el RMSE en test.
- Grafica ambos en funcion del grado del polinomio.
- Pregunta: identifica la zona de underfitting, el punto optimo y la zona de overfitting. ¿Como se comporta cada curva?
In [ ]:
Copied!
# FIXME
# FIXME
Respuesta (Problema 03): (escribe aqui)
Problema 04 — Validacion cruzada¶
Tu tarea:
- Para cada grado, estima el error con validacion cruzada de 5 folds
(
cross_val_scorecon scoringneg_root_mean_squared_error). - Grafica el error de CV en funcion del grado.
- Pregunta: ¿que grado elige la validacion cruzada? ¿Por que es mas confiable que una unica particion train/test?
In [ ]:
Copied!
# FIXME
# FIXME
Respuesta (Problema 04): (escribe aqui)
Problema 05 — Curva de aprendizaje¶
Tu tarea:
- Usa
learning_curvepara un modelo de grado alto (p. ej. 9), variando el tamaño del conjunto de entrenamiento. - Grafica el error de train y de validacion vs el numero de ejemplos.
- Pregunta: ¿el modelo se beneficiaria de mas datos? Justifica a partir de la brecha entre ambas curvas.
In [ ]:
Copied!
from sklearn.model_selection import learning_curve
# FIXME
from sklearn.model_selection import learning_curve
# FIXME
Respuesta (Problema 05): (escribe aqui)