Introducció

En el camp del Machine Learning, un dels reptes més comuns és trobar l'equilibri adequat entre l'overfitting i l'underfitting. Aquests dos conceptes descriuen problemes que poden sorgir quan un model aprèn a partir de dades d'entrenament.

  • Overfitting: Succeeix quan un model aprèn massa bé els detalls i el soroll de les dades d'entrenament, fins al punt que el seu rendiment es deteriora en dades noves.
  • Underfitting: Succeeix quan un model és massa simple per capturar les relacions subjacents en les dades d'entrenament, resultant en un rendiment pobre tant en les dades d'entrenament com en les dades noves.

Conceptes Clau

Overfitting

  • Definició: L'overfitting es produeix quan un model s'ajusta massa bé a les dades d'entrenament, incloent-hi el soroll i les anomalies. Això fa que el model tingui un rendiment excel·lent en les dades d'entrenament però pobre en les dades de validació o test.
  • Símptomes:
    • Alta precisió en les dades d'entrenament.
    • Baixa precisió en les dades de validació o test.
  • Causes:
    • Model massa complex (massa paràmetres).
    • Dades d'entrenament insuficients.
    • Soroll en les dades d'entrenament.

Underfitting

  • Definició: L'underfitting es produeix quan un model és massa simple per capturar les relacions subjacents en les dades d'entrenament. Això fa que el model tingui un rendiment pobre tant en les dades d'entrenament com en les dades de validació o test.
  • Símptomes:
    • Baixa precisió en les dades d'entrenament.
    • Baixa precisió en les dades de validació o test.
  • Causes:
    • Model massa simple (pocs paràmetres).
    • Dades d'entrenament insuficients.
    • Dades d'entrenament no representatives.

Exemples Pràctics

Exemple d'Overfitting

Considerem un conjunt de dades amb una relació lineal simple, però amb soroll afegit. Si ajustem un model polinòmic de grau alt, podem obtenir un model que s'ajusta perfectament a les dades d'entrenament però que no generalitza bé a noves dades.

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 dades
np.random.seed(0)
X = 2 - 3 * np.random.normal(0, 1, 20)
y = X - 2 * (X ** 2) + np.random.normal(-3, 3, 20)

# Ajustar model polinòmic de grau 9 (overfitting)
polynomial_features = PolynomialFeatures(degree=9)
X_poly = polynomial_features.fit_transform(X.reshape(-1, 1))
model = LinearRegression()
model.fit(X_poly, y)
y_poly_pred = model.predict(X_poly)

# Visualitzar
plt.scatter(X, y, s=10)
plt.plot(np.sort(X), y_poly_pred[np.argsort(X)], color='m')
plt.title('Exemple d\'Overfitting')
plt.show()

# Error quadràtic mitjà
mse = mean_squared_error(y, y_poly_pred)
print(f'Error quadràtic mitjà: {mse}')

Exemple d'Underfitting

Considerem el mateix conjunt de dades, però ajustem un model lineal simple. El model no serà capaç de capturar la relació quadràtica subjacents en les dades.

# Ajustar model lineal (underfitting)
model = LinearRegression()
model.fit(X.reshape(-1, 1), y)
y_pred = model.predict(X.reshape(-1, 1))

# Visualitzar
plt.scatter(X, y, s=10)
plt.plot(X, y_pred, color='r')
plt.title('Exemple d\'Underfitting')
plt.show()

# Error quadràtic mitjà
mse = mean_squared_error(y, y_pred)
print(f'Error quadràtic mitjà: {mse}')

Estratègies per Evitar Overfitting i Underfitting

Evitar Overfitting

  • Regularització: Utilitzar tècniques com Ridge, Lasso o Elastic Net per penalitzar la complexitat del model.
  • Validació Creuada: Utilitzar validació creuada per avaluar el rendiment del model en diferents subconjunts de les dades.
  • Pruning: En models com arbres de decisió, utilitzar tècniques de pruning per eliminar branques que no aporten valor.
  • Early Stopping: En xarxes neuronals, utilitzar early stopping per aturar l'entrenament quan el rendiment en les dades de validació comença a deteriorar-se.

Evitar Underfitting

  • Augmentar la Complexitat del Model: Utilitzar models més complexos que puguin capturar millor les relacions subjacents en les dades.
  • Feature Engineering: Crear noves característiques que puguin ajudar el model a capturar millor les relacions subjacents.
  • Augmentar les Dades d'Entrenament: Recollir més dades d'entrenament per proporcionar més informació al model.

Exercici Pràctic

Exercici

  1. Genera un conjunt de dades sintètic amb una relació quadràtica i soroll afegit.
  2. Ajusta un model lineal i un model polinòmic de grau 5 a les dades.
  3. Compara el rendiment dels dos models utilitzant l'error quadràtic mitjà (MSE) en les dades d'entrenament i de validació.

Solució

# Generar dades sintètiques
np.random.seed(0)
X = 2 - 3 * np.random.normal(0, 1, 100)
y = X - 2 * (X ** 2) + np.random.normal(-3, 3, 100)

# Dividir en dades d'entrenament i validació
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=0)

# Ajustar model lineal
model_linear = LinearRegression()
model_linear.fit(X_train.reshape(-1, 1), y_train)
y_train_pred_linear = model_linear.predict(X_train.reshape(-1, 1))
y_val_pred_linear = model_linear.predict(X_val.reshape(-1, 1))

# Ajustar model polinòmic de grau 5
polynomial_features = PolynomialFeatures(degree=5)
X_train_poly = polynomial_features.fit_transform(X_train.reshape(-1, 1))
X_val_poly = polynomial_features.transform(X_val.reshape(-1, 1))
model_poly = LinearRegression()
model_poly.fit(X_train_poly, y_train)
y_train_pred_poly = model_poly.predict(X_train_poly)
y_val_pred_poly = model_poly.predict(X_val_poly)

# Calcular MSE
mse_train_linear = mean_squared_error(y_train, y_train_pred_linear)
mse_val_linear = mean_squared_error(y_val, y_val_pred_linear)
mse_train_poly = mean_squared_error(y_train, y_train_pred_poly)
mse_val_poly = mean_squared_error(y_val, y_val_pred_poly)

print(f'MSE entrenament (lineal): {mse_train_linear}')
print(f'MSE validació (lineal): {mse_val_linear}')
print(f'MSE entrenament (polinòmic): {mse_train_poly}')
print(f'MSE validació (polinòmic): {mse_val_poly}')

Conclusió

L'overfitting i l'underfitting són problemes comuns en el desenvolupament de models de Machine Learning. És crucial trobar un equilibri adequat entre la complexitat del model i la quantitat de dades d'entrenament per assegurar que el model generalitzi bé a noves dades. Utilitzant tècniques com la regularització, la validació creuada i el feature engineering, podem millorar el rendiment dels nostres models i evitar aquests problemes.

Curs de Machine Learning

Mòdul 1: Introducció al Machine Learning

Mòdul 2: Fonaments d'Estadística i Probabilitat

Mòdul 3: Preprocessament de Dades

Mòdul 4: Algoritmes de Machine Learning Supervisat

Mòdul 5: Algoritmes de Machine Learning No Supervisat

Mòdul 6: Avaluació i Validació de Models

Mòdul 7: Tècniques Avançades i Optimització

Mòdul 8: Implementació i Desplegament de Models

Mòdul 9: Projectes Pràctics

Mòdul 10: Recursos Addicionals

© Copyright 2024. Tots els drets reservats