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
- Genera un conjunt de dades sintètic amb una relació quadràtica i soroll afegit.
- Ajusta un model lineal i un model polinòmic de grau 5 a les dades.
- 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
- Què és el Machine Learning?
- Història i evolució del Machine Learning
- Tipus de Machine Learning
- Aplicacions del Machine Learning
Mòdul 2: Fonaments d'Estadística i Probabilitat
- Conceptes bàsics d'estadística
- Distribucions de probabilitat
- Inferència estadística
- Teorema de Bayes
Mòdul 3: Preprocessament de Dades
Mòdul 4: Algoritmes de Machine Learning Supervisat
- Regressió lineal
- Regressió logística
- Arbres de decisió
- Màquines de suport vectorial (SVM)
- K-Veïns més propers (K-NN)
- Xarxes neuronals
Mòdul 5: Algoritmes de Machine Learning No Supervisat
- Clustering: K-means
- Clustering jeràrquic
- Anàlisi de components principals (PCA)
- Anàlisi d'agrupament DBSCAN
Mòdul 6: Avaluació i Validació de Models
Mòdul 7: Tècniques Avançades i Optimització
- Ensemble Learning
- Gradient Boosting
- Xarxes neuronals profundes (Deep Learning)
- Optimització d'hiperparàmetres
Mòdul 8: Implementació i Desplegament de Models
- Frameworks i biblioteques populars
- Implementació de models en producció
- Manteniment i monitoratge de models
- Consideracions ètiques i de privacitat
Mòdul 9: Projectes Pràctics
- Projecte 1: Predicció de preus d'habitatges
- Projecte 2: Classificació d'imatges
- Projecte 3: Anàlisi de sentiments a xarxes socials
- Projecte 4: Detecció de fraus