Salta al contenuto
Note per Studenti LASSO e discesa del gradiente

LASSO e discesa del gradiente

In questa pagina 5

La ridge regressionUna buona prestazione sul training non basta: serve stimare quella su dati nuovi. La cross-validation (K-fold: $k$ parti, ciascuna a turno come test, errore medio; Monte Carlo: $k$ divisioni casuali con quota di test $q$; leave-one-out se $k=n$) evita di dipendere da una sola divisione casuale. L'errore atteso si scompone in $\text{bias}^2+\text{varianza}+\sigma^2$: i modelli semplici fanno underfitting (bias alto), quelli complessi overfitting (varianza alta). La regolarizzazione aggiunge alla perdita una penalità: la ridge regression minimizza $|y-X\beta|^2+\lambda\sum_{j\ge1}\beta_j^2$ e ha soluzione $\beta=(X^TX+\lambda\tilde I)^{-1}X^Ty$ (l'intercetta non si penalizza, le feature si standardizzano): riduce i coefficienti, rende l'inversa stabile con feature collineari, e $\lambda$ è un iperparametro scelto con la validazione (cross-validation annidata per non contaminare il test).Overfitting, ridge regression e cross-validation → riduce i coefficienti ma non li azzera mai. Cambiando la penalità si ottiene il LASSO, che produce modelli sparsi; ma per questo non c'è una formula chiusa e serve un algoritmo iterativo: la discesa del gradiente, che si usa anche per la regressione logistica e per le reti neurali (Lezione 10 · LASSO e discesa del gradiente, Lezione 12 · Laboratorio di regolarizzazione). Gli esercizi sono Esercizio - Discesa del gradiente per il LASSO e scelta del passo e Esercizio - Cross-validation annidata per il LASSO sul dataset prostate; la variante con funzione di costo asimmetrica è Esercizio - Regressione quantile con funzione pinball e discesa del gradiente.

Dalla ridge al LASSO

Si parte dalla funzione di costo regolarizzata J=∑i=1n[yi−y^i]2+λRJ=\sum_{i=1}^n[y_i-\hat y_i]^2+\lambda R, con RR penalità sulla complessità. Per R=∑j=1pβj2R=\sum_{j=1}^p\beta_j^2 si ha la ridge (L2L_2). E se si sceglie un'altra penalità?

Definizione (LASSO). Least Absolute Shrinkage and Selection Operator: penalità L1L_1, somma dei valori assoluti dei coefficienti, J(β)=∑i=1n(yi−β0−∑j=1pβjxij)2+λ∑j=1p∣βj∣,J(\beta)=\sum_{i=1}^n\Big(y_i-\beta_0-\sum_{j=1}^p\beta_jx_{ij}\Big)^2+\lambda\sum_{j=1}^p|\beta_j|, con β0\beta_0 non penalizzato (come nella ridge) e feature standardizzate (Statistica per il machine learningI dati di un problema ML si organizzano nella matrice di progetto $X$ ($n$ osservazioni, $p$ variabili). La statistica serve a capirli, ripulirli e prepararli: i momenti (media $\mu$, varianza $\sigma^2$, asimmetria, curtosi), i quartili con lo scarto interquartile $\mathrm{IQR}=Q_3-Q_1$ (all'esame senza interpolazione), la moda per i dati categorici. Con queste quantità si imputano i dati mancanti (media o mediana), si eliminano le variabili costanti e si standardizza con lo z-score $z=(x-\mu)/\sigma$, usando sempre media e deviazione standard del solo training set.Statistica per il machine learning →). In forma matriciale, con XX comprensiva della colonna di uni: J(β)=∥y−Xβ∥2+λ∑j≥1∣βj∣J(\beta)=\lVert y-X\beta\rVert^2+\lambda\sum_{j\ge1}|\beta_j|.

Esempio. Con β=(β0,β1,β2)=(3; 2; −0,5)\beta=(\beta_0,\beta_1,\beta_2)=(3;\,2;\,-0{,}5) e λ=4\lambda=4 la penalità vale 4 (∣2∣+∣−0,5∣)=4⋅2,5=104\,(|2|+|-0{,}5|)=4\cdot2{,}5=10, mentre la ridge con lo stesso λ\lambda varrebbe 4 (4+0,25)=174\,(4+0{,}25)=17 (il valore assoluto penalizza di più i coefficienti piccoli, il quadrato quelli grandi).

Trace plot e sparsità

Se si riporta il valore di ciascun coefficiente in funzione di λ\lambda (trace plot), sul dataset prostate (97 osservazioni, 8 feature cliniche, target: livello di log-PSA) si vede che i coefficienti della ridge si riducono gradualmente verso zero ma restano diversi da zero, mentre quelli del LASSO arrivano a zero uno dopo l'altro: a λ\lambda elevato rimangono pochi coefficienti non nulli. Una soluzione con un sottoinsieme di coefficienti uguali a zero si dice sparsa.

Perché una soluzione sparsa è utile.

  • Efficienza: previsioni più veloci, meno memoria, riaddestramento più rapido.
  • Robustezza: meno sensibile ai dati rumorosi.
  • Interpretabilità: meno variabili, modello più facile da capire.
  • Gestione: sistema più semplice da mettere in produzione (anche su dispositivi piccoli).

Il LASSO fa la selezione delle feature, che è un passo di preprocessing, direttamente nella fase di modellazione.

Perché la penalità L1L_1 azzera i coefficienti: il caso con una variabile

Il caso più semplice si può risolvere a mano. Si abbia una sola feature con xTx=1x^Tx=1 (colonna di norma 1 e centrata) e si indichi con zz il coefficiente OLS, z=xTyz=x^Ty. Allora ∥y−xb∥2=costante+(b−z)2\lVert y-x b\rVert^2=\text{costante}+(b-z)^2 (perché ∥y−xb∥2=yTy−2b xTy+b2\lVert y-xb\rVert^2=y^Ty-2b\,x^Ty+b^2 e b2−2bz=(b−z)2−z2b^2-2bz=(b-z)^2-z^2). Il costo da minimizzare è f(b)=(b−z)2+λ∣b∣.f(b)=(b-z)^2+\lambda|b|.

  • Ridge (penalità λb2\lambda b^2): f′(b)=2(b−z)+2λb=0⇒b=z1+λf'(b)=2(b-z)+2\lambda b=0\Rightarrow b=\dfrac{z}{1+\lambda}. Il coefficiente è diviso per 1+λ1+\lambda: non è mai zero se z≠0z\neq0.
  • LASSO. Per b>0b>0: f′(b)=2(b−z)+λ=0⇒b=z−λ/2f'(b)=2(b-z)+\lambda=0\Rightarrow b=z-\lambda/2, accettabile solo se z>λ/2z>\lambda/2. Per b<0b<0: f′(b)=2(b−z)−λ=0⇒b=z+λ/2f'(b)=2(b-z)-\lambda=0\Rightarrow b=z+\lambda/2, accettabile solo se z<−λ/2z<-\lambda/2. Se ∣z∣≤λ/2|z|\le\lambda/2 nessuno dei due vale e il minimo è in b=0b=0 (nel punto angoloso il valore assoluto ha pendenza che va da −1-1 a +1+1 e riesce a bilanciare la pendenza −2z-2z del termine quadratico quando ∣2z∣≤λ|2z|\le\lambda). In una formula (soglia morbida, soft-thresholding): b^LASSO=sign⁡(z) max⁡ ⁣(∣z∣−λ2, 0).\hat b_{\text{LASSO}}=\operatorname{sign}(z)\,\max\!\Big(|z|-\frac\lambda2,\,0\Big).

Esempio (λ=1\lambda=1). Per z=0,8z=0{,}8: LASSO 0,8−0,5=0,30{,}8-0{,}5=0{,}3, ridge 0,8/2=0,40{,}8/2=0{,}4. Per z=0,3z=0{,}3: LASSO 00 (perché 0,3≤0,50{,}3\le0{,}5), ridge 0,150{,}15. Per z=−0,9z=-0{,}9: LASSO −0,4-0{,}4, ridge −0,45-0{,}45. Il LASSO sottrae una quantità fissa e taglia a zero i coefficienti piccoli; la ridge li riduce in proporzione e non li annulla.

Grafico interattivo: Coefficiente OLS z (ascissa) e coefficiente regolarizzato (ordinata) per λ = 1: il LASSO è nullo per |z| ≤ 0,5 e poi sottrae 0,5 (soglia morbida), la ridge divide per 2 e non si annulla mai

Interpretazione geometrica

Il problema regolarizzato è equivalente (per un opportuno ss legato a λ\lambda) a minimizzare l'errore quadratico con un vincolo: ∑j∣βj∣≤s\sum_j|\beta_j|\le s per il LASSO, ∑jβj2≤s\sum_j\beta_j^2\le s per la ridge (relazione con i moltiplicatori di Lagrange: Massimi e minimi vincolati e moltiplicatori di LagrangeGli estremi di f sul vincolo g = c si cercano per sostituzione, per parametrizzazione o con i moltiplicatori di Lagrange: se f, g sono C¹, P0 è un estremo vincolato e ∇g(P0) ≠ 0, esiste λ con ∇f(P0) = λ∇g(P0) (curva di livello di f tangente al vincolo). Si risolve il sistema ∇f = λ∇g, g = c, si aggiungono i punti del vincolo con ∇g = 0 e si confrontano i valori; se il vincolo è compatto, Weierstrass garantisce massimo e minimo.Massimi e minimi vincolati e moltiplicatori di Lagrange →). Con due coefficienti il vincolo è un rombo per il LASSO (con gli spigoli sugli assi) e un cerchio per la ridge. Le curve di livello dell'errore sono ellissi centrate nella soluzione OLS; la soluzione regolarizzata è il primo punto in cui l'ellisse tocca il vincolo. Per il cerchio il contatto avviene in un punto qualsiasi del bordo (di solito con entrambe le coordinate non nulle); il rombo ha spigoli sugli assi, e l'ellisse tende a toccare uno spigolo, dove una coordinata è zero: soluzione sparsa.

Grafico interattivo: Due coefficienti: il vincolo del LASSO |β₁| + |β₂| ≤ 1 è un rombo, quello della ridge β₁² + β₂² ≤ 1 un cerchio; una curva di livello dell'errore (ellisse con centro (1,8; 0,7), la soluzione OLS) tocca il rombo nello spigolo (1, 0), dove β₂ = 0

(L'ellisse del disegno è stata scelta in modo da toccare lo spigolo; con altri dati il contatto cade altrove: la sparsità è una tendenza della penalità L1L_1, non una garanzia.)

Ridge e LASSO a confronto

Ridge (L2L_2) LASSO (L1L_1)
Pro previene l'overfitting riducendo i coefficienti; funziona bene con feature collineari (distribuisce i pesi); ha una soluzione in forma chiusa seleziona le feature e dà un modello sparso, più semplice e interpretabile
Contro non azzera nulla: nessuna selezione di feature, modello meno interpretabile; non ideale con molte feature irrilevanti nessuna formula chiusa; con feature molto correlate tende a sceglierne una quasi a caso (instabile)

Elastic Net. Combina le due penalità per superarne i difetti: J(β)=∑i=1n(yi−xiTβ)2+λ1∑j=1p∣βj∣+λ2∑j=1pβj2,λ1=αλ,  λ2=(1−α)λ.J(\beta)=\sum_{i=1}^n(y_i-x_i^T\beta)^2+\lambda_1\sum_{j=1}^p|\beta_j|+\lambda_2\sum_{j=1}^p\beta_j^2,\qquad\lambda_1=\alpha\lambda,\ \ \lambda_2=(1-\alpha)\lambda. Per α=1\alpha=1 è il LASSO puro, per α=0\alpha=0 la ridge pura. Il vincolo geometrico è un rombo con i lati incurvati, tra il rombo e il cerchio.

La discesa del gradiente

Idea

Per il LASSO non si può risolvere ∇J=0\nabla J=0 in forma chiusa. Come per ogni addestramento supervisionato (minimizzare una perdita L\mathcal L, che può essere l'MSE o la cross-entropy della classificazione), si cerca il vettore di pesi che minimizza la perdita totale: W∗=arg⁡min⁡WJ(W),J(W)=1n∑i=1nL(f(x(i);W),y(i)).W^\ast=\arg\min_WJ(W),\qquad J(W)=\frac1n\sum_{i=1}^n\mathcal L\big(f(x^{(i)};W),y^{(i)}\big). Il gradiente ∇J(W)\nabla J(W), vettore delle derivate parziali (Differenziabilità e gradientef è differenziabile in x0 se f(x) = f(x0) + ∇f(x0)·(x − x0) + o(‖x − x0‖): vicino a x0 il grafico si confonde con il piano tangente z = f(x0) + ∇f(x0)·(x − x0). Differenziabile ⇒ continua, derivabile e D_v f = ∇f·v; derivate parziali continue ⇒ differenziabile. Il gradiente indica la direzione di massima crescita (pendenza ‖∇f‖) ed è ortogonale alle curve di livello.Differenziabilità e gradiente →, Gradiente e direzione di massima crescitaIl gradiente è il vettore delle derivate parziali ∇f(p) = (∂₁f(p), …, ∂ₙf(p)). Se f è C¹ (derivate parziali continue) vale la formula del gradiente D_u f(p) = ∇f(p)·u: tutte le derivate direzionali si ottengono dalle parziali e u ↦ D_u f(p) è lineare. Tra i versori, la crescita è massima lungo ∇f/|∇f| (pendenza |∇f|), minima lungo −∇f/|∇f| (pendenza −|∇f|), nulla lungo le direzioni ortogonali al gradiente. Utili: ∇|x| = x/|x|, ∇φ(|x|) = φ'(|x|) x/|x|.Gradiente e direzione di massima crescita →), punta nella direzione di massima crescita di JJ ed è perpendicolare alle curve di livello. Per scendere si va nella direzione opposta.

Formula (discesa del gradiente, gradient descent). Partendo da un WW iniziale, si ripete W←W−η ∇J(W),W\leftarrow W-\eta\,\nabla J(W), dove η>0\eta>0 è il passo (learning rate), fino a convergenza (per esempio finché ∥Wnuovo−W∥<tol\lVert W_{\text{nuovo}}-W\rVert<\text{tol} o dopo un numero massimo di iterazioni).

inizializza W (a caso, ~N(0, σ²), oppure con le scelte sotto)
ripeti fino a convergenza:
    g = gradiente di J in W
    W = W - eta * g
restituisci W

Esempio in una variabile. J(w)=w2J(w)=w^2 ha gradiente 2w2w e minimo in w=0w=0. L'aggiornamento è w←w−η⋅2w=(1−2η)ww\leftarrow w-\eta\cdot2w=(1-2\eta)w. Partendo da w0=4w_0=4:

η\eta iterate w0,w1,w2,w3,w4w_0,w_1,w_2,w_3,w_4 comportamento
0,10{,}1 4; 3,2; 2,56; 2,048; 1,6384;\ 3{,}2;\ 2{,}56;\ 2{,}048;\ 1{,}638 converge lentamente (fattore 0,80{,}8 a ogni passo)
0,50{,}5 4; 0; 0;…4;\ 0;\ 0;\dots arriva subito al minimo
1,11{,}1 4; −4,8; 5,76; −6,912; 8,294;\ -4{,}8;\ 5{,}76;\ -6{,}912;\ 8{,}29 diverge (fattore −1,2-1{,}2, con modulo maggiore di 1)

Grafico interattivo: Discesa del gradiente su J(w) = w² partendo da w = 4: con η = 0,1 si scende lentamente verso il minimo, con η = 1,1 i passi saltano da un lato all'altro della parabola e si allontanano

Scelta del passo η\eta

Il passo è critico: troppo grande, l'algoritmo diverge; troppo piccolo, la convergenza è lenta. Indicazioni:

  1. Limite superiore. Per l'errore quadratico J(β)=∥y−Xβ∥2J(\beta)=\lVert y-X\beta\rVert^2 il gradiente è ∇J=2XT(Xβ−y)\nabla J=2X^T(X\beta-y). Sia β∗\beta^\ast il minimo e e=β−β∗e=\beta-\beta^\ast l'errore. Poiché XT(Xβ∗−y)=0X^T(X\beta^\ast-y)=0, un passo dà e←e−2ηXTXe=(I−2ηXTX)ee\leftarrow e-2\eta X^TXe=(I-2\eta X^TX)e. Si decompone ee nella base degli autovettori di XTXX^TX (simmetrica, autovalori μi≥0\mu_i\ge0: Autovalori e autovettoriUn autovettore è un vettore non nullo che una funzione lineare manda in un suo multiplo; si trovano gli autovalori come radici del polinomio caratteristico det(A − λI) e gli autovettori come nucleo di A − λI. Matrici simili hanno gli stessi autovalori.Autovalori e autovettori →, Teorema spettrale e forme quadraticheUna funzione lineare è simmetrica se f(v)·w = v·f(w); in una base ortonormale ha matrice simmetrica. Teorema spettrale: f è simmetrica se e solo se esiste una base ortonormale di autovettori, cioè A simmetrica ⇔ PᵀAP diagonale con P ortogonale. Applicato alle forme quadratiche, permette di scriverle come somma di quadrati con gli autovalori come coefficienti.Teorema spettrale e forme quadratiche →): la componente ii si moltiplica per 1−2ημi1-2\eta\mu_i a ogni passo, quindi tende a zero se e solo se ∣1−2ημi∣<1|1-2\eta\mu_i|<1, cioè 0<η<1/μi0<\eta<1/\mu_i. Per tutte le direzioni: η<1L,L=μmax⁡(XTX)\eta<\frac1L,\qquad L=\mu_{\max}(X^TX) (il massimo autovalore di XTXX^TX, la costante di Lipschitz delle slide). Con la perdita normalizzata per nn o con altri fattori il limite cambia per lo stesso fattore.
  2. Passo adattivo. Si fa decrescere η\eta durante l'addestramento: passi grandi all'inizio (lontano dal minimo), piccoli alla fine: ηt=η01+γt,\eta_t=\frac{\eta_0}{1+\gamma t}, con η0\eta_0 passo iniziale, tt l'iterazione, γ\gamma parametro di decadimento (per esempio 0,010{,}01).

Esempio completo (stessi dati della regressione lineare). Per x=[1,2,3,4]x=[1,2,3,4], y=[2,3,5,4]y=[2,3,5,4] la matrice XTX=[4101030]X^TX=\begin{bmatrix}4&10\\10&30\end{bmatrix} ha autovalori 0,5990{,}599 e 33,4033{,}40; quindi η<1/33,40=0,0299\eta<1/33{,}40=0{,}0299. Con η=0,02\eta=0{,}02 e β0=(0,0)\beta_0=(0,0): il gradiente è 2XT(Xβ−y)=−2XTy=−2(14,39)=(−28,−78)2X^T(X\beta-y)=-2X^Ty=-2(14,39)=(-28,-78) e il primo passo dà β=(0,56; 1,56)\beta=(0{,}56;\ 1{,}56). Al secondo passo il gradiente è (7,68; 26,8)(7{,}68;\ 26{,}8) e β=(0,406; 1,024)\beta=(0{,}406;\ 1{,}024); al terzo (−4,27; −8,43)(-4{,}27;\ -8{,}43) e β=(0,492; 1,193)\beta=(0{,}492;\ 1{,}193). Dopo 2000 iterazioni β=(1,5; 0,8)\beta=(1{,}5;\ 0{,}8), la soluzione OLS (la direzione dell'autovalore piccolo converge lentamente). Con η=0,035>0,0299\eta=0{,}035>0{,}0299 il metodo diverge: i valori del gradiente passano da (0,98; 2,73)(0{,}98;\ 2{,}73) a (−0,23; −0,96)(-0{,}23;\ -0{,}96), poi (1,49; 3,94)(1{,}49;\ 3{,}94), e crescono in modulo.

La stessa convergenza si osserva nel laboratorio (MSE per η=0,0001\eta=0{,}0001, 0,0010{,}001, 0,0090{,}009: troppo piccolo, giusto, troppo grande). Con η=0,009\eta=0{,}009 la perdita diverge, ma con il passo adattivo ηt=0,009/(1+0,1t)\eta_t=0{,}009/(1+0{,}1t) si stabilizza.

Da dove partire

Il punto iniziale può essere casuale, ma alcune regole accelerano la ricerca:

  1. se λ\lambda è grande: partenza da zero (la soluzione ha molti coefficienti nulli);
  2. se le feature sono molto correlate: partire dalla soluzione ridge;
  3. se le feature sono indipendenti e λ\lambda è piccolo: partire dalla soluzione OLS;
  4. nel dubbio: ridge o OLS, che sono punti di partenza ragionevoli.

Il gradiente del LASSO: il subgradiente

Il valore assoluto non è derivabile in 00 (Derivata - definizione e significatoLa derivata è il limite del rapporto incrementale; geometricamente è la pendenza della retta tangente. f è derivabile in x0 se e solo se f(x) = f(x0) + f'(x0)(x − x0) + o(x − x0); derivabile implica continua, non viceversa. Derivata destra e sinistra, punti angolosi, flessi a tangente verticale, cuspidi.Derivata - definizione e significato →): la derivata vale +1+1 per w>0w>0, −1-1 per w<0w<0 e per w=0w=0 non è definita (il grafico ha uno spigolo). Si usa il subgradiente: un numero gg tale che la retta di pendenza gg per il punto sta sotto la funzione, f(w′)≥f(w)+g (w′−w)per ogni w′.f(w')\ge f(w)+g\,(w'-w)\quad\text{per ogni }w'. Per f(w)=∣w∣f(w)=|w| l'insieme dei subgradienti è ∂∣w∣={+1w>0−1w<0qualsiasi valore in [−1,1]w=0.\partial|w|=\begin{cases}+1&w>0\\-1&w<0\\ \text{qualsiasi valore in }[-1,1]&w=0.\end{cases} Si può quindi usare sign⁡(w)\operatorname{sign}(w) con la convenzione sign⁡(0)=0\operatorname{sign}(0)=0. Il termine dell'errore ha gradiente 2XT(Xβ−y)2X^T(X\beta-y) (come per l'OLS), perciò con β=(β0,…,βp)\beta=(\beta_0,\dots,\beta_p):

Formula (subgradiente del LASSO). ∇βJ=2XT(Xβ−y)+λ[0sign⁡(β1)⋮sign⁡(βp)],\nabla_\beta J=2X^T(X\beta-y)+\lambda\begin{bmatrix}0\\ \operatorname{sign}(\beta_1)\\ \vdots\\ \operatorname{sign}(\beta_p)\end{bmatrix}, con 00 al posto di sign⁡(β0)\operatorname{sign}(\beta_0) perché l'intercetta non si penalizza.

Esempio. Con λ=1\lambda=1, β=(0,5; −2; 0)\beta=(0{,}5;\ -2;\ 0) e componente dell'errore 2XT(Xβ−y)=(1; 3; −4)2X^T(X\beta-y)=(1;\ 3;\ -4): il subgradiente è (1+0; 3+1⋅(−1); −4+1⋅0)=(1; 2; −4)(1+0;\ 3+1\cdot(-1);\ -4+1\cdot0)=(1;\ 2;\ -4).

La funzione di costo è convessa in tutti e tre i casi (OLS, ridge, LASSO): somma di una quadratica convessa e di una penalità convessa (Funzioni convesse in più variabiliUn insieme C è convesso se contiene il segmento tra due suoi punti; f: C → R è convessa se f(tx + (1−t)y) ≤ t f(x) + (1−t) f(y) per t in [0,1], cioè il grafico sta sotto le corde. Se f è differenziabile, è convessa se e solo se f(y) ≥ f(x) + ∇f(x)·(y − x) (il grafico sta sopra ogni piano tangente). Se f è C² su un aperto convesso, è convessa se e solo se l'hessiana è semidefinita positiva in ogni punto; se è definita positiva ovunque f è strettamente convessa (non vale il viceversa: x⁴). Per una funzione convessa ogni punto critico è un minimo globale.Funzioni convesse in più variabili →); nelle curve di livello (cerchi per ridge e OLS standardizzati, forma «a diamante» smussato per il LASSO) c'è un solo minimo. Per questo la discesa del gradiente non resta intrappolata in minimi locali. Con il subgradiente, però, i coefficienti tendono a oscillare intorno a zero senza fermarsi esattamente su zero; per ottenere zeri esatti si usano metodi dedicati, come la soglia morbida vista sopra (coordinata per coordinata) o la Least Angle Regression (LARS), citati nelle slide con i «metodi per sottocoordinate».

python
import numpy as np

def lasso_gradient(X, y, beta, lam):
    g = 2 * X.T @ (X @ beta - y)          # parte dell'errore quadratico
    pen = lam * np.sign(beta)             # subgradiente di |beta_j|
    pen[0] = 0                            # niente penalità sull'intercetta
    return g + pen

def train_lasso_gd(X, y, lam, lr, max_iter=1000, tol=1e-6):
    X = np.hstack([np.ones((len(X), 1)), X])          # X standardizzata + colonna di uni
    beta = np.random.randn(X.shape[1], 1)
    for _ in range(max_iter):
        new = beta - lr * lasso_gradient(X, y, beta, lam)
        if np.linalg.norm(new - beta) < tol:           # criterio di arresto
            break
        beta = new
    return beta

y deve avere forma (n,1)(n,1) come beta, altrimenti la sottrazione X @ beta - y fa il broadcasting e i risultati sono sbagliati in silenzio.

Scegliere il passo e λ\lambda

Il passo η\eta e λ\lambda sono iperparametri. Il laboratorio (Lezione 12 · Laboratorio di regolarizzazione) li sceglie con la cross-validation annidata sul dataset prostate (Overfitting, ridge regression e cross-validationUna buona prestazione sul training non basta: serve stimare quella su dati nuovi. La cross-validation (K-fold: $k$ parti, ciascuna a turno come test, errore medio; Monte Carlo: $k$ divisioni casuali con quota di test $q$; leave-one-out se $k=n$) evita di dipendere da una sola divisione casuale. L'errore atteso si scompone in $\text{bias}^2+\text{varianza}+\sigma^2$: i modelli semplici fanno underfitting (bias alto), quelli complessi overfitting (varianza alta). La regolarizzazione aggiunge alla perdita una penalità: la ridge regression minimizza $|y-X\beta|^2+\lambda\sum_{j\ge1}\beta_j^2$ e ha soluzione $\beta=(X^TX+\lambda\tilde I)^{-1}X^Ty$ (l'intercetta non si penalizza, le feature si standardizzano): riduce i coefficienti, rende l'inversa stabile con feature collineari, e $\lambda$ è un iperparametro scelto con la validazione (cross-validation annidata per non contaminare il test).Overfitting, ridge regression e cross-validation →): K=8K=8 fold esterni, D=4D=4 fold interni, griglia di 28 combinazioni (4 passi ×\times 7 valori di λ\lambda, da 10−410^{-4} a 100100), con le feature standardizzate dentro ogni fold usando solo il training. Nelle combinazioni con passo troppo grande e λ\lambda elevato l'algoritmo diverge (valori inf/nan): la selezione le scarta perché l'errore di validazione risulta il peggiore.

Errori tipici

  • Penalizzare l'intercetta o non standardizzare le feature prima del LASSO.
  • Scegliere η\eta troppo grande: l'errore cresce invece di scendere (controllare la curva di perdita).
  • Usare lo stesso insieme per scegliere λ\lambda e per stimare la prestazione.
  • Aspettarsi dal subgradiente zeri esatti: servono soglia morbida o metodi dedicati.
  • Dimenticare il verso: il gradiente punta verso l'alto, l'aggiornamento sottrae η∇J\eta\nabla J.
  • Con feature molto correlate il LASSO ne sceglie una in modo instabile: meglio Elastic Net o ridge.

Versione ripasso

Definizione (LASSO). Penalità L1L_1: J(β)=∥y−Xβ∥2+λ∑j≥1∣βj∣J(\beta)=\lVert y-X\beta\rVert^2+\lambda\sum_{j\ge1}|\beta_j| (β0\beta_0 non penalizzato, feature standardizzate). Porta coefficienti esattamente a zero: soluzione sparsa, selezione delle feature, modello leggero e interpretabile, robusto.

Esempio. β1,2=(2;−0,5)\beta_{1,2}=(2;-0{,}5), λ=4\lambda=4: penalità L1=4⋅2,5=10L_1=4\cdot2{,}5=10, ridge 4⋅4,25=174\cdot4{,}25=17.

Una variabile (xTx=1x^Tx=1, zz coefficiente OLS): ridge b^=z/(1+λ)\hat b=z/(1+\lambda); LASSO b^=sign⁡(z)max⁡(∣z∣−λ/2,0)\hat b=\operatorname{sign}(z)\max(|z|-\lambda/2,0) (soglia morbida: f′(b)=2(b−z)±λf'(b)=2(b-z)\pm\lambda, nullo in 00 se ∣z∣≤λ/2|z|\le\lambda/2). Con λ=1\lambda=1: z=0,8→0,3z=0{,}8\to0{,}3 (LASSO) e 0,40{,}4 (ridge); z=0,3→0z=0{,}3\to0 e 0,150{,}15.

Geometria. Vincolo ∑∣βj∣≤s\sum|\beta_j|\le s = rombo (spigoli sugli assi), ridge ∑βj2≤s\sum\beta_j^2\le s = cerchio; l'ellisse dell'errore tocca il rombo in uno spigolo ⇒\Rightarrow coefficiente nullo.

Ridge vs LASSO. Ridge: forma chiusa, buona con collinearità, non seleziona. LASSO: seleziona, niente forma chiusa, instabile con feature correlate. Elastic Net: J=∑(yi−xiTβ)2+λ1∑∣βj∣+λ2∑βj2J=\sum(y_i-x_i^T\beta)^2+\lambda_1\sum|\beta_j|+\lambda_2\sum\beta_j^2, λ1=αλ\lambda_1=\alpha\lambda, λ2=(1−α)λ\lambda_2=(1-\alpha)\lambda (α=1\alpha=1 LASSO, α=0\alpha=0 ridge).

Formula (discesa del gradiente). W←W−η ∇J(W)W\leftarrow W-\eta\,\nabla J(W) fino a convergenza. Il gradiente indica la massima crescita; si va in senso opposto.

Esempio. J=w2J=w^2, w0=4w_0=4: w←(1−2η)ww\leftarrow(1-2\eta)w; η=0,1\eta=0{,}1: 4;3,2;2,56;…4;3{,}2;2{,}56;\dots; η=0,5\eta=0{,}5: 00 subito; η=1,1\eta=1{,}1: 4;−4,8;5,76;…4;-4{,}8;5{,}76;\dots diverge.

Passo. Per J=∥y−Xβ∥2J=\lVert y-X\beta\rVert^2: errore e←(I−2ηXTX)ee\leftarrow(I-2\eta X^TX)e, converge se ∣1−2ημi∣<1|1-2\eta\mu_i|<1, cioè η<1/μmax⁡(XTX)\eta<1/\mu_{\max}(X^TX) (esempio: μmax⁡=33,4⇒η<0,0299\mu_{\max}=33{,}4\Rightarrow\eta<0{,}0299). Adattivo: ηt=η0/(1+γt)\eta_t=\eta_0/(1+\gamma t). Partenza: λ\lambda grande →\to zero; feature correlate →\to ridge; indipendenti e λ\lambda piccolo →\to OLS.

Formula (subgradiente LASSO). ∇βJ=2XT(Xβ−y)+λ (0,sign⁡β1,…,sign⁡βp)T\nabla_\beta J=2X^T(X\beta-y)+\lambda\,(0,\operatorname{sign}\beta_1,\dots,\operatorname{sign}\beta_p)^T. Subgradiente di ∣w∣|w|: +1+1 per w>0w>0, −1-1 per w<0w<0, [−1,1][-1,1] per w=0w=0.

Esempio. λ=1\lambda=1, β=(0,5;−2;0)\beta=(0{,}5;-2;0), errore (1;3;−4)(1;3;-4): subgradiente (1;2;−4)(1;2;-4).

JJ è convessa (un solo minimo); il subgradiente non dà zeri esatti (servono soglia morbida, LARS). η\eta e λ\lambda si scelgono con la cross-validation annidata.

Errori tipici: penalizzare l'intercetta; non standardizzare; η\eta troppo grande; scordare il segno meno; aspettarsi zeri esatti dal subgradiente.

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata