Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Overfitting y underfitting, Unidad 3 — Diagnóstico con datos de entrenamiento y prueba, 3.2 — Curvas de aprendizaje ·

Decisiones a partir de curvas

Decisiones a partir de curvas

Introducción

Las curvas de aprendizaje son una herramienta fundamental para diagnosticar y entender cómo un modelo se comporta durante su entrenamiento. Permiten visualizar la relación entre el número de ejemplos de entrenamiento y los errores en el conjunto de entrenamiento y prueba, lo que nos ayuda a identificar si estamos enfrentando overfitting o underfitting. Estas curvas son especialmente útiles porque proporcionan una visión general del rendimiento relativo de un modelo a medida que aumenta la cantidad de datos utilizados para su entrenamiento.

Explicación principal con ejemplos

Concepto básico

Las curvas de aprendizaje visualizan dos métricas clave: el error en entrenamiento y el error en validación (o prueba), a lo largo del número de muestras de entrenamiento. A menudo se representan juntas para comparar los errores en ambos conjuntos.

Un ejemplo típico podría ser una curva de aprendizaje para un modelo de regresión lineal, donde medimos el error cuadrático medio (MSE) tanto en el conjunto de entrenamiento como en el de validación. Si las curvas se acercan y luego convergen, indica que el modelo está aprendiendo a generalizar bien. Sin embargo, si la curva del error en entrenamiento es mucho más baja que la del error en validación y no converge, esto sugiere overfitting.

Ejemplo práctico

Supongamos que estamos utilizando un modelo de regresión lineal para predecir el precio de una casa basado en varios atributos. Para este ejemplo, consideraremos una curva de aprendizaje con 100 puntos de datos.

import numpy as np
import matplotlib.pyplot as plt

# Generar datos sintéticos
np.random.seed(42)
X = np.random.rand(100, 1) * 100
y = 5 + 3 * X + np.random.randn(*X.shape)

# Dividir los datos en entrenamiento y prueba
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Entrenar un modelo de regresión lineal
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)

# Calcular errores en entrenamiento y prueba
train_errors = np.mean((model.predict(X_train) - y_train)**2)
test_errors = np.mean((model.predict(X_test) - y_test)**2)

print(f"Error en entrenamiento: {train_errors}")
print(f"Error en prueba: {test_errors}")

# Visualizar las curvas de aprendizaje
plt.figure(figsize=(10, 6))
plt.plot(X_train[:, 0], model.predict(X_train), 'r-', label='Predicción')
plt.scatter(X_train[:, 0], y_train, c='b', label='Datos de entrenamiento')
plt.scatter(X_test[:, 0], y_test, c='g', label='Datos de prueba')

# Visualizar las curvas
def plot_learning_curves(model, X, y):
    train_errors = []
    val_errors = []
    
    for i in range(1, len(X) + 1):
        model.fit(X[:i], y[:i])
        train_error = np.mean((model.predict(X[:i]) - y[:i])**2)
        val_error = np.mean((model.predict(X[i:]) - y[i:])**2)
        
        train_errors.append(train_error)
        val_errors.append(val_error)

    plt.figure(figsize=(10, 6))
    plt.plot(range(1, len(X) + 1), train_errors, 'r-', label='Error en entrenamiento')
    plt.plot(range(1, len(X) + 1), val_errors, 'b-', label='Error en validación')
    plt.xlabel('Número de muestras de entrenamiento')
    plt.ylabel('Error (MSE)')
    plt.title('Curvas de aprendizaje')
    plt.legend()
    plt.show()

plot_learning_curves(model, X, y)

En este ejemplo, podríamos observar cómo la curva del error en entrenamiento disminuye con el aumento del número de muestras, mientras que la curva del error en validación comienza a aumentar después de un cierto punto. Esto sugiere que el modelo está comenzando a overfitting.

Errores típicos / trampas

1. Ignorar las curvas en entrenamiento y validación

Una de las mayores trampas es ignorar completamente las curvas de aprendizaje, lo cual puede llevar al error de confiar demasiado en el rendimiento del modelo en el conjunto de entrenamiento sin validar su rendimiento en un conjunto independiente.

2. Convergencia prematura

En algunos casos, una convergencia prematura (cuando las curvas se acercan y luego convergen) puede indicar que el modelo es demasiado complejo o que no tiene suficientes datos de entrenamiento. Es crucial analizar si este comportamiento es deseable antes de tomar decisiones.

3. Desconocer la importancia del número de muestras

Ignorar cómo el número de muestras afecta las curvas puede llevar a conclusiones erróneas sobre el rendimiento del modelo, especialmente en problemas con muy pocos datos.

Checklist accionable

  1. Analiza las curvas: Visualiza las curvas de aprendizaje para identificar cualquier desviación que indique overfitting o underfitting.
  2. Aumenta los datos si es necesario: Si notas overfitting, considera aumentar el número de muestras en tu conjunto de entrenamiento.
  3. Simplifica el modelo: Para casos de overfitting, simplifica el modelo (menos parámetros o características).
  4. Evalúa regularización: Asegúrate de que estás utilizando la regularización adecuadamente para evitar overfitting.
  5. Valida con curvas cruzadas: Utiliza validación cruzada para asegurarte de que tus conclusiones son robustas.

Cierre

Las curvas de aprendizaje son una herramienta poderosa para diagnosticar y corregir problemas en la generalización del modelo. Asegúrate de utilizarlas adecuadamente para tomar decisiones informadas sobre cómo mejorar el rendimiento de tu modelo. Al seguir estos pasos, podrás construir modelos más fiables y útiles.

Siguientes pasos

  • Investiga regularización: Aprende más sobre técnicas como Ridge y Lasso que pueden ayudar a prevenir overfitting.
  • Aumenta la complejidad del modelo: Para casos de underfitting, considera aumentar la capacidad del modelo (más parámetros o características).
  • Optimiza el feature engineering: Mejora las características en tu conjunto de datos para que el modelo pueda aprender mejor.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).