Como o OLS (norma mínima) pode falhar em superajuste?
Em resumo:
Parâmetros experimentais que se correlacionam com os parâmetros (desconhecidos) no modelo verdadeiro terão maior probabilidade de serem estimados com valores altos em um procedimento de ajuste mínimo da norma OLS. Isso ocorre porque eles se encaixam no 'modelo + ruído', enquanto os outros parâmetros se encaixam apenas no 'ruído' (assim, eles se encaixam em uma parte maior do modelo com um valor mais baixo do coeficiente e são mais propensos a ter um valor alto na norma mínima OLS).
Esse efeito reduzirá a quantidade de sobreajuste em um procedimento mínimo de ajuste da norma OLS. O efeito é mais pronunciado se houver mais parâmetros disponíveis desde então, é mais provável que uma porção maior do 'modelo verdadeiro' esteja sendo incorporada na estimativa.
Parte mais longa:
(não tenho certeza do que colocar aqui, pois o problema não está totalmente claro para mim ou não sei com que precisão uma resposta precisa para resolver a questão)
Abaixo está um exemplo que pode ser facilmente construído e demonstra o problema. O efeito não é tão estranho e exemplos são fáceis de fazer.
- Tomei funções sin (porque são perpendiculares) como variáveisp=200
- criaram um modelo aleatório com medidas.
n=50
- O modelo é construído com apenas das variáveis, de modo que 190 das 200 variáveis estão criando a possibilidade de gerar excesso de ajuste.tm=10
- coeficientes do modelo são determinados aleatoriamente
Neste caso de exemplo, observamos que há algum ajuste excessivo, mas os coeficientes dos parâmetros que pertencem ao modelo verdadeiro têm um valor mais alto. Assim, o R ^ 2 pode ter algum valor positivo.
A imagem abaixo (e o código para gerá-lo) demonstra que o excesso de ajuste é limitado. Os pontos que se relacionam com o modelo de estimativa de 200 parâmetros. Os pontos vermelhos se referem aos parâmetros que também estão presentes no 'modelo verdadeiro' e vemos que eles têm um valor mais alto. Assim, existe algum grau de aproximação do modelo real e obtenção de R ^ 2 acima de 0.
- Note que eu usei um modelo com variáveis ortogonais (as funções senoidais). Se os parâmetros estão correlacionados, eles podem ocorrer no modelo com um coeficiente relativamente alto e tornar-se mais penalizados na norma mínima OLS.
- Observe que as 'variáveis ortogonais' não são ortogonais quando consideramos os dados. O produto interno de é apenas zero quando integramos todo o espaço de e não quando temos apenas algumas amostras . A conseqüência é que, mesmo com ruído zero, o ajuste excessivo ocorrerá (e o valor R ^ 2 parece depender de muitos fatores, além do ruído. É claro que existe a relação e , mas também importante é quantas variáveis são no modelo verdadeiro e quantos deles estão no modelo de ajuste).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))
Técnica beta truncada em relação à regressão de crista
Transformei o código python da Amoeba em R e combinei os dois gráficos. Para cada estimativa mínima de OLS de norma com variáveis de ruído adicionadas, eu uma estimativa de regressão de crista com a mesma (aproximadamente) norma para o vetor .l2β
- Parece que o modelo de ruído truncado faz o mesmo (apenas calcula um pouco mais devagar, e talvez um pouco mais frequentemente com menos frequência).
- No entanto, sem o truncamento, o efeito é muito menos forte.
Essa correspondência entre adicionar parâmetros e penalizar a crista não é necessariamente o mecanismo mais forte por trás da ausência de ajuste excessivo. Isso pode ser visto especialmente na curva 1000p (na imagem da pergunta) indo para quase 0,3 enquanto as outras curvas, com p diferente, não atingem esse nível, independentemente do parâmetro de regressão da crista. Os parâmetros adicionais, nesse caso prático, não são os mesmos que uma mudança no parâmetro cume (e acho que isso ocorre porque os parâmetros extras criarão um modelo melhor e mais completo).
Os parâmetros de ruído reduzem a norma, por um lado (assim como a regressão da crista), mas também introduzem ruído adicional. Benoit Sanchez mostra que, no limite, adicionando muitos parâmetros de ruído com menor desvio, ele se tornará o mesmo que a regressão de crista (o número crescente de parâmetros de ruído se cancela). Mas, ao mesmo tempo, exige muito mais cálculos (se aumentarmos o desvio do ruído, para permitir usar menos parâmetros e acelerar o cálculo, a diferença se torna maior).
Rho = 0,2
Rho = 0,4
Rho = 0,2 aumentando a variação dos parâmetros de ruído para 2
exemplo 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)