(Asgari norm) OLS nasıl yetişemez?
Kısacası:
Gerçek modeldeki (bilinmeyen) parametrelerle ilişkilendirilen deneysel parametrelerin, minimum norm OLS montaj prosedüründe yüksek değerlerle tahmin edilmesi daha olasıdır. Bunun nedeni, 'model + gürültüye' uyacakları, diğer parametrelerin ise yalnızca 'gürültüye' uyacağıdır (bu nedenle, modelin daha düşük bir katsayısı değerine sahip olan ve daha yüksek bir değere sahip olma olasılıkları daha büyük olacaktır. minimal normdaki OLS).
Bu etki, minimum bir norm OLS montaj prosedüründe aşırı takma miktarını azaltacaktır. Etki, eğer o zamandan beri daha fazla parametre mevcutsa, “gerçek modelin” daha büyük bir kısmının tahmine dahil edilme olasılığı artar.
Daha uzun bölüm:
(Bu konu benim için tam olarak net olmadığından buraya ne yerleştirileceğinden emin değilim veya bir sorunun soruyu ele almak için ne kadar hassas olması gerektiğini bilmiyorum)
Aşağıda kolayca oluşturulabilen ve sorunu gösteren bir örnek verilmiştir. Etkisi çok garip değil ve örnekler yapmak kolaydır.
- aldım.p=200
- n=50
- tm=10
- model katsayıları rastgele belirlenir
Bu örnekte, fazla uydurma olduğunu gözlemledik, ancak gerçek modele ait parametrelerin katsayıları daha yüksek bir değere sahip. Dolayısıyla R ^ 2 bazı pozitif değerlere sahip olabilir.
Aşağıdaki resim (ve onu oluşturacak kod), aşırı uydurmanın sınırlı olduğunu göstermektedir. 200 parametrenin kestirim modeli ile ilgili noktalar. Kırmızı noktalar 'gerçek modelde' mevcut olan parametrelerle ilgilidir ve daha yüksek bir değere sahip olduklarını görüyoruz. Bu nedenle, gerçek modele yaklaşma ve R ^ 2'yi 0'ın üzerinde alma derecesi vardır.
- Dik değişkenli bir model kullandığımı unutmayın (sinüs işlevleri). Parametreler ilişkilendirilirse, nispeten yüksek katsayılı modelde oluşabilirler ve minimum OLS normlarında daha fazla cezalandırılabilirler.
- 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))
Sırt regresyonu ile ilgili kesilmiş beta tekniği
l2β
- Kesikli gürültü modeli de aynı şeyi yapıyor gibi görünüyor (sadece biraz daha yavaş ve belki biraz daha az iyi hesaplar).
- Ancak kesilme olmadan, etki çok daha az güçlüdür.
Parametre ekleme ve sırt cezası arasındaki bu yazışma, fazla uydurma olmanın ardındaki en güçlü mekanizma olmak zorunda değildir. Bu, özellikle 1000p eğrisinde (sorunun görüntüsünde) neredeyse 0.3'e giderken görülebilir, diğer eğriler, farklı p'lerle, sırt regresyon parametresi ne olursa olsun, bu seviyeye ulaşmaz. Bu pratik durumda ek parametreler, sırt parametresindeki bir kayma ile aynı değildir (ve bunun, ekstra parametrelerin daha iyi, daha eksiksiz bir model yaratacağı için olduğunu tahmin ediyorum).
Gürültü parametreleri, bir yandan normu azaltır (tıpkı sırt regresyonu gibi), aynı zamanda ek gürültü de sağlar. Benoit Sanchez, limide, daha küçük sapma ile birçok gürültü parametresi ekleyerek, sonunda regresyon ile aynı olacağını (artan gürültü parametresi sayısının birbirini iptal ettiğini) göstermektedir. Fakat aynı zamanda, çok daha fazla hesaplama gerektiriyor (eğer daha az parametre kullanmak ve hesaplamayı hızlandırmak için gürültünün sapmasını arttırırsak, fark büyür).
Rho = 0.2
Rho = 0.4
Rho = 0.2, gürültü parametrelerinin varyansını 2'ye yükseltir
kod örneği
# 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)