Wie kann (minimale Norm) OLS nicht überanpassen?
Zusamenfassend:
Es ist wahrscheinlicher, dass experimentelle Parameter, die mit den (unbekannten) Parametern im wahren Modell korrelieren, mit hohen Werten in einer Minimal-Norm-OLS-Anpassungsprozedur geschätzt werden. Das liegt daran, dass sie dem 'Modell + Rauschen' entsprechen, während die anderen Parameter nur dem 'Rauschen' entsprechen (daher passen sie einem größeren Teil des Modells mit einem niedrigeren Wert des Koeffizienten und haben mit größerer Wahrscheinlichkeit einen hohen Wert) in der minimalen Norm OLS).
Dieser Effekt reduziert das Ausmaß der Überanpassung bei einem OLS-Anpassungsverfahren mit minimaler Norm. Der Effekt ist ausgeprägter, wenn mehr Parameter verfügbar sind, da es dann wahrscheinlicher wird, dass ein größerer Teil des „wahren Modells“ in die Schätzung einbezogen wird.
Längerer Teil:
(Ich bin nicht sicher, was ich hier platzieren soll, da mir das Problem nicht ganz klar ist, oder ich weiß nicht, mit welcher Genauigkeit eine Antwort die Frage beantworten muss.)
Nachfolgend finden Sie ein Beispiel, das einfach aufgebaut werden kann und das Problem veranschaulicht. Der Effekt ist nicht so seltsam und Beispiele sind einfach zu machen.
- Ich habe sin-Funktionen (weil sie senkrecht sind) als Variablen genommenp=200
- erstellt ein Zufallsmodell mit Messungen.
n=50
- Das Modell ist nur mit der Variablen konstruiert , sodass 190 der 200 Variablen die Möglichkeit bieten, eine Überanpassung zu generieren.tm=10
- Modellkoeffizienten werden zufällig bestimmt
In diesem Beispielsfall stellen wir fest, dass eine gewisse Überanpassung vorliegt, die Koeffizienten der Parameter, die zum wahren Modell gehören, jedoch einen höheren Wert haben. Somit kann das R ^ 2 einen positiven Wert haben.
Das folgende Bild (und der Code, mit dem es generiert wird) zeigen, dass die Überanpassung begrenzt ist. Die Punkte, die sich auf das Schätzmodell von 200 Parametern beziehen. Die roten Punkte beziehen sich auf die Parameter, die auch im „wahren Modell“ vorhanden sind, und wir sehen, dass sie einen höheren Wert haben. Es gibt also ein gewisses Maß an Annäherung an das reale Modell und das Erhalten des R ^ 2 über 0.
- Beachten Sie, dass ich ein Modell mit orthogonalen Variablen (den Sinusfunktionen) verwendet habe. Wenn Parameter korreliert sind, können sie im Modell mit relativ hohem Koeffizienten auftreten und in der Minimalnorm OLS stärker benachteiligt werden.
- Beachten Sie, dass die 'orthogonalen Variablen' bei Betrachtung der Daten nicht orthogonal sind. Das innere Produkt von ist nur dann Null, wenn wir den gesamten Raum von und nicht, wenn wir nur wenige Stichproben . Die Folge ist, dass auch bei Null Rauschen eine Überanpassung auftritt (und der R ^ 2-Wert neben dem Rauschen von vielen Faktoren abzuhängen scheint. Natürlich gibt es die Beziehung und , aber auch wichtig ist, wie viele Variablen vorhanden sind im wahren Modell und wie viele davon im passenden Modell).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))
Truncated Beta-Technik in Bezug auf die Gratregression
Ich habe den Python-Code von Amoeba in R umgewandelt und die beiden Graphen miteinander kombiniert. Für jede minimale Norm-OLS-Schätzung mit hinzugefügten Rauschvariablen stimme ich mit einer Ridge-Regressionsschätzung mit derselben (ungefähren) Norm für den ; überein .l2β
- Anscheinend funktioniert das Modell mit abgeschnittenem Rauschen ähnlich (es wird nur ein bisschen langsamer und möglicherweise ein bisschen öfter weniger gut berechnet).
- Ohne die Kürzung ist der Effekt jedoch viel weniger stark.
Diese Entsprechung zwischen dem Hinzufügen von Parametern und der Kammstrafe ist nicht unbedingt der stärkste Mechanismus für das Fehlen einer Überanpassung. Dies ist insbesondere in der 1000p-Kurve (im Bild der Frage) zu sehen, die auf fast 0,3 geht, während die anderen Kurven mit unterschiedlichem p dieses Niveau nicht erreichen, unabhängig davon, was der Ridge-Regressionsparameter ist. In diesem praktischen Fall sind die zusätzlichen Parameter nicht mit einer Verschiebung des Firstparameters identisch (und das liegt vermutlich daran, dass die zusätzlichen Parameter ein besseres, vollständigeres Modell ergeben).
Die Geräuschparameter reduzieren einerseits die Norm (genau wie die Gratregression), führen aber auch zu zusätzlichem Geräusch. Benoit Sanchez zeigt, dass im Grenzfall durch Hinzufügen vieler verschiedener Rauschparameter mit geringerer Abweichung letztendlich die Ridge-Regression erreicht wird (die wachsende Anzahl von Rauschparametern hebt sich gegenseitig auf). Gleichzeitig sind jedoch viel mehr Berechnungen erforderlich (wenn wir die Abweichung des Rauschens erhöhen, um weniger Parameter zu verwenden und die Berechnung zu beschleunigen, wird der Unterschied größer).
Rho = 0,2
Rho = 0,4
Rho = 0,2 erhöht die Varianz der Rauschparameter auf 2
Codebeispiel
# 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)