La regressione Lasso (Least Absolute Shrinkage and Selection Operator) è una tecnica di regressione lineare che utilizza la regolarizzazione L1 per migliorare la generalizzazione e la selezione delle variabili. La regressione Lasso è una tecnica potente per la regressione lineare che combina la riduzione della dimensionalità con la capacità di selezionare le variabili più importanti, contribuendo a creare modelli più interpretabili e generalizzabili.
La regressione LASSO (Least Absolute Shrinkage and Selection Operator)
La regressione Lasso (Least Absolute Shrinkage and Selection Operator) è stata introdotta per la prima volta da Robert Tibshirani nel 1996. È stata sviluppata come una tecnica di regolarizzazione per la regressione lineare, con l’obiettivo principale di affrontare il problema dell’overfitting e della selezione delle variabili.
Il concetto di regressione Lasso è emerso come una soluzione al problema della selezione delle variabili, che si verifica quando si utilizzano modelli di regressione con un grande numero di variabili esplicative. In queste situazioni, è possibile che molte variabili non siano rilevanti per la previsione del risultato, ma possono influenzare il modello, portando a un’adeguata performance sui dati di addestramento ma a una scarsa generalizzazione su nuovi dati.
La regressione Lasso indirizza questo problema introducendo una penalizzazione L1 sulla somma assoluta dei coefficienti del modello durante il processo di addestramento. Questa penalizzazione L1 porta alcuni coefficienti a diventare esattamente zero, riducendo così il numero di variabili utilizzate nel modello. Questo processo di selezione delle variabili automatico rende la regressione Lasso particolarmente utile in situazioni in cui si desidera identificare i predittori più importanti tra un gran numero di variabili esplicative.
Negli anni successivi alla sua introduzione, la regressione Lasso ha guadagnato popolarità significativa nella comunità scientifica e nell’ambito dell’apprendimento automatico, diventando uno dei metodi di regressione regolarizzata più ampiamente utilizzati insieme ad altre tecniche come la regressione Ridge e l’Elastic Net.
La Lasso Regression si basa sulla minimizzazione della funzione di costo che comprende due termini: il termine di errore quadratico medio (MSE) e un termine di penalizzazione L1.
La funzione obiettivo della regressione Lasso può essere espressa come:
Dove:
è il vettore delle risposte osservate. è la matrice delle caratteristiche. è il vettore dei coefficienti del modello da apprendere. rappresenta la norma ( L2 ) (norma euclidea). rappresenta la norma ( L1 ). è il parametro di regolarizzazione che controlla il livello di penalizzazione.
La parte
La penalizzazione L1 (somma assoluta dei coefficienti) incoraggia i coefficienti del modello a diventare esattamente zero, riducendo così la complessità del modello e conducendo alla selezione delle variabili. Questo è utile per la creazione di modelli più semplici e interpretabili, oltre a contribuire a prevenire il problema dell’overfitting.
La Regressione Lasso con Scikit-learn
La regressione Lasso è implementata nella libreria scikit-learn, che è una delle librerie più popolari per l’apprendimento automatico in Python. In scikit-learn, la regressione Lasso è disponibile tramite la classe Lasso
all’interno del modulo linear_model
.
Vediamo un esempio che fa uso di dati sintetici, cioè generati artificialmente per simulare un dataset che dovrebbe seguire un andamento lineare con un rumore di fondo aggiunto appositamente.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error
# Generiamo dati sintetici
np.random.seed(0)
n_samples = 100
n_features = 10
X = np.random.randn(n_samples, n_features)
true_coefficients = np.random.randn(n_features)
y = X.dot(true_coefficients) + np.random.normal(0, 0.5, n_samples)
# Dividiamo i dati in set di addestramento e set di test
X_train, X_test = X[:80], X[80:]
y_train, y_test = y[:80], y[80:]
# Creiamo il modello di regressione Lasso
alpha = 0.1 # parametro di regolarizzazione
lasso = Lasso(alpha=alpha)
# Addestramento del modello
lasso.fit(X_train, y_train)
# Predizione sui dati di test
y_pred = lasso.predict(X_test)
# Calcoliamo l'errore quadratico medio (MSE)
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error (MSE):", mse)
# Stampiamo i coefficienti del modello
print("Coefficients:", lasso.coef_)
Eseguendo si ottengono i seguenti risultati:
Mean Squared Error (MSE): 0.3927541814497199
Coefficients: [ 0.50765085 0.76293123 -0.3276433 0. 0.15763891 0.11216079
0.42298338 -1.73556608 -0. 0.09392823]
Abbiamo ottenuto il valore dell’Errore Quadratico Medio (MSE) che è la media dei quadrati degli errori tra i valori predetti e i valori effettivi. Minore è il valore di MSE, migliore è il modello. Inoltre abbiamo anche ottenuto una serie di coefficienti legati al modello Lasso. Questi coefficienti sono i pesi assegnati a ciascuna variabile esplicativa nel modello. Ogni coefficiente indica quanto una variabile influisce sulla variabile di destinazione (o target).
Ecco cosa significano e a cosa servono questi coefficienti:
- Coefficiente di Bias (Intercept): Il primo coefficiente è spesso chiamato termine di bias o intercept. Rappresenta il valore previsto della variabile di destinazione quando tutte le variabili esplicative sono zero.
- Coefficiente per le Variabili Esplicative: Gli altri coefficienti corrispondono alle variabili esplicative. Ogni coefficiente indica quanto una determinata variabile influisce sulla variabile di destinazione. Un coefficiente positivo indica un’associazione positiva tra la variabile esplicativa e la variabile di destinazione, mentre un coefficiente negativo indica un’associazione negativa.
- Coefficiente Nullo: Alcuni coefficienti potrebbero essere esattamente zero. Questo significa che il modello di regressione Lasso ha escluso quelle variabili dal modello finale. Questo è uno dei vantaggi della regressione Lasso: può selezionare automaticamente le variabili più rilevanti e semplificare il modello eliminando quelle meno importanti.
Pertanto, esaminando questi coefficienti, puoi capire quali variabili esplicative sono considerate importanti dal modello e in che misura influenzano la variabile di destinazione. Queste informazioni possono essere utilizzate per interpretare il modello e trarre conclusioni sui fattori che influenzano la variabile di destinazione nel contesto del tuo problema specifico.
Si possono anche visualizzare graficamente per meglio vedere il contributo di ciascuna variabile.
import matplotlib.pyplot as plt
# Coefficienti del modello Lasso
lasso_coefficients = lasso.coef_
# Indici delle variabili
indices = np.arange(len(lasso_coefficients))
# Plot dei coefficienti
plt.figure(figsize=(10, 5))
plt.bar(indices, lasso_coefficients, color='b')
plt.xlabel('Indice Variabile')
plt.ylabel('Coefficiente')
plt.title('Coefficienti del Modello di Regressione Lasso')
# Aggiungi una linea rossa per i coefficienti nulli
plt.axhline(y=0, color='r', linestyle='--')
plt.xticks(indices)
plt.grid(True)
plt.show()
Si può vedere chiaramente che le feature 4 e 9 ( indici 3 e 8) sonoChe nel nostro dataset sintetico equivalgono alle due colonne di X_train.
print(X_train[:][3])
print(X_train[:][8])
Ritornando ai risultati ottenuti dal nostro modello, possiamo valutarne la bontà della previsione graficamente utilizzando il codice seguente:
import matplotlib.pyplot as plt
import numpy as np
# Plot dei valori predetti vs valori effettivi
plt.scatter(y_test, y_pred)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2) # Diagonale rossa tratteggiata
plt.xlabel("Valori Effettivi")
plt.ylabel("Valori Predetti")
plt.title("Valori Effettivi vs Valori Predetti (Regressione Lasso)")
plt.show()
Eseguendo si otterrà un grafico in cui vengono rapportati tra di loro i valori predetti con i valori reali. I punti presenti sul grafico dovranno rimanere il più vicino possibile alla diagonale rossa tratteggiata (valore predetto = valore reale). La distribuzione di questi punti intorno a tale retta per tutta l’estensione mostra la bontà del modello di effettuare delle previsioni.
Esempio reale di Regressione LIneare con il dataset diabetes di scikit-learn
Nell’esempio precedente abbiamo utilizzato dei dati sintetici per mostrare il funzionamento di una regressione lineare. Ora passeremo ad un dataset reale fornito dalla libreria scikit-learn ed utilizzato per testare la capacità dei modelli di prevedere risultati: il dataset Diabetes.
Questo dataset viene ampiamente utilizzato per la valutazione delle prestazioni di modelli di regressione. Contiene informazioni relative al diabete di 442 pazienti, insieme alla progressione della malattia dopo un anno, misurata tramite una variabile di risposta continua. Il dataset contiene solo 442 istanze, con 10 variabili predittive. Nonostante le sue dimensioni ridotte, il dataset è realistico e rappresenta un problema di regressione tipico in cui si desidera prevedere la progressione della malattia basandosi su diverse misurazioni cliniche. Le variabili predittive nel dataset includono caratteristiche come età, sesso, indice di massa corporea e sei misurazioni del siero del sangue. Queste variabili coprono una gamma di informazioni rilevanti per la progressione del diabete. A causa della sua dimensione e della presenza di una variabile di risposta continua, il dataset è adatto per la valutazione delle prestazioni di modelli di regressione. È possibile addestrare diversi modelli di regressione, come la regressione lineare, la regressione Lasso, la regressione Ridge e altri, e valutare le loro prestazioni utilizzando tecniche di validazione incrociata o semplicemente suddividendo i dati in set di addestramento e set di test.
Carichiamo quindi il dataset diabetes. Per avere una descrizione dettagliata del dataset possiamo utilizzare diabetes.DESCR.
from sklearn.datasets import load_diabetes
# Carica il dataset diabetes
diabetes = load_diabetes()
# Visualizza la descrizione del dataset
print("\nDescrizione del dataset diabetes:")
print(diabetes.DESCR)
Un modo per visualizzare e gestirne il contenuto è quello di utilizzare i dataframe di pandas.
import pandas as pd
# Crea un DataFrame con i dati e i nomi delle colonne
df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
# Aggiungi la colonna del target al DataFrame
df['target'] = diabetes.target
# Visualizza le prime 5 righe del DataFrame
df.head()
Con la funzione head() si ottengono le prime 5 righe del dataframe, sufficienti per dare un’occhiata e capire il contenuto del dataset e come è strutturato.
L’ultima colonna rappresenta il target. Questo valore nel dataset diabetes è la progressione della malattia del diabete dopo un anno di trattamento, misurata tramite una variabile continua. Questa variabile rappresenta una misura quantitativa della progressione della malattia e viene utilizzata come variabile di risposta o target nei modelli di regressione. L’obiettivo è utilizzare le altre variabili esplicative nel dataset per prevedere questa variabile di destinazione, in modo da comprendere quali fattori influenzano la progressione del diabete.
In sostanza, il nostro obiettivo è utilizzare le informazioni fornite dalle altre variabili del dataset (come età, sesso, indice di massa corporea e misurazioni del siero del sangue) per prevedere la progressione della malattia del diabete rappresentata dal target. Questo ci permette di comprendere meglio i fattori che influenzano la progressione del diabete e può aiutare nella diagnosi e nel trattamento della malattia.
Adesso applichiamo il modello di regressione lineare Lasso. Dividiamo il dataset in training set (80%) e testing set (20%) e poi utilizziamo il primo per l’apprendimento del modello ed il secondo per valutare le previsioni.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error
X = diabetes.data
y = diabetes.target
# Dividi il dataset in set di addestramento e set di test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Crea il modello di regressione Lasso
alpha = 0.1 # parametro di regolarizzazione
lasso = Lasso(alpha=alpha)
# Addestra il modello sul set di addestramento
lasso.fit(X_train, y_train)
# Valuta il modello sul set di test
y_pred = lasso.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)
# Stampiamo i coefficienti del modello
print("Coefficients:", lasso.coef_)
Eseguendo si ottengono i seguenti risultati:
Mean Squared Error: 2798.193485169719
Coefficients: [ 0. -152.66477923 552.69777529 303.36515791 -81.36500664
-0. -229.25577639 0. 447.91952518 29.64261704]
I coefficienti che sono stati impostati a zero indicano che le variabili corrispondenti non contribuiscono al modello di regressione. In altre parole, le caratteristiche del dataset diabetes corrispondenti a questi coefficienti nulli sono considerate non rilevanti per la previsione della progressione della malattia.
Nel tuo caso, i coefficienti che sono stati impostati a zero sono associati alle caratteristiche con indici 0, 5 e 7. Poiché gli indici delle caratteristiche in Python iniziano da zero, le caratteristiche corrispondenti sono:
- Caratteristica 0: age (età)
- Caratteristica 5: s1 (totChol, colesterolo totale)
- Caratteristica 7: s3 (hdl, lipoproteine ad alta densità)
Queste caratteristiche potrebbero non contribuire significativamente alla progressione della malattia nel dataset, e quindi il modello di regressione Lasso le ha escluse riducendo così la complessità del modello.
Questo comportamento è tipico della regressione Lasso, poiché la regolarizzazione L1 induce la sparsità, cioè porta alcuni coefficienti a diventare esattamente zero. Ciò rende la regressione Lasso particolarmente utile per la selezione delle variabili e la creazione di modelli più semplici e interpretabili.
Se vogliamo anche una valutazione grafica:
import matplotlib.pyplot as plt
import numpy as np
# Plot dei valori predetti vs valori effettivi
plt.scatter(y_test, y_pred)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2) # Diagonale rossa tratteggiata
plt.xlabel("Valori Effettivi")
plt.ylabel("Valori Predetti")
plt.title("Valori Effettivi vs Valori Predetti (Regressione Lasso)")
plt.show()
Che eseguendo questo codice si ottiene il seguente grafico:
Valutare il Modello
Abbiamo visto come valutare graficamente i risultati della previsione del modello, osservando di quanto si allontanano i punti dalla diagonale centrale. Ma a tal riguardo, esistono diverse metriche che possono essere utilizzate per valutare la bontà del modello di regressione. Alcune delle metriche comuni includono:
- Errore Quadratico Medio (MSE): È la media dei quadrati degli errori tra i valori predetti e i valori effettivi. Minore è il valore di MSE, migliore è il modello.
- Radice dell’Errore Quadratico Medio (RMSE): È la radice quadrata del MSE e fornisce una stima della dispersione degli errori. Come per l’MSE, minore è il valore di RMSE, migliore è il modello.
- Errore Assoluto Medio (MAE): È la media degli errori assoluti tra i valori predetti e i valori effettivi. È meno sensibile agli outlier rispetto all’MSE.
- Coefficiente di Determinazione (( R^2 ) o R-squared): Indica la proporzione di varianza nella variabile dipendente che è spiegata dalle variabili indipendenti nel modello. Può variare da 0 a 1, dove 1 indica una perfetta adattamento del modello ai dati.
Per quanto riguarda la regressione Lasso, solitamente MSE, RMSE e R-squared sono le metriche più comunemente utilizzate per valutare la bontà del modello. Ad esempio, nel codice fornito in precedenza, abbiamo utilizzato l’MSE per valutare le prestazioni del modello. Tuttavia, è sempre consigliabile utilizzare più di una metrica per ottenere una valutazione più completa delle prestazioni del modello.
Vediamo come calcolare le metriche MSE, RMSE, MAE e ( R^2 ) nel contesto del modello di regressione Lasso che abbiamo creato:
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# Calcola l'errore quadratico medio (MSE)
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error (MSE):", mse)
# Calcola la radice dell'errore quadratico medio (RMSE)
rmse = np.sqrt(mse)
print("Root Mean Squared Error (RMSE):", rmse)
# Calcola l'errore assoluto medio (MAE)
mae = mean_absolute_error(y_test, y_pred)
print("Mean Absolute Error (MAE):", mae)
# Calcola il coefficiente di determinazione (R-squared)
r2 = r2_score(y_test, y_pred)
print("R-squared (R^2):", r2)
Eseguendo otteniamo i seguenti valori delle metriche:
Mean Squared Error (MSE): 2798.193485169719
Root Mean Squared Error (RMSE): 52.897953506442185
Mean Absolute Error (MAE): 42.85442771664998
R-squared (R^2): 0.4718547867276227
Per valutare i risultati ottenuti, possiamo interpretare ciascuna delle metriche nel seguente modo:
- Mean Squared Error (MSE): Il valore MSE è di circa 2798.19. Poiché l’MSE misura la media dei quadrati degli errori, un valore più basso è preferibile. Tuttavia, il giudizio sull’MSE dipende dal contesto del problema e dalle unità della variabile di destinazione. In generale, possiamo dire che un MSE di questo ordine di grandezza potrebbe indicare che il modello non ha una buona precisione e che gli errori possono essere piuttosto elevati.
- Root Mean Squared Error (RMSE): Il RMSE è di circa 52.90. Poiché il RMSE è la radice quadrata dell’MSE, misura la deviazione standard degli errori del modello. Un RMSE più basso indica una migliore adattamento del modello ai dati. Tuttavia, anche qui, la valutazione dipende dal contesto. In generale, un RMSE di questo ordine di grandezza suggerirebbe che il modello ha una certa discrepanza dai dati reali.
- Mean Absolute Error (MAE): Il valore MAE è di circa 42.85. Il MAE è la media degli errori assoluti tra i valori predetti e quelli effettivi. Un MAE più basso è preferibile, poiché indica che il modello ha una precisione migliore. Un MAE di questo ordine di grandezza suggerisce che, in media, il modello commette un errore di circa 42.85 unità nei valori predetti.
- R-squared (( R^2 )): Il coefficiente ( R^2 ) è di circa 0.47. Questo valore rappresenta la proporzione di varianza nella variabile dipendente che è spiegata dalle variabili indipendenti nel modello. Un valore più vicino a 1 indica un modello migliore. Tuttavia, un valore di ( R^2 ) di circa 0.47 suggerisce che il modello spiega solo una parte della variabilità nei dati di destinazione.
Complessivamente, basandoci su queste metriche, possiamo concludere che il modello di regressione Lasso potrebbe non essere molto accurato o robusto per la previsione della progressione della malattia nel dataset diabetico considerato. Potrebbe essere necessario esplorare altre tecniche di modellazione o ottimizzare i parametri del modello per migliorare le prestazioni.
Quando usare Lasso per problemi di Regressione Lineare
Il metodo Lasso è particolarmente utile in diversi contesti di problemi di regressione lineare. Ecco alcuni casi in cui il metodo Lasso può essere una scelta appropriata:
- Selezione delle variabili: Quando si ha a che fare con un grande numero di variabili esplicative e si desidera identificare quelle più importanti per la previsione del risultato, il metodo Lasso può essere utilizzato per selezionare automaticamente le variabili rilevanti. La penalizzazione L1 applicata dalla regressione Lasso porta alcuni coefficienti a diventare esattamente zero, eliminando così le variabili meno informative e semplificando il modello.
- Controllo della dimensionalità: In situazioni in cui si vuole ridurre la complessità del modello e prevenire l’overfitting, il metodo Lasso può essere utilizzato per ridurre la dimensionalità del modello. Riducendo il numero di variabili utilizzate nel modello, si riduce la possibilità di overfitting e si favorisce la generalizzazione del modello su nuovi dati.
- Interpretazione dei coefficienti: Poiché il metodo Lasso tende a portare alcuni coefficienti del modello a zero, il modello risultante è spesso più interpretabile. Questo è particolarmente utile quando si desidera una comprensione chiara del contributo delle variabili esplicative alla variabile di destinazione.
- Predizione e prestazioni del modello: Nonostante la regolarizzazione introdotta dalla penalizzazione L1, il metodo Lasso può ancora fornire buone prestazioni di previsione, specialmente in situazioni in cui la selezione delle variabili è importante e il numero di osservazioni è limitato rispetto al numero di variabili.
In generale, il metodo Lasso è un’ottima scelta quando si desidera selezionare variabili, controllare la dimensionalità del modello e ottenere interpretazioni più chiare dei coefficienti del modello, mantenendo nel contempo buone prestazioni di previsione.