
In un modello di machine learning, la regolarizzazione riduce significativamente la varianza del modello, senza un sostanziale aumento del suo Bias.
Attraverso l’introduzione di un parametro Lambda, si punta a ridurre i coefficienti del modello in modo da ridurne la varianza e quindi l’accuratezza stessa.
In questo articolo vediamo tre tipi di tecniche di regolarizzazione utilizzate dagli algoritmi di machine learning per migliorare le previsioni dei modelli con alta varianza: Ridge, Lasso ed Elastic Net.
Prima di vederli vediamo un tipo di regressione molto comune: Ordinary Least Squares o (OLS).
Ordinary Least Squares
La regressione dei minimi quadrati (OLS o metodo dei minimi quadrati) rappresenta un metodo statistico di analisi che stima la relazione tra una o più variabili indipendenti e una variabile dipendente.
Il metodo stima la relazione attraverso degli stimatori (definiti stimatori dei minimi quadrati), che minimizzano la somma dei quadrati della differenza tra i valori osservati e previsti della variabile dipendente configurata come linea retta.
Gli stimatori dei minimi quadrati (OLS) determinano i valori minimi del modello di regressione lineare risolvendo l’equazione 1:
Con arg min b, si intende l’argomento del minimo di b, cioè l’insieme dei punti per i quali una data funzione raggiunge il suo minimo (si veda Wikipedia per maggiori informazioni).
Y è la variabile dipendente,
X è la variabile indipendente,
b è il coefficiente Beta.
Tutte e 3 queste variabili sono da intendersi sotto forma di matrici. Con yi si intende l’i-esima riga di Y, xi è l’i-esima riga di X e b e β il coefficiente beta sono vettori colonna di dimensione Kx1.
L’equazione 1 si può risolvere attraverso l’equazione normale, rappresentata dall’equazione 2 (sempre sotto forma di matrici):
Che abbiamo visto nella regressione lineare multivariata.
Regressione Ridge
Con regressione ridge si intende un termine usato per riferirsi a un modello di regressione lineare i cui coefficienti non sono stimati dal metodo dei minimi quadrati (OLS), ma da un altro stimatore, chiamato stimatore ridge, che possiede bias ma ha una varianza inferiore rispetto allo stimatore OLS.
Lo stimatore ridge riduce i coefficienti di regressione, in modo che le variabili, con un contributo minore al risultato, abbiano i loro coefficienti vicini allo zero.
Invece di forzarli a essere esattamente zero, li penalizziamo con un termine chiamato norma L2, costringendoli così a essere piccoli in modo continuo. In questo modo, diminuiamo la complessità del modello senza eliminare nessuna variabile.
Per quanto affermato, lo stimatore ridge risolverà la (1) in modo leggermente differente (si veda equazione 3). L’ammontare della penalità può essere messo a punto usando una costante chiamata lambda (λ).
In pratica l’equazione 3 ci dice che lo stimatore ridge è composto dalla somma dei residui quadrati (Sum of Squared Residuals o SSR) più una penalità, definita dalla lettera Lambda, che è moltiplicata per la somma dei coefficienti quadrati b.
L’equazione che risolve la 3, è la seguente, molto simile alla 2 vista sopra:
Con I matrice identità di dimensione K x K.
Per uno stimatore ridge, la selezione di un buon valore per λ è fondamentale.
Quando λ = 0, il termine di penalità non ha alcun effetto e la regressione ridge produrrà i coefficienti minimi quadrati classici. Tuttavia, quando λ aumenta all’infinito, l’impatto della penalità aumenta e i coefficienti di regressione si avvicinano allo zero.
Un importante vantaggio della regressione ridge è che si comporta ancora bene, rispetto al normale metodo dei minimi quadrati, in una situazione in cui si hanno molti dati multivariati con il numero di predittori (p) maggiore del numero di osservazioni (n).
Uno svantaggio della regressione ridge, invece, è che includerà tutti i predittori nel modello finale, a differenza dei metodi di feature selection, che generalmente selezioneranno un insieme ridotto di variabili tra quelle disponibili.
La regressione della ridge riduce i coefficienti verso zero, ma non ne imposta esattamente nessuno a zero. La regressione Lasso è un’alternativa che supera questo inconveniente.
Regressione Lasso
Lasso è l’acronimo di Least Absolute Shrinkage and Selection Operator (Operatore di selezione e ritiro assoluto minimo). Riduce i coefficienti di regressione verso lo zero penalizzando il modello di regressione con un termine di penalità chiamato norma L1, che è la somma dei coefficienti assoluti. In altre parole, l’equazione di una regressione lasso (equazione 5) è simile all’equazione 3:
Nel caso della regressione lasso, la penalità ha l’effetto di forzare alcune delle stime dei coefficienti, con un contributo minore al modello, a essere esattamente uguale a zero.
Ciò significa che il lasso può anche essere visto come un’alternativa ai metodi di feature selection per eseguire la selezione delle variabili al fine di ridurre la complessità del modello.
Come nella regressione ridge, è fondamentale selezionare un buon valore di λ per il lasso.
Quando lambda è piccolo, il risultato è molto vicino alla stima dei minimi quadrati. All’aumentare di lambda, si verifica una contrazione in modo da poter eliminare le variabili che sono a zero.
Quale dei due metodi è migliore per applicare la regolarizzazione?
Un ovvio vantaggio della regressione lasso rispetto alla regressione ridge è che produce modelli più semplici e più interpretabili che incorporano solo un insieme ridotto di predittori.
In generale, il lasso potrebbe funzionare meglio in una situazione in cui alcuni predittori hanno coefficienti elevati e i restanti predittori hanno coefficienti molto piccoli.
La regressione ridge funzionerà meglio quando il risultato è una funzione di molti predittori, tutti con coefficienti di dimensioni approssimativamente uguali.
Tuttavia, vale la pena di testare anche una via intermedia tra le due tecniche di regolarizzazione: la regressione Elastic Net.
Regressione Elastic Net
Elastic Net combina le proprietà della regressione di Ridge e Lasso. Funziona penalizzando il modello usando sia la norma L2 che la norma L1.
La funzione di costo che la regressione Elastic Net si prefigge di risolvere è la seguente:
Oltre a impostare e scegliere un valore lambda, l’elastic net ci consente anche di ottimizzare il parametro alfa dove α = 0 corrisponde alla regressione ridge e α = 1 alla regressione lasso.
Pertanto possiamo scegliere un valore alfa compreso tra 0 e 1 per ottimizzare l’elastic net. Se tale valore è incluso in questo intervallo, si avrà una riduzione di alcuni coefficienti e probabilmente alcuni verranno portati a 0.
Esempio di applicazione
Vediamo ora un esempio di applicazione delle tecniche di regolarizzazione precedentemente viste.
Ipotizziamo di voler prevedere il peso di un pesce, conoscendone la specie, tre tipologie di lunghezze, l’altezza e la larghezza.
Il dataset in oggetto lo possiamo trovare sul sito di Kaggle. Dopo esserci registrati, lo possiamo scaricare qui.
Nel dataset troviamo 7 diverse specie di pesci comuni nelle vendite del mercato ittico (Bream, Roach, WhiteFish, Parkki, Perch, Pike e Smelt), e altre 5 caratteristiche, così definite:
- Lunghezza 1: rappresenta la lunghezza verticale in cm;
- Lunghezza 2: rappresenta la lunghezza diagonale in cm;
- Lunghezza 3: rappresenta la lunghezza da un lato all’altro del pesce in cm;
- Altezza in cm del pesce;
- Larghezza: indica la larghezza diagonale in cm.
La variabile dipendente da prevedere è rappresentata dal peso del pesce in grammi.
Risolviamo questo problema calcolando prima la regressione lineare, e valutando se Ridge, Lasso ed Elastic Net migliorano le performance del modello.
Importare le librerie
Importiamo le librerie necessarie allo svolgimento dell’algoritmo. Tra di esse abbiamo Pandas e Matplotlib.
Importiamo anche:
- Linear_model: il modulo che include i vari tipi di regressione, necessario ad eseguire la regressione lineare;
- LabelEncoder e StandardScaler: il primo per codificare i valori stringa in campi numerici, e il secondo per ridimensionare le caratteristiche in modo che assumano media pari a 0 e deviazione standard pari a 1.
- Ridge, RidgeCV, Lasso, ed ElasticNet: per eseguire le tecniche di regolarizzazione Ridge, Lasso ed ElasticNet. RidgeCV è un modulo, che combinato con la convalida incrociata, ci aiuta a trovare un buon valore di alfa (in sklearn alfa è il lambda della regressione ridge, visto sopra);
- Train_Test_Split: per suddividere la fase di addestramento con quella di test;
- Le metriche R2_score e MSE (Mean Squared Error): per valutare l’accuratezza del modello di previsione.
Importare il dataset
Il secondo step necessario risulta quello di importare il dataset. Lanciamo la seguente stringa di codice (in quanto il dataset è salvato sottoforma di file csv):
Al posto dei puntini va indicato il percorso della cartella dove è contenuto il file da caricare.
Questo set di dati è piuttosto piccolo: si compone di 7 colonne e 159 righe di dati, come si può vedere anche eseguendo le seguenti righe di codice:
Output:
Vediamo ora le prime 5 righe del dataset:
Preelaborazione dei dati
Dall’immagine precedente possiamo notare che la colonna “Species” è in formato Stringa.
Utilizziamo il label encoder per rendere tale caratteristica di tipo numerico. Eseguiamo di conseguenza le seguenti righe di codice:
Dopo averla trasformata in intero, vediamo come è stata tramutata:
I primi 5 valori “Bream” sono stati modificati in 0:
Test Train Data
Arrivati a questo punto associamo i valori di X alle variabili indipendenti e y alla variabile dipendente.
Alla X togliamo la colonna “Weight” in quanto rappresenta il valore da prevedere (associato quindi alla y).
La variabile X contiene le altre 6 colonne del set di dati (cioè gli attributi).
Provvediamo ora a suddividere il dataset in set di dati di test e di allenamento. In questo caso consideriamo il 20% del set di dati come dato di test, mentre il 80% sarà il set di dati di addestramento.
Ora prima di creare il modello non ci resta che eseguire un ridimensionamento dei dati, per fare in modo di non avere caratteristiche più influenti di altre. Digitiamo le seguenti righe di codice:
Regressione Lineare
Non ci resta che creare il modello di regressione lineare in python, digitando le seguenti righe di codice:
Con la seconda riga adattiamo il modello al set di addestramento utilizzando fit (X_train, y_train).
Mentre con regr.coef_ stampiamo i coefficienti delle variabili dipendenti X, che risultano pari a:
Dopodiché prevediamo un nuovo valore per il set di addestramento, calcoliamo le metriche e visualizziamole.
Otteniamo:
Ora prevediamo un nuovo valore per il set test e calcoliamo le metriche del modello:
In questo caso otteniamo:
Pare non esserci overfitting, in quanto l’R2 del test set (0,8734) non è molto inferiore dell’R2 del train set (0,8967), anche se l’MSE subisce più che un raddoppio: vediamo però se riusciamo a migliorare il risultato del test set usando le tecniche di regolarizzazione Ridge, Lasso ed ElasticNet.
Regressione Ridge
Nella regressione Ridge è fondamentale calcolare il valore della penalità, dato dal coefficiente alfa in sklearn.
Per farlo calcoliamo alfa tra questi otto valori, avvalendoci della classe RidgeCV, che altro non ci permette di adattare un modello di regressione ridge con convalida incrociata.
Il miglior alfa trovato risulta pari a 0,10.
Utilizziamo il miglior alfa appena trovato per addestrare il modello di regressione Ridge:
Prevedendo un valore e calcolando le metriche relative al modello troviamo:
Da notare che l’MSE è leggermente più basso che per la regressione lineare, mentre l’R2 leggermente migliore (0,8742 contro lo 0,8734).
I coefficienti del modello, invece, sono ridotti rispetto al modello di regressione lineare precedentemente calcolato dal parametro alfa e sono pari a:
Regressione Lasso
Molto simile a quanto visto per la regressione Ridge, solo che alfa viene imposto in questa sede pari a 1, calcolato dopo vari tentativi:
Calcolando le metriche, troviamo un valore del MSE leggermente inferiore del modello di regressione lineare, e un R2 leggermente superiore (0,8739 contro 0,8734):
Riguardo ai coefficienti del modello invece, abbiamo il terzo (Lenght2) e il quarto (Lenght3) pari a 0:
Elastic Net
Infine, valutiamo la terza tecnica di regolarizzazione: Elastic Net. Come per il Lasso, si è scelto un valore di alfa pari a 0,005, trovato dopo alcuni tentativi:
Essendo combinazione dei precedenti due modelli, otteniamo un risultato migliore, anche se di poco:
Come coefficienti del modello invece otteniamo:
Volendo rappresentare su un grafico il risultato di quest’ultimo metodo, possiamo digitare le seguenti righe di codice:
Possiamo concludere che le tre tecniche di regolarizzazione migliorano, anche se di poco, le performance del modello di regressione lineare (MSE:24080,26; R2:0,8734).
Per l’esempio proposto troviamo il risultato migliore nella regressione Elastic Net (MSE: 23896,89; R2: 0,8744), a seguire Ridge (MSE:23936,24; R2: 0,8742) ed infine Lasso (MSE:23993,63; R2: 0,8739).
Conclusione
In linea generale, se il modello lineare contiene molte variabili predittive o se queste variabili sono correlate, le stime dei parametri OLS standard presentano una varianza elevata, rendendo il modello inaffidabile.
Per contrastare questa problematica, ci si può affidare alla regolarizzazione, un metodo che consente di ridurre questa varianza a scapito dell’introduzione di alcuni bias. Trovare un buon compromesso di bias-varianza consente di ridurre al minimo l’errore totale del modello.
Esistono tre tecniche di regolarizzazione popolari, ognuna delle quali mira a ridurre la dimensione dei coefficienti:
- Regressione ridge, che penalizza la somma dei coefficienti quadrati (penalità L2).
- Regressione lasso, che penalizza la somma dei valori assoluti dei coefficienti (penalità L1).
- Regressione elastic net, una combinazione di regolarizzazione L1 e L2.
La dimensione dei rispettivi termini di penalità può essere regolata tramite convalida incrociata per trovare la soluzione migliore per il modello.
Maggiori informazioni in merito a queste tecniche di regolarizzazione le puoi trovarle ai seguenti link: