¿Cómo puede la OLS (norma mínima) no ajustarse demasiado?
En breve:
Los parámetros experimentales que se correlacionan con los parámetros (desconocidos) en el modelo verdadero serán más propensos a estimarse con valores altos en un procedimiento de ajuste OLS de norma mínima. Esto se debe a que se ajustarán al 'modelo + ruido', mientras que los otros parámetros solo se ajustarán al 'ruido' (por lo tanto, se ajustarán a una parte más grande del modelo con un valor más bajo del coeficiente y es más probable que tengan un valor alto en la norma mínima OLS).
Este efecto reducirá la cantidad de sobreajuste en un procedimiento de ajuste OLS de norma mínima. El efecto es más pronunciado si hay más parámetros disponibles, ya que entonces es más probable que se incorpore una porción más grande del "modelo verdadero" en la estimación.
Parte más larga:
(no estoy seguro de qué colocar aquí ya que el problema no está del todo claro para mí, o no sé con qué precisión necesita una respuesta para abordar la pregunta)
A continuación se muestra un ejemplo que se puede construir fácilmente y demuestra el problema. El efecto no es tan extraño y los ejemplos son fáciles de hacer.
- p = 200
- n = 50
- t m = 10
- los coeficientes del modelo se determinan aleatoriamente
En este caso de ejemplo, observamos que existe un ajuste excesivo, pero los coeficientes de los parámetros que pertenecen al modelo verdadero tienen un valor más alto. Por lo tanto, R ^ 2 puede tener algún valor positivo.
La imagen a continuación (y el código para generarla) demuestran que el sobreajuste es limitado. Los puntos que se relacionan con el modelo de estimación de 200 parámetros. Los puntos rojos se relacionan con aquellos parámetros que también están presentes en el 'modelo verdadero' y vemos que tienen un valor más alto. Por lo tanto, hay un cierto grado de acercamiento al modelo real y obtener el R ^ 2 por encima de 0.
- Tenga en cuenta que utilicé un modelo con variables ortogonales (las funciones sinusoidales). Si los parámetros están correlacionados, pueden ocurrir en el modelo con un coeficiente relativamente alto y llegar a ser más penalizados en la norma mínima OLS.
- s i n ( a x ) ⋅ s i n ( b x )XXnortepags
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))
Técnica beta truncada en relación con la regresión de cresta
l2β
- Parece que el modelo de ruido truncado hace casi lo mismo (solo computa un poco más lento, y tal vez un poco más a menudo menos bueno).
- Sin embargo, sin el truncamiento, el efecto es mucho menos fuerte.
Esta correspondencia entre la adición de parámetros y la penalización de cresta no es necesariamente el mecanismo más fuerte detrás de la ausencia de un ajuste excesivo. Esto se puede ver especialmente en la curva de 1000p (en la imagen de la pregunta) que va a casi 0.3 mientras que las otras curvas, con diferente p, no alcanzan este nivel, sin importar cuál sea el parámetro de regresión de cresta. Los parámetros adicionales, en ese caso práctico, no son lo mismo que un cambio del parámetro de cresta (y supongo que esto se debe a que los parámetros adicionales crearán un modelo mejor y más completo).
Los parámetros de ruido reducen la norma por un lado (al igual que la regresión de cresta) pero también introducen ruido adicional. Benoit Sanchez muestra que en el límite, al agregar muchos parámetros de ruido con una desviación menor, eventualmente será lo mismo que la regresión de cresta (el creciente número de parámetros de ruido se cancela entre sí). Pero al mismo tiempo, requiere muchos más cálculos (si aumentamos la desviación del ruido, para permitir usar menos parámetros y acelerar el cálculo, la diferencia se hace más grande).
Rho = 0.2
Rho = 0.4
Rho = 0.2 aumentando la varianza de los parámetros de ruido a 2
ejemplo de código
# 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)