Comment une norme minimale peut-elle omettre de surcharger?
En bref:
Les paramètres expérimentaux en corrélation avec les paramètres (inconnus) du modèle réel auront plus de chances d'être estimés avec des valeurs élevées dans une procédure d'ajustement MLS à norme minimale. En effet, ils correspondent au "modèle + bruit" alors que les autres paramètres s’adaptent uniquement au "bruit" (ils correspondent donc à une plus grande partie du modèle avec une valeur inférieure du coefficient et sont plus susceptibles d’avoir une valeur élevée.) dans la norme minimale OLS).
Cet effet réduira le nombre de surajustements lors d’une procédure d’ajustement MOL normalisée. L'effet est plus prononcé si davantage de paramètres sont disponibles, car il devient alors plus probable qu'une plus grande partie du «modèle réel» soit intégrée à l'estimation.
Partie plus longue:
(je ne suis pas sûr de ce qu'il faut placer ici car la question n'est pas tout à fait claire pour moi, ou je ne sais pas à quelle précision une réponse doit répondre pour répondre à la question)
Vous trouverez ci-dessous un exemple facile à construire et qui illustre le problème. L'effet n'est pas si étrange et les exemples sont faciles à faire.
- J'ai pris fonctions-sin (car elles sont perpendiculaires) comme variablesp=200
- créé un modèle aléatoire avec mesures.
n=50
- Le modèle est construit avec seulement des variables, de sorte que 190 des 200 variables créent la possibilité de générer un sur-ajustement.tm=10
- les coefficients du modèle sont déterminés aléatoirement
Dans cet exemple, nous observons qu'il existe un sur-ajustement, mais que les coefficients des paramètres appartenant au modèle réel ont une valeur plus élevée. Ainsi, le R ^ 2 peut avoir une valeur positive.
L'image ci-dessous (et le code pour le générer) démontrent que le sur-ajustement est limité. Les points relatifs au modèle d’estimation de 200 paramètres. Les points rouges correspondent aux paramètres également présents dans le "vrai modèle" et nous voyons qu'ils ont une valeur plus élevée. Il existe donc un certain degré d'approche du modèle réel et d'obtention du R ^ 2 supérieur à 0.
- Notez que j'ai utilisé un modèle avec des variables orthogonales (les fonctions sinusoïdales). Si les paramètres sont corrélés, ils peuvent apparaître dans le modèle avec un coefficient relativement très élevé et devenir plus pénalisés dans la norme minimale MCO.
- Notez que les «variables orthogonales» ne sont pas orthogonales quand on considère les données. Le produit intérieur du n’est nul que lorsque nous intégrons tout l’espace de et non lorsque nous n’avons que quelques échantillons . La conséquence est que même avec un bruit nul, le sur-ajustement se produira (et la valeur R ^ 2 semble dépendre de nombreux facteurs, mis à part le bruit. Bien sûr, il existe la relation et , mais le nombre de variables est également important. dans le vrai modèle et combien d’entre eux sont dans le modèle approprié).x x n psin(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))
Technique beta tronquée en relation avec la régression de crête
J'ai transformé le code python d'Amoeba en R et combiné les deux graphiques. Pour chaque estimation MLS de norme minimale additionnée de variables de bruit, je fais correspondre une estimation de régression de crête avec la même (approximativement) norm pour le vecteur . βl2β
- Il semble que le modèle de bruit tronqué fasse à peu près la même chose (calcule seulement un peu plus lentement et peut-être un peu plus souvent moins bien).
- Cependant, sans la troncature, l'effet est beaucoup moins fort.
Cette correspondance entre l'ajout de paramètres et la pénalité de crête n'est pas nécessairement le mécanisme le plus puissant derrière l'absence de sur-ajustement. Cela se voit en particulier dans la courbe 1000p (dans l'image de la question) atteignant presque 0,3 alors que les autres courbes, avec p différent, n'atteignent pas ce niveau, quel que soit le paramètre de régression de la crête. Les paramètres supplémentaires, dans ce cas pratique, ne sont pas identiques à un décalage du paramètre de crête (et je suppose que cela est dû au fait que les paramètres supplémentaires créeront un modèle meilleur, plus complet).
Les paramètres de bruit réduisent la norme d'une part (tout comme la régression de crête) mais introduisent également du bruit supplémentaire. Benoit Sanchez montre que dans la limite, en ajoutant de nombreux paramètres de bruit avec une déviation plus petite, cela deviendra éventuellement la même chose que la régression de crête (le nombre croissant de paramètres de bruit s’annulent). Mais en même temps, cela nécessite beaucoup plus de calculs (si on augmente l'écart du bruit pour permettre d'utiliser moins de paramètres et accélérer les calculs, la différence devient plus grande).
Rho = 0,2
Rho = 0,4
Rho = 0,2 augmentant la variance des paramètres de bruit à 2
exemple de code
# 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)