¿Cómo es posible que el método OLS (norma mínima) no se ajuste en exceso?
En resumen:
Los parámetros experimentales que se correlacionan con los parámetros (desconocidos) del modelo verdadero tendrán más probabilidades de ser estimados 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 demás parámetros sólo se ajustarán al "ruido" (por lo que se ajustarán a una parte mayor del modelo con un valor más bajo del coeficiente y será más probable que tengan un valor alto en el MCO de norma mínima).
Este efecto reducirá la cantidad de sobreajuste en un procedimiento de ajuste OLS de norma mínima. El efecto es más pronunciado si se dispone de más parámetros, ya que entonces es más probable que se incorpore a la estimación una parte mayor del "modelo verdadero".
La parte más larga:
(No estoy seguro de qué poner aquí, ya que la cuestión no me queda del todo clara, o no sé con qué precisión hay que responder a la pregunta)
A continuación se muestra un ejemplo que se puede construir fácilmente y que demuestra el problema. El efecto no es tan extraño y los ejemplos son fáciles de hacer.
- Tomé $p=200$ las funciones sin (porque son perpendiculares) como variables
- creó un modelo aleatorio con $n=50$ medidas.
- El modelo es construido con sólo $tm=10$ de las variables por lo que 190 de las 200 variables están creando la posibilidad de generar un sobreajuste.
- los coeficientes del modelo se determinan al azar
En este caso de ejemplo observamos que hay un cierto sobreajuste pero los coeficientes de los parámetros que pertenecen al modelo verdadero tienen un valor más alto. Por lo tanto, el R^2 puede tener algún valor positivo.
La imagen siguiente (y el código para generarla) demuestran que el sobreajuste es limitado. Los puntos que se refieren al modelo de estimación de 200 parámetros. Los puntos rojos se refieren a los parámetros que también están presentes en el "modelo real" y vemos que tienen un valor más alto. Por lo tanto, hay un cierto grado de aproximación al modelo real y de obtener el R^2 por encima de 0.
- Obsérvese que he utilizado un modelo con variables ortogonales (las funciones senoidales). Si los parámetros están correlacionados, entonces pueden aparecer en el modelo con un coeficiente relativamente muy alto y ser más penalizados en la norma mínima OLS.
- Nótese que las "variables ortogonales" no son ortogonales cuando consideramos los datos. El producto interno de $sin(ax) \cdot sin(bx)$ sólo es cero cuando integramos todo el espacio de $x$ y no cuando sólo tenemos unas pocas muestras $x$ . La consecuencia es que incluso con ruido cero se producirá un sobreajuste (y el valor de R^2 parece depender de muchos factores, aparte del ruido. Por supuesto, existe la relación $n$ y $p$ Pero también es importante saber cuántas variables hay en el modelo verdadero y cuántas hay en el modelo de ajuste).
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 de beta truncada en relación con la regresión de cresta
He transformado el código python de Amoeba en R y he combinado los dos gráficos juntos. Para cada estimación OLS de norma mínima con variables de ruido añadidas hago coincidir una estimación de regresión ridge con la misma (aproximadamente) $l_2$ -norma para el $\beta$ vectorial.
-
Parece que el modelo de ruido truncado hace más o menos lo mismo (sólo 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 la cresta no es necesariamente el mecanismo más fuerte detrás de la ausencia de sobreajuste. Esto se puede ver especialmente en la curva de 1000p (en el imagen de la pregunta) llegando casi a 0,3 mientras que las otras curvas con diferentes p, no alcanzan este nivel, sea cual sea el parámetro de de regresión. Los parámetros adicionales, en ese caso práctico, no son lo mismo que un desplazamiento del parámetro de la cresta (y supongo que esto se debe a que los parámetros adicionales crearán un modelo mejor, 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 Sánchez muestra que en el límite, añadiendo muchos parámetros de ruido con una desviación menor, se convertirá finalmente en lo mismo que la regresión de cresta (el número creciente de parámetros de ruido se anulan 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 mayor).
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)
0 votos
Estás bromeando, ¿verdad? Con una muestra de 80 observaciones y un CV de 10 pliegues, ¿no resultan 8 observaciones por pliegue? Incluso con p=10 eso sigue siendo demasiados predictores para el OLS tradicional. Incluso PLS lo encontraría difícil. ¿Cómo se crean estos pliegues k?
2 votos
@DJohnson No es broma. El CV habitual de 10 veces, lo que significa que cada conjunto de entrenamiento tiene n=72 y cada conjunto de prueba tiene n=8.
0 votos
@BenoitSanchez Mi propia implementación: Escribo la fórmula del estimador de crestas en términos del SVD de X. Son sólo un par de líneas de código.
2 votos
Eso está lejos de ser una habitual CV. Teniendo en cuenta esto, ¿cómo se puede esperar algo parecido a un resultado detectable?
1 votos
¿Cuál es el rango de $X$ (p=1000)? ¿80 o menos?
4 votos
@DJohnson No entiendo por qué dices que esto está lejos de ser habitual. Esto es lo que es el CV de 10 veces.
0 votos
Eso sí que es raro. Sólo veo dos posibilidades: (1) como sugirió @BenoitSanchez, el rango es muy bajo, o (2) hay copias exactas (o casi exactas) de las muestras del conjunto de entrenamiento en el conjunto de prueba. Esto último puede explicar cómo un modelo que se ajusta totalmente a la perfección puede seguir funcionando razonablemente bien en el conjunto de pruebas. La tercera opción es (como siempre) que haya un error en alguna parte del código.
0 votos
@George Gracias. En cuanto a lo raro que es -- ¿realmente puedes encontrar algún ejemplo de validación cruzada para las altas dimensiones ( $n\ll p$ ) de regresión de cresta en algunos datos reales? Sería interesante ver cómo son las curvas CV "típicas" en este entorno.
0 votos
En cuanto a los posibles errores, publicaré un
cv.glmnet
salida mañana.0 votos
¿es posible que los primeros 500 p sean bastante ruidosos; y los siguientes 500 sean muy poco ruidosos? ¿Qué ocurre si se barajan los p antes de la partición en p < 500, p >= 500?
0 votos
@HughPerkins Para este experimento, estoy seleccionando $p$ características al azar de un conjunto mayor (de unos 1500 en este caso). Siempre obtengo una meseta para >>500 características y nunca obtengo una meseta para ~100 características. Es muy consistente.
0 votos
@BenoitSanchez Gracias por tu intento de respuesta de todos modos. La verdad es que a estas alturas ya tengo una corazonada. Estoy pensando que esto puede estar ocurriendo cuando $y$ se predice bien por los PCs de plomo de $X$ Digamos que para el día 1. Entonces $\beta_0$ se acercará a la dirección de PC1 y PC1 tenderá a conservarse entre el conjunto de entrenamiento y el de prueba...
0 votos
Coincido con @DJohnson en que las dimensiones del problema son preocupantes. Sugeriría encarecidamente el uso de bootstrap para una muestra tan pequeña. La variabilidad del procedimiento CV sería bastante significativa. (¡Gran pregunta, obviamente!)
0 votos
¿Qué quieres decir exactamente con bootstrap en este caso @usr11852? (Las dimensiones del problema son completamente estándar para los datos genómicos, por cierto).
0 votos
Utilizar el bootstrap para estimar el error en lugar del CV de 10 veces. (Dicho esto, la consistencia de la forma que usted reporta probablemente muestra que la variabilidad no es un gran problema)
0 votos
¿Qué es la estimación bootstrap del error? ¿Te refieres a realizar un conjunto de pruebas aleatorias de tamaño 8 muchas veces, más de 10? (Aunque yo no lo llamaría "bootstrap".) Si es así, estoy de acuerdo: Yo suelo utilizar 100x repetidos de 10 CV, que es similar. @usr11852
0 votos
Genial entonces. Pensé que era un único CV de 10 veces.
0 votos
@usr11852 Sí, en esta Q es es en realidad un único CV de 10 veces, pero lo ejecuté varias veces y el efecto general del que hablo fue consistente. Pero en general yo siempre usaría CV repetido.
0 votos
Comentario al azar: podría valer la pena editar las preguntas y respuestas de los comentarios en la pregunta original (este comentario va dirigido a ameba )
0 votos
@HughPerkins He añadido los datos y el código a la Q. No creo que pueda aclararlo más, pero si tienes alguna sugerencia sobre lo que debería añadir, házmelo saber o, mejor aún, no dudes en editar la Q.
0 votos
Comentario al azar: 0 solución de regularización <> lambda-> 0 solución. como menciona @jonnyLomond, cualquier media regularizada de las 1000 entradas funciona igualmente bien.(recordando que la norma L2 fomenta muchos pesos pequeños)..esto supone como él entradas correlacionadas....
0 votos
@seanv507 ¿Qué quieres decir con "0 solución de regularización <> lambda-> 0 solución"? ¿Por qué?
0 votos
Me refería a que con lambda = 0, no hay solución única y son válidos los coeficientes grandes de signo contrario, pero en cuanto lambda>0 desaparecen todas esas locas soluciones oscilantes y te quedas con una solución única, que tiene la norma L2 más pequeña, que en el caso de $x_i=y+ \sigma$ (es decir, copias ruidosas del objetivo) será la media de todas las entradas.
2 votos
@seanv507 Ya veo. Bueno, sugiero definir "solución con lambda=0" como "solución mínima-normal con lambda=0". Supongo que mi pregunta se puede reformular de la siguiente manera: ¿Bajo qué condiciones la solución OLS de norma mínima con n<p sobreajusta frente a la que no sobreajusta?
3 votos
@amoeba: Gracias por esta pregunta. Ha sido extremadamente instructiva e interesante hasta ahora.
1 votos
No te habría catalogado como usuario de Python :-)
1 votos
@DeltaIV Llevo muchos años usando Matlab pero me pasé a Python el año pasado... Todavía me siento más cómodo con Matlab para ser honesto (y lo estoy usando ocasionalmente para algunas tomas rápidas y sucias, como aquí en mi respuesta a continuación), pero estoy haciendo todo el trabajo real en Python ahora.
0 votos
Tengo la expectativa de que todos los expertos en CV son gurús de R, lo cual no tiene sentido, por supuesto :-) ¿tienes 5 minutos para charlar sobre Ten Fold? Me gustaría preguntarte qué recursos utilizaste para aprender Python
0 votos
@amoeba Quizás me esté desviando mucho del tema, pero ya que has mencionado que también eres usuario de Matlab, ¿has considerado Julia para la computación numérica? Comparte muchas características de Matlab, pero me parece mucho más fácil de usar y desplegar, y suele ser más rápido (ya que está compilado y aplica cierta estabilidad de tipo). Yo consideraría a la par con Cython o Numba para la computación numérica (mucho más optimizado que vanilla Python), pero está escrito en su mayoría en Julia, por lo que puede depurar todo el camino hasta las funciones más básicas, en lugar de la interfaz de C o Fortran para el código más rápido.
0 votos
Ahora, en cuanto al tema, creo que el nuevo título da un nuevo significado a la pregunta, y utilizaría argumentos completamente teóricos para tratar de responderla en oposición a las evidencias empíricas planteadas.
0 votos
@Firebug Re Julia: gracias, esto es interesante. Nunca me lo había planteado seriamente, la verdad; tenía la impresión de que todavía es algo "de nicho". Quizás esto esté cambiando. En cuanto al título, no sé a qué te refieres, ¿me estás sugiriendo que cambie el título? Ciertamente, prefiero las respuestas teóricas (y esa era mi intención desde el principio). Cambié el título porque me pareció que el hilo se estaba volviendo más general de lo que esperaba desde el principio.
0 votos
@amoeba Hmm, no, era sólo una observación. Es que la primera pregunta del título tiene fácil respuesta desde el punto de vista teórico, y la segunda enlaza con la primera. Dada tu experiencia, creo que se podría responder a ambas en unas pocas frases. ¿Deberían las respuestas tratar de profundizar en sus experimentos empíricos?
0 votos
@Firebug Hmm. Puede que haya algún malentendido. El nuevo título pregunta exactamente lo mismo que antes: ¿por qué la cresta no ayuda cuando n>>p en el sentido de que la solución OLS es tan buena como la mejor solución de la cresta? ¿Cómo es posible que OLS no se ajuste en este escenario? Si puede responder a esto en unas pocas frases, por favor hágalo.
0 votos
Esta es una pregunta muy interesante. No estoy seguro de entender el montaje. Olvidando por el momento la regresión de cresta (o lambda = 0), el primer diagrama sugiere que se trata de un problema en el que OLS mejora (¿un R2 de prueba más alto es bueno?) cuanto más grande hacemos p, aunque n sea pequeño. Esto también parece bastante contrario a la intuición, ¿he entendido mal?
1 votos
@DikranMarsupial Sí, cuanto más grande sea el $p$ Cuanto mejor sea el rendimiento de MCO ("MCO de norma mínima"). Estoy de acuerdo en que esto es contrario a la intuición, y este es exactamente el problema principal aquí: ¿cómo puede ser tan bueno OLS cuando $p$ es mucho mayor que $n$ . Eso es lo que se supone que transmite la segunda frase de mi título... Mi expectativa hace 1 semana habría sido que OLS necesariamente producirá basura absoluta siempre que $p$ es mayor que $n$ .
2 votos
Sospecho que el uso de las ecuaciones normales daría lugar a basura en esas circunstancias, pero la "norma mínima" está añadiendo efectivamente una regularización implícita de crestas (véase mi respuesta más abajo) que debería al menos mejorar la basura, pero no está claro por qué los modelos con menos entradas requieren menos regularización. ¿Qué dice LASSO sobre el problema (todas las características son informativas)?
2 votos
@DikranMarsupial Sí, creo que la idea de que La norma mínima OLS está realizando efectivamente una contracción similar a la de la cresta es exactamente la clave. Creo que esto es en lo que convergen varias respuestas aquí, pero todavía estoy confundido sobre los detalles de cómo sucede esto. Parece que sólo funciona cuando $p$ es MUCHO mayor que $n$ . Para ser honesto, me desconcierta que esto no esté descrito en la literatura (no he podido encontrar nada hasta ahora). Re lasso: en mi aplicación actual estoy usando elastic net (y la mayoría de las características son no informativa); podría decirse que esta cuestión sólo tiene interés académico :-)
1 votos
Creo que lo que observas está relacionado con una de las motivaciones originales de la detección por compresión. Supuestamente lo que ocurrió es que Candes y su estudiante ajustaron un sistema sobredeterminado que se ajustaba perfectamente a los datos, pero restringieron la solución para minimizar una norma de variación total, y se sorprendieron de que funcionara tan bien como lo hizo. En este caso, se está restringiendo la norma L2, obteniendo esencialmente un tipo diferente de estimador de complejidad mínima de los coeficientes. L2 no detecta señales dispersas, así que supongo que esto es menos interesante como regularización.
0 votos
Añadiendo a mi comentario anterior, en su caso estaban considerando, creo, un escenario sin ruido, por lo que una solución que se ajustara perfectamente a los datos tiene sentido como restricción desde su punto de vista. Tener en cuenta el ruido lleva al selector de Dantzig.
0 votos
@guy ¡Es una perspectiva muy interesante! Muchas gracias. ¿Tienes alguna cita para esta historia (sobre el shock de Candes et al.)?
0 votos
@amoeba Candes dijo algo en este sentido durante alguna charla. Creo que lo he visto en youtube, donde hace un repaso a la historia de la detección por compresión. Puede que lo encuentres allí. También recuerdo que Terry Tao dijo algo en el sentido de que también se sorprendió mucho cuando Candes le vino con el problema y los resultados.
0 votos
Uno de mis seguidores de Twitter publicó los siguientes dos recursos, que parecen relevantes y útiles: (1) dx.doi.org/10.2307/1267500 (2) statweb.stanford.edu/~tibs/sta305files/Rudyregularization.pdf
0 votos
@Jake Estos enlaces son sobre la regresión de cresta mediante el aumento de X e y por muestras falsas. De hecho, es muy conocido y estándar (y está cubierto en muchos hilos en nuestro sitio). Este hilo es sobre la regresión de cresta mediante el aumento de X [solo] con predictores de ruido puro. Es una historia completamente diferente. Por cierto, he encontrado tu tuit y la respuesta; me gusta cómo tu seguidor dice despectivamente "bien conocido". Díselo, vamos :)
0 votos
@amoeba Deberías responder al hilo de Twitter :)
0 votos
@JakeWestfall No puedo: no tengo Twitter :-/
0 votos
Por qué está usando $R^2$ ? Sólo hay que utilizar la pérdida de L2 en la prueba y el tren. No es necesario utilizar $R^2$ .
0 votos
@Pinocchio Esto es sólo una pérdida de L2 normalizada. Si prefieres el error esperado, puedes mirar el
glmnet
gráficos que muestran el error cuadrático medio en el eje de ordenadas.1 votos
Véase stat.cmu.edu/~ryantibs/papers/lsinter.pdf
0 votos
@amoeba ¿cómo se compara tu artículo con la teoría presentada en hastie et al? En concreto, me interesa saber cómo argumentan ellos que la cresta sintonizada con el CV es mejor que las ols min-2norm mientras que vosotros argumentáis lo contrario. En su opinión, ¿cuál es la causa de la discrepancia?
0 votos
@Baer ¿Te refieres al documento que has publicado antes? Ellos consideran que la beta apunta en la dirección aleatoria, nosotros consideramos que la beta apunta en la dirección PC1 de \Sigma. Sus resultados no son necesariamente válidos para cualquier beta fija.
1 votos
@amoeba Sí, lo era. Gracias por la explicación. Veo la discusión ahora en la parte inferior de la sección 2.3 de tu documento. Parece que también hay un argumento interesante de que los ejemplos de datos reales podrían tener más o menos esta propiedad.
0 votos
@Baer Gracias. Sí, exactamente. Eventualmente incluiré una referencia al preprint de Hastie et al. Pero lo que decimos sobre el artículo de Dobriban & Wager 18 debería aplicarse también al de Hastie et al.
2 votos
Al parecer, este hilo inspiró este reciente artículo: arxiv.org/abs/1805.10939
1 votos
@SycoraxsaysReinstateMonica Sí lo hizo ;-) Al final actualizaré la Q para mencionarlo; he estado esperando a que el artículo sea aceptado en algún sitio primero...