Se \(n \gg p\) allora lo stimatore OLS tenderà ad avere una varianza più bassa, cioé mi aspetto stime simili per i coefficienti delle variabili esplicative pur stimando il modello con dati diversi;
se \(n \approx p\) allora lo stimatore OLS tenderà ad andare in overfitting e restituire stime non affidabili una volta cambiato l’insieme di dati;
se \(n=p\) il modello overfitta completamente i dati, interpolandoli, e restituisce delle pessime previsioni;
infine se \(n<p\) non esiste una soluzione unica per le stime dei coefficienti \(\beta\) e non possiamo usare OLS.
Dobbiamo quindi in definitiva tenere sotto controllo la varianza dello stimatore OLS e, nell’ultimo caso, trovare una soluzione ricorrendo ad uno dei seguenti metodi:
1.Subset Selection
Identifichiamo le variabili che riteniamo essere in relazione con la variabile target ed addestriamo il modello solo sulle variabili così selezionate.
2.Dimension Reduction
Anziché selezionare variabili, usiamo tutte e \(p\) le variabili per proiettarle in un nuovo spazio di \(q < p\) variabili, dove ciascuna delle nuove variabili è una combinazione lineare di quelle originarie. Usiamo le \(q\) variabili per stimare il modello.
3. Regularization
Uso tutte e \(p\) le variabili, ma riformulo il problema OLS in uno di minimizzazione vincolata, che - relativamente al caso standard - porta a delle stime dei \(\beta\) shrinked verso lo 0.
Caso di regressione con regolarizzatore, dove usiamo tutte e \(p\) le variabili ma imponiamo il vincolo che i \(\beta\) in norma non possono allontanarsi troppo dall’origine.
In termini formali il problema è:
\[\begin{aligned} & \min_{\boldsymbol{\beta} \in \mathbb{R}^p} \| \mathbf{y} - \mathbf{X}\boldsymbol{\beta} \|^2_2\\ & \mathrm{\,\,subject\,\,to\,\,}\|\boldsymbol{\beta}\|^2_2 \leq t \end{aligned}\]
che può riformulato in un problema di ottimizzazione libera semplicemente aggiungendo al vincolo il moltiplicatore di Kuhn-Tucker \(\lambda \in [0,\infty)\).
\[\min_{\boldsymbol{\beta} \in \mathbb{R}^p} \left\{ \sum_{i=1}^{n}(y_i - x_i^\mathsf{T}\boldsymbol{\beta} )^2 + \lambda\sum_{j=1}^{p}\beta_j^2 \right\} = \min_{\boldsymbol{\beta} \in \mathbb{R}^p} \left\{ \underbrace{ \| \mathbf{y} - \mathbf{X}\boldsymbol{\beta} \|^2_2 }_{\mathrm{RSS} }+ \underbrace{\lambda\| \boldsymbol{\beta}\|^2_2}_{\mathrm{penalty}} \right\}\]
Il minimo per la parte RSS si ottiene per \(\beta = \beta_{ols}\) mentre la funzione di penalty è minimizzata per \(\boldsymbol{\beta} = \boldsymbol{0_p}\), per cui la soluzione del problema sarà La soluzione del problema è la stima Ridge del vettore dei coefficienti: per calcolarla analiticamente basta considerare le derivate parziali rispetto a \(\beta\) e porle uguali a zero (First Order Conditions).
\[\hat{\boldsymbol{\beta}}(\lambda) = (\mathbf{X}^\mathsf{T}\mathbf{X} + \lambda \mathbf{I}_p )^{-1}\mathbf{X}^\mathsf{T} \mathbf{y} = \mathbf{H}(\lambda)\mathbf{y}\]
Questa soluzione sarà sempre unica per ogni design matrix \(X\), in quanto la matrice \((\mathbf{X}^\mathsf{T}\mathbf{X} + \lambda \mathbf{I}_p )\) è sempre invertibile per ogni \(\lambda > 0\).
All’aumentare del moltiplicatore, sarà più forte la penalità assegnata a \(\beta\) “grandi” in valore assoluto e quindi prevarrà l’effetto di shrinking verso lo 0.
Poiché il termine di penalty pesa allo stesso modo tutti i \(\beta\) bisogna prima standardizzare le variabili esplicative, i.e. bisogna centrarle (renderle a media 0) sottraendo a ciascuna la propria media campionaria e bisogna portare ad 1 la deviazione standard dividendo ciascuna per la propria deviazione standard campionaria.
Di solito anche la variabile risposta viene centrata e scalata e l’intercetta viene esclusa dalla funzione di penalty, in modo che la media dei valori di \(y\) coincide con la stima di \(\beta_0\).
Come scegliere il moltiplicatore \(\lambda\) ?
Nella pratica il parametro di penalty è ignoto e viene scelto con K fold CV o cross-validazione generalizzata.
Con il pacchetto glmnet si imposta il parametro \(\alpha=0\) per fare una regressione Ridge.
Con la funzione cv.glmnet() si esegue la cross-validazione e si specifica il numero di folds nell’argomento \(nfolds=K\). Si sceglie quindi il parametro ottimale chiamando la componente $lambda.min del modello addestrato.
Nel caso di LOOCV esiste una shortcut che permette di calcolare il valore ottimale di \(\lambda\) senza dover addestrare K-volte il modello, ma sfruttando la seguente relazione tra l’RSS che c’è nel K-esimo fold con l’RSS fatto sulla totalità dei dati:
\[ \frac{1}{n}\sum_{i=1}^{n}\Big[ y_i - x_i^\mathsf{T} \hat{\boldsymbol{\beta}}^{-i}(\lambda) \Big]^2 = \frac{1}{n}\sum_{i=1}^{n} \left[ \frac{y_i - x_i^\mathsf{T} \hat{\boldsymbol{\beta}}(\lambda)}{1-\{\mathbf{H}(\lambda)\}_{ii}} \right]^2\]
dove \(\mathbf{H}(\lambda)\) è la matrice di proiezione dei valori fittati, i.e. la matrice che post-moltiplicata per il vettore risposta fornisce il vettore delle previsioni.
Più formalmente è definita come \(\mathbf{H}(\lambda) = \mathbf{X}(\mathbf{X}^\mathsf{T}\mathbf{X} + \lambda \mathbf{I}_p )^{-1}\mathbf{X}^\mathsf{T}\)
Possiamo quindi calcolare la performance associata ad un particolare valore di \(\lambda\) a partire dalla matrice di proiezione e dal vettore \(y\), senza dover eseguire le \(K=n\) regressioni ridge (vantaggio computazionale notevole).
Bias-Variance Trade-off dello stimatore Ridge Il teorema n.2 di Theobald (1974) dimostra che, preso come criterio decisionale la somma \((Bias)^2 + Var\), esiste sempre un certo valore \(\lambda >0\) tale per cui la somma del Bias-Variance dello stimatore Ridge è inferiore a quella dello stimatore OLS.
In altre parole, esiste un valore del parametro per cui l’aumento di distorsione associato allo stimatore Ridge è inferiore alla riduzione di varianza, portando ad un livello complessivo di errore inferiore rispetto al caso standard OLS. Il problema è che tale valore del parametro dipende dalle quantità ignote \(\beta\) e \(\sigma\).
Passare dallo stimatore OLS allo stimatore Ridge
L’operatore lineare \(W = [\mathbf{I}_{p\times p} + \lambda(\mathbf{X}^\mathsf{T}\mathbf{X})^{-1}]^{-1}\) post-moltiplicato il vettore \(\beta_{ols}\) dà come risultato lo stimatore ridge \(\beta(\lambda)=H(\lambda)y\).
Dato valore di \(\lambda\) e noto lo stimatore OLS \(\beta_{OLS}\) si ricava quindi lo stimatore Ridge con la formula: \(\hat{\beta}(\lambda)=W \beta_{OLS}\).
library(ISLR)
data(Hitters)
# remove na
Hitters = na.omit(Hitters)
# transform into data frame the data matrix
Hitters = data.frame(model.matrix(lm(Salary ~ ., Hitters))[,-1], Salary=Hitters$Salary)
head(Hitters)
AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun CRuns CRBI CWalks LeagueN DivisionW PutOuts Assists Errors NewLeagueN Salary
-Alan Ashby 315 81 7 24 38 39 14 3449 835 69 321 414 375 1 1 632 43 10 1 475.0
-Alvin Davis 479 130 18 66 72 76 3 1624 457 63 224 266 263 0 1 880 82 14 0 480.0
-Andre Dawson 496 141 20 65 78 37 11 5628 1575 225 828 838 354 1 0 200 11 3 1 500.0
-Andres Galarraga 321 87 10 39 42 30 2 396 101 12 48 46 33 1 0 805 40 4 1 91.5
-Alfredo Griffin 594 169 4 74 51 35 11 4408 1133 19 501 336 194 0 1 282 421 25 0 750.0
-Al Newman 185 37 1 23 8 21 2 214 42 1 30 9 24 1 0 76 127 7 0 70.0
# length of test set
m = 100
# length of train set
n = nrow(Hitters)-m
set.seed(123)
test.id = sample(nrow(Hitters),m)
test = Hitters[test.id,-20]
ytest = Hitters[test.id,20]
train = Hitters[-test.id,]
lambda.vals = exp(seq(-10,10,by=0.1))
library(MASS)
fits = lm.ridge(Salary~.,data=train, lambda=lambda.vals)
preds = as.matrix(test) %*% t(coef(fits)[,-1]) + rep(1,m) %o% coef(fits)[,1]
resids = matrix(data=ytest, nrow=dim(preds)[1], ncol=dim(preds)[2], byrow=F)-preds
RMSEs = sqrt( apply(resids^2, 2, sum)/m )
plot(fits$lambda, RMSEs, type="l", xlab="lambda", ylab="RMSE", log="x")
points(fits$lambda[which.min(RMSEs)],min(RMSEs))
min = fits$lambda[which.min(RMSEs)]
coef(lm.ridge(Salary~.,data=train, lambda=min))
AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun CRuns CRBI CWalks LeagueN
205.88399506 -1.89686063 4.93197606 3.43108687 -1.32839807 2.81862442 5.96348988 -7.31347964 -0.03074841 -0.02593659 -1.14173125 0.96682887 0.76012119 -0.80554313 51.35929558
DivisionW PutOuts Assists Errors NewLeagueN
-151.70829282 0.40577805 0.43152667 -5.49071796 -23.96469332
set.seed(123)
X = model.matrix(lm(Salary ~ ., Hitters))
n = nrow(X)
Z = scale(X[,-1])[,]*sqrt((n-1)/n)
# SVD
U = svd(Z)$u
D = diag(svd(Z)$d)
V = svd(Z)$v
# beta principal component
b = V%*%D%*%t(U)%*%Hitters$Salary
library(pls)
fit.pcr=pcr(Salary ~ ., data=Hitters, scale=TRUE, validation ="CV")
validationplot(fit.pcr, val.type="MSEP")
fit=pcr(Salary ~ ., data=Hitters, scale=TRUE, ncomp=6)
resids = predict(fit, newdata=test) - ytest
RMSE = sqrt(mean(resids^2))
RMSE >= min(RMSEs)
[1] TRUE
# true logical condition : the pcr perform worse than ridge with lambda selected by cv