Site icon Meccanismo Complesso

La regressione lineare con Lasso nel Machine Learning con scikit-learn

LASSO per la regressione lineare
LASSO per la regressione lineare header

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:

La parte rappresenta il termine di errore quadratico medio (MSE), mentre rappresenta il termine di penalizzazione L1.

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:

  1. 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.
  2. 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.
  3. 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:

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:

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:

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:

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.

Exit mobile version