In che modo OLS (norma minima) non riesce a sopravvivere?
In breve:
I parametri sperimentali correlati ai parametri (sconosciuti) nel modello reale avranno maggiori probabilità di essere stimati con valori elevati in una procedura di adattamento OLS a norma minima. Questo perché si adatteranno al "modello + rumore" mentre gli altri parametri si adatteranno solo al "rumore" (quindi si adatteranno a una parte più grande del modello con un valore inferiore del coefficiente e avranno più probabilità di avere un valore elevato nella norma minima OLS).
Questo effetto ridurrà la quantità di overfitting in una procedura di adattamento OLS di norma minima. L'effetto è più pronunciato se sono disponibili più parametri da allora diventa più probabile che una parte più ampia del "modello reale" venga incorporata nella stima.
Parte più lunga:
(Non sono sicuro di cosa collocare qui poiché il problema non mi è del tutto chiaro, o non so di quale precisione una risposta abbia bisogno per rispondere alla domanda)
Di seguito è riportato un esempio che può essere facilmente costruito e dimostra il problema. L'effetto non è così strano e gli esempi sono facili da fare.
- p=200
- n=50
- tm=10
- i coefficienti del modello sono determinati casualmente
In questo caso di esempio osserviamo che c'è un eccesso di adattamento ma i coefficienti dei parametri che appartengono al modello vero hanno un valore più alto. Pertanto R ^ 2 può avere un valore positivo.
L'immagine seguente (e il codice per generarlo) dimostrano che il sovradimensionamento è limitato. I punti relativi al modello di stima di 200 parametri. I punti rossi si riferiscono a quei parametri che sono presenti anche nel "modello reale" e vediamo che hanno un valore più alto. Quindi, c'è un certo grado di approccio al modello reale e di ottenere R ^ 2 sopra 0.
- Si noti che ho usato un modello con variabili ortogonali (le funzioni sinusoidali). Se i parametri sono correlati, possono verificarsi nel modello con coefficiente relativamente molto elevato e diventare più penalizzati nella norma minima OLS.
- sin(ax)⋅sin(bx)xxnp
library(MASS)
par(mar=c(5.1, 4.1, 9.1, 4.1), xpd=TRUE)
p <- 200
l <- 24000
n <- 50
tm <- 10
# generate i sinus vectors as possible parameters
t <- c(1:l)
xm <- sapply(c(0:(p-1)), FUN = function(x) sin(x*t/l*2*pi))
# generate random model by selecting only tm parameters
sel <- sample(1:p, tm)
coef <- rnorm(tm, 2, 0.5)
# generate random data xv and yv with n samples
xv <- sample(t, n)
yv <- xm[xv, sel] %*% coef + rnorm(n, 0, 0.1)
# generate model
M <- ginv(t(xm[xv,]) %*% xm[xv,])
Bsol <- M %*% t(xm[xv,]) %*% yv
ysol <- xm[xv,] %*% Bsol
# plotting comparision of model with true model
plot(1:p, Bsol, ylim=c(min(Bsol,coef),max(Bsol,coef)))
points(sel, Bsol[sel], col=1, bg=2, pch=21)
points(sel,coef,pch=3,col=2)
title("comparing overfitted model (circles) with true model (crosses)",line=5)
legend(0,max(coef,Bsol)+0.55,c("all 100 estimated coefficients","the 10 estimated coefficients corresponding to true model","true coefficient values"),pch=c(21,21,3),pt.bg=c(0,2,0),col=c(1,1,2))
Tecnica beta troncata in relazione alla regressione della cresta
l2β
- Sembra che il modello di rumore troncato faccia lo stesso (calcola solo un po 'più lentamente e forse un po' più spesso meno bene).
- Tuttavia, senza il troncamento, l'effetto è molto meno forte.
Questa corrispondenza tra l'aggiunta di parametri e la penalità della cresta non è necessariamente il meccanismo più forte dietro l'assenza di un eccesso di adattamento. Questo può essere visto specialmente nella curva a 1000p (nell'immagine della domanda) andando quasi a 0,3 mentre le altre curve, con p diversa, non raggiungono questo livello, indipendentemente dal parametro di regressione della cresta. I parametri aggiuntivi, in quel caso pratico, non sono gli stessi di uno spostamento del parametro ridge (e immagino che ciò sia dovuto al fatto che i parametri extra creeranno un modello migliore, più completo).
I parametri del rumore riducono la norma da un lato (proprio come la regressione della cresta) ma introducono anche rumore aggiuntivo. Benoit Sanchez mostra che nel limite, aggiungendo molti parametri di rumore con una deviazione minore, alla fine diventerà lo stesso della regressione della cresta (il numero crescente di parametri di rumore si annullano a vicenda). Allo stesso tempo, richiede molti più calcoli (se aumentiamo la deviazione del rumore, per consentire di utilizzare meno parametri e accelerare il calcolo, la differenza diventa più grande).
Rho = 0,2
Rho = 0.4
Rho = 0,2 aumentando la varianza dei parametri di rumore a 2
esempio di codice
# prepare the data
set.seed(42)
n = 80
p = 40
rho = .2
y = rnorm(n,0,1)
X = matrix(rep(y,p), ncol = p)*rho + rnorm(n*p,0,1)*(1-rho^2)
# range of variables to add
ps = c(0, 5, 10, 15, 20, 40, 45, 50, 55, 60, 70, 80, 100, 125, 150, 175, 200, 300, 400, 500, 1000)
#ps = c(0, 5, 10, 15, 20, 40, 60, 80, 100, 150, 200, 300) #,500,1000)
# variables to store output (the sse)
error = matrix(0,nrow=n, ncol=length(ps))
error_t = matrix(0,nrow=n, ncol=length(ps))
error_s = matrix(0,nrow=n, ncol=length(ps))
# adding a progression bar
pb <- txtProgressBar(min = 0, max = n, style = 3)
# training set by leaving out measurement 1, repeat n times
for (fold in 1:n) {
indtrain = c(1:n)[-fold]
# ridge regression
beta_s <- glmnet(X[indtrain,],y[indtrain],alpha=0,lambda = 10^c(seq(-4,2,by=0.01)))$beta
# calculate l2-norm to compare with adding variables
l2_bs <- colSums(beta_s^2)
for (pi in 1:length(ps)) {
XX = cbind(X, matrix(rnorm(n*ps[pi],0,1), nrow=80))
XXt = XX[indtrain,]
if (p+ps[pi] < n) {
beta = solve(t(XXt) %*% (XXt)) %*% t(XXt) %*% y[indtrain]
}
else {
beta = ginv(t(XXt) %*% (XXt)) %*% t(XXt) %*% y[indtrain]
}
# pickout comparable ridge regression with the same l2 norm
l2_b <- sum(beta[1:p]^2)
beta_shrink <- beta_s[,which.min((l2_b-l2_bs)^2)]
# compute errors
error[fold, pi] = y[fold] - XX[fold,1:p] %*% beta[1:p]
error_t[fold, pi] = y[fold] - XX[fold,] %*% beta[]
error_s[fold, pi] = y[fold] - XX[fold,1:p] %*% beta_shrink[]
}
setTxtProgressBar(pb, fold) # update progression bar
}
# plotting
plot(ps,colSums(error^2)/sum(y^2) ,
ylim = c(0,2),
xlab ="Number of extra predictors",
ylab ="relative sum of squared error")
lines(ps,colSums(error^2)/sum(y^2))
points(ps,colSums(error_t^2)/sum(y^2),col=2)
lines(ps,colSums(error_t^2)/sum(y^2),col=2)
points(ps,colSums(error_s^2)/sum(y^2),col=4)
lines(ps,colSums(error_s^2)/sum(y^2),col=4)
title('Extra pure noise predictors')
legend(200,2,c("complete model with p + extra predictors",
"truncated model with p + extra predictors",
"ridge regression with similar l2-norm",
"idealized model uniform beta with 1/p/rho"),
pch=c(1,1,1,NA), col=c(2,1,4,1),lt=c(1,1,1,2))
# idealized model (if we put all beta to 1/rho/p we should theoretically have a reasonable good model)
error_op <- rep(0,n)
for (fold in 1:n) {
beta = rep(1/rho/p,p)
error_op[fold] = y[fold] - X[fold,] %*% beta
}
id <- sum(error_op^2)/sum(y^2)
lines(range(ps),rep(id,2),lty=2)