Esercizio - Cross-validation annidata per il LASSO sul dataset prostate
Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.
In questa pagina 4
Testo (laboratorio LAB3, parte 3). Dataset prostate: 96 osservazioni, 8 feature cliniche (lcavol, lweight, age, lbph, svi, lcp, gleason, pgg45) e target lpsa (logaritmo del PSA). Si vuole addestrare un LASSO con discesa del gradiente e scegliere gli iperparametri (passo) e con la cross-validation annidata:
- passi e (28 combinazioni);
- ciclo esterno fold, ciclo interno fold, massimo 1000 iterazioni di discesa del gradiente.
Stimare MSE e del procedimento e commentare la scelta degli iperparametri.
Teoria usata: LASSO e discesa del gradienteIl LASSO è la regressione regolarizzata con penalità $L_1$: minimizza $\sum_i(y_i-x_i^T\beta)^2+\lambda\sum_{j\ge1}|\beta_j|$. A differenza della ridge, porta alcuni coefficienti esattamente a zero (soluzione sparsa, selezione delle feature): geometricamente le curve di livello dell'errore toccano il vincolo $\sum|\beta_j|\le s$ (un rombo) in uno spigolo. Non ha formula chiusa, quindi si minimizza con la discesa del gradiente $W\leftarrow W-\eta,\nabla J(W)$, usando il subgradiente $\operatorname{sign}(\beta_j)$ per il valore assoluto (nel punto 0 qualunque valore in $[-1,1]$). Il passo $\eta$ è critico: per l'errore quadratico converge se $\eta<1/\mu_{\max}(X^TX)$; si può usare $\eta_t=\eta_0/(1+\gamma t)$. L'Elastic Net combina le penalità $L_1$ e $L_2$ con $\lambda_1=\alpha\lambda$, $\lambda_2=(1-\alpha)\lambda$.LASSO e discesa del gradiente → (subgradiente, passo), 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 → (cross-validation annidata, standardizzazione nei fold).
Procedura (per ogni fold esterno )
- Fold esterno: 12 campioni di test, 84 di training (e train+validation).
- Ciclo interno: per ciascuna delle 28 combinazioni , si dividono gli 84 campioni in 4 fold da 21; per ogni fold interno: i 63 restanti sono il training interno, si standardizzano le feature con media e deviazione standard di quel training interno (e si applicano al fold di validazione), si addestra il LASSO con la discesa del gradiente ( iniziale casuale , aggiornamento , intercetta non penalizzata) e si calcola l'MSE sul fold di validazione.
- Per ogni combinazione si fa la media dei 4 MSE di validazione; si sceglie la combinazione con la media minore (le combinazioni che divergono danno
infonane non possono essere scelte). - Con la combinazione scelta si riaddestra il modello su tutti gli 84 campioni (standardizzati con le loro statistiche) e lo si valuta sui 12 campioni del fold esterno: MSE e .
- Finiti gli 8 fold si riassumono MSE e (media e deviazione standard) e si riaddestra un modello finale su tutto il dataset con la combinazione più frequente.
Risultati (seme 0)
| fold esterno | combinazione scelta | MSE di validazione | MSE di test | test |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 | ||||
| 6 | ||||
| 7 | ||||
| 8 |
Media sui fold esterni: (deviazione standard ) e . Il modello spiega circa la metà della varianza del target, e l'errore dipende molto dal fold (da a ): con 12 campioni di test la stima di un singolo fold è molto rumorosa, ed è per questo che si fa la media.
Commento
- Passo. La scelta cade quasi sempre su (7 fold su 8), una volta su . Il passo diverge per ogni : per il training interno la matrice (con la colonna di uni) ha autovalore massimo , quindi il limite di convergenza è (LASSO e discesa del gradienteIl LASSO è la regressione regolarizzata con penalità $L_1$: minimizza $\sum_i(y_i-x_i^T\beta)^2+\lambda\sum_{j\ge1}|\beta_j|$. A differenza della ridge, porta alcuni coefficienti esattamente a zero (soluzione sparsa, selezione delle feature): geometricamente le curve di livello dell'errore toccano il vincolo $\sum|\beta_j|\le s$ (un rombo) in uno spigolo. Non ha formula chiusa, quindi si minimizza con la discesa del gradiente $W\leftarrow W-\eta,\nabla J(W)$, usando il subgradiente $\operatorname{sign}(\beta_j)$ per il valore assoluto (nel punto 0 qualunque valore in $[-1,1]$). Il passo $\eta$ è critico: per l'errore quadratico converge se $\eta<1/\mu_{\max}(X^TX)$; si può usare $\eta_t=\eta_0/(1+\gamma t)$. L'Elastic Net combina le penalità $L_1$ e $L_2$ con $\lambda_1=\alpha\lambda$, $\lambda_2=(1-\alpha)\lambda$.LASSO e discesa del gradiente →); lo supera e i valori esplodono (
nan), è così piccolo che in 1000 iterazioni non si arriva alla soluzione. Questo è il compromesso «passo troppo grande: diverge; troppo piccolo: lento». - . Le scelte sono piccole ( ... ): con 8 feature standardizzate e 63-84 campioni l'OLS ha già poca varianza, e la penalità conta poco per i valori scelti. Le combinazioni con grande non vengono mai scelte (l'MSE di validazione è peggiore). Nei modelli finali i coefficienti standardizzati più grandi sono quelli di
lcavol(-), poisvi(-) elweight(-), con intercetta -; nessun coefficiente è esattamente zero (il subgradiente non dà zeri esatti, vedi LASSO e discesa del gradienteIl LASSO è la regressione regolarizzata con penalità $L_1$: minimizza $\sum_i(y_i-x_i^T\beta)^2+\lambda\sum_{j\ge1}|\beta_j|$. A differenza della ridge, porta alcuni coefficienti esattamente a zero (soluzione sparsa, selezione delle feature): geometricamente le curve di livello dell'errore toccano il vincolo $\sum|\beta_j|\le s$ (un rombo) in uno spigolo. Non ha formula chiusa, quindi si minimizza con la discesa del gradiente $W\leftarrow W-\eta,\nabla J(W)$, usando il subgradiente $\operatorname{sign}(\beta_j)$ per il valore assoluto (nel punto 0 qualunque valore in $[-1,1]$). Il passo $\eta$ è critico: per l'errore quadratico converge se $\eta<1/\mu_{\max}(X^TX)$; si può usare $\eta_t=\eta_0/(1+\gamma t)$. L'Elastic Net combina le penalità $L_1$ e $L_2$ con $\lambda_1=\alpha\lambda$, $\lambda_2=(1-\alpha)\lambda$.LASSO e discesa del gradiente →). - Perché annidata. Gli MSE di validazione (circa -) sono ottimistici rispetto a quelli del test (la media è ma con grande varianza): la combinazione scelta dipende dai fold interni, e il ciclo esterno dà una stima non influenzata dalla scelta.
- Modello finale. Si sceglie la combinazione più frequente (qui e , due volte ciascuna) e si riaddestra su tutti i 96 campioni.
Codice (struttura)
for i in range(K): # ciclo esterno
X_test, y_test = fold i; X_tr, y_tr = gli altri
best, best_mse = None, np.inf
for lr, lam in combos: # 28 combinazioni
mses = []
for j in range(D): # ciclo interno
X_in, y_in, X_val, y_val = split(X_tr, y_tr, j)
mu, sd = X_in.mean(0), X_in.std(0) # statistiche del solo training interno
b = train_lasso_gd((X_in - mu) / sd, y_in, lam, lr, max_iter=1000)
mses.append(np.mean((y_val - (b[0] + ((X_val - mu) / sd) @ b[1:])) ** 2))
if np.isfinite(np.mean(mses)) and np.mean(mses) < best_mse:
best, best_mse = (lr, lam), np.mean(mses)
# riaddestra su X_tr con `best` e valuta su X_test -> MSE, R2Il numero totale di addestramenti è per la ricerca più per la valutazione. Il codice completo (con train_lasso_gd e lasso_gradient) è in LASSO e discesa del gradienteIl LASSO è la regressione regolarizzata con penalità $L_1$: minimizza $\sum_i(y_i-x_i^T\beta)^2+\lambda\sum_{j\ge1}|\beta_j|$. A differenza della ridge, porta alcuni coefficienti esattamente a zero (soluzione sparsa, selezione delle feature): geometricamente le curve di livello dell'errore toccano il vincolo $\sum|\beta_j|\le s$ (un rombo) in uno spigolo. Non ha formula chiusa, quindi si minimizza con la discesa del gradiente $W\leftarrow W-\eta,\nabla J(W)$, usando il subgradiente $\operatorname{sign}(\beta_j)$ per il valore assoluto (nel punto 0 qualunque valore in $[-1,1]$). Il passo $\eta$ è critico: per l'errore quadratico converge se $\eta<1/\mu_{\max}(X^TX)$; si può usare $\eta_t=\eta_0/(1+\gamma t)$. L'Elastic Net combina le penalità $L_1$ e $L_2$ con $\lambda_1=\alpha\lambda$, $\lambda_2=(1-\alpha)\lambda$.LASSO e discesa del gradiente →.