Sobreajuste

El sobreajuste ocurre cuando un modelo de IA se ajusta demasiado a los datos de entrenamiento.

En lugar de capturar patrones generales, el modelo memoriza el ruido y las características específicas de los datos de entrenamiento, lo que lleva a un rendimiento deficiente en datos nuevos y no vistos durante el entrenamiento.

Características del sobreajuste:

  1. Bajo error en datos de entrenamiento: El modelo puede tener un error muy bajo en los datos utilizados para entrenarlo, lo que indica un ajuste muy preciso a esos datos.

  2. Alto error en datos de prueba: Sin embargo, el modelo tiene un rendimiento pobre en datos de prueba, ya que no puede generalizar bien debido a su ajuste excesivo a los datos de entrenamiento.

  3. Memorización en lugar de generalización: El modelo memoriza los detalles y el ruido en los datos de entrenamiento en lugar de aprender patrones generales, lo que limita su capacidad para hacer predicciones precisas en nuevos datos.

El sobreajuste indica que el modelo se ajusta demasiado a los datos de entrenamiento y no puede generalizar a nuevos datos

Ejemplo

Mostramos un ejemplo de un modelo, para mostrar cómo un modelo demasiado complejo puede llevar al sobreajuste y afectar la generalización a nuevos datos.

Utlizaremos un conjutno de datos sintetícos que podemos interpretar en el contexto de la inflación y el poder adquisitivo de una moneda.

Supongamos que X representa el tiempo en meses y y representa el precio de un producto básico, como el pan, en una economía afectada por la inflación. La relación cuadrática entre el tiempo y el precio del pan podría reflejar el impacto de la inflación en el aumento constante de los precios a lo largo del tiempo.

Importamos los módulos necesarios

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

Generar datos sintéticos para el ejemplo

X = np.linspace(0, 10, 100).reshape(-1, 1)
y = 0.5 * X**2 - X + 2 + np.random.normal(0, 1, size=X.shape)

Dividir los datos en conjunto de entrenamiento y prueba

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 regresión polinómica

# Grado alto para inducir sobreajuste
poly_features = PolynomialFeatures(degree=15)  
X_train_poly = poly_features.fit_transform(X_train)
X_test_poly = poly_features.transform(X_test)

model_overfit = LinearRegression()
model_overfit.fit(X_train_poly, y_train)

Calcular predicciones en datos de entrenamiento y prueba

y_pred_train_overfit = model_overfit.predict(X_train_poly)
y_pred_test_overfit = model_overfit.predict(X_test_poly)

Calcular el error cuadrático medio en datos de entrenamiento y prueba

# Calcular el error cuadrático medio en datos de entrenamiento y prueba
mse_train_overfit = mean_squared_error(y_train, y_pred_train_overfit)
mse_test_overfit = mean_squared_error(y_test, y_pred_test_overfit)

Imprimir el error cuadrático medio para el bajo ajuste

print(f"Error cuadrático medio en datos de entrenamiento (sobreajuste): {mse_train_overfit}")
print(f"Error cuadrático medio en datos de prueba (sobreajuste): {mse_test_overfit}")

Visualizamos la predicción de los datos de entrenamiento

plt.figure(figsize=(10, 5))

plt.scatter(X_train, y_train, color='blue', label='Datos de entrenamiento')
plt.scatter(X_train, y_pred_train_overfit, color='red', label='Predicciones de entrenamiento')

plt.xlabel('Característica')
plt.ylabel('Valor de salida')
plt.legend()
plt.show()

Visualizamos la predicción de los datos de test

plt.figure(figsize=(10, 5))

plt.scatter(X_test, y_test, color='green', label='Datos de prueba')
plt.scatter(X_test, y_pred_test_overfit, color='orange', label='Predicciones de prueba')

plt.xlabel('Característica')
plt.ylabel('Valor de salida')
plt.legend()
plt.show()

Last updated