Bagaimana OLS (norma minimal) gagal untuk berpakaian berlebihan?
Pendeknya:
Parameter eksperimental yang berkorelasi dengan parameter (tidak diketahui) dalam model sebenarnya akan lebih cenderung diperkirakan dengan nilai tinggi dalam prosedur pemasangan OLS norma minimal. Itu karena mereka akan cocok dengan 'model + noise' sedangkan parameter lain hanya akan cocok dengan 'noise' (sehingga mereka akan cocok dengan bagian yang lebih besar dari model dengan nilai koefisien yang lebih rendah dan lebih cenderung memiliki nilai tinggi dalam OLS norma minimal).
Efek ini akan mengurangi jumlah overfitting dalam prosedur pemasangan OLS norma minimal. Efeknya lebih jelas jika lebih banyak parameter tersedia sejak saat itu sehingga menjadi lebih mungkin bahwa sebagian besar 'model sebenarnya' dimasukkan dalam perkiraan.
Bagian yang lebih panjang:
(Saya tidak yakin apa yang harus ditempatkan di sini karena masalah ini tidak sepenuhnya jelas bagi saya, atau saya tidak tahu ketepatan apa yang dibutuhkan jawaban untuk menjawab pertanyaan)
Di bawah ini adalah contoh yang dapat dengan mudah dibangun dan menunjukkan masalah. Efeknya tidak begitu aneh dan contohnya mudah dibuat.
- p = 200
- n = 50
- t m = 10
- koefisien model ditentukan secara acak
Dalam contoh kasus ini kami mengamati bahwa ada beberapa over-fitting tetapi koefisien parameter yang termasuk dalam model sebenarnya memiliki nilai yang lebih tinggi. Jadi R ^ 2 mungkin memiliki beberapa nilai positif.
Gambar di bawah ini (dan kode untuk menghasilkannya) menunjukkan bahwa pemasangan berlebihan terbatas. Titik-titik yang terkait dengan model estimasi 200 parameter. Titik-titik merah berhubungan dengan parameter-parameter yang juga ada dalam 'model sebenarnya' dan kami melihat bahwa mereka memiliki nilai yang lebih tinggi. Jadi, ada beberapa tingkat mendekati model nyata dan mendapatkan R ^ 2 di atas 0.
- Perhatikan bahwa saya menggunakan model dengan variabel ortogonal (fungsi sinus). Jika parameter berkorelasi maka mereka dapat terjadi dalam model dengan koefisien yang relatif sangat tinggi dan menjadi lebih dihukum dalam norma OLS minimal.
- s i n ( a x ) ⋅ s i n ( b x )xxnhal
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))
Teknik beta terpotong dalam kaitannya dengan regresi ridge
l2β
- Sepertinya model kebisingan terpotong melakukan hal yang sama (hanya menghitung sedikit lebih lambat, dan mungkin sedikit lebih sering kurang baik).
- Namun tanpa pemotongan efeknya jauh kurang kuat.
Korespondensi antara menambahkan parameter dan penalti ridge ini tidak selalu merupakan mekanisme terkuat di belakang tidak adanya over-fitting. Ini dapat dilihat terutama pada kurva 1000p (pada gambar pertanyaan) akan hampir 0,3 sedangkan kurva lainnya, dengan p yang berbeda, tidak mencapai level ini, tidak peduli apa parameter regresi ridge. Parameter tambahan, dalam kasus praktis itu, tidak sama dengan pergeseran parameter punggungan (dan saya rasa ini karena parameter tambahan akan membuat model yang lebih baik, lebih lengkap,).
Parameter kebisingan mengurangi norma di satu sisi (seperti regresi ridge) tetapi juga memperkenalkan kebisingan tambahan. Benoit Sanchez menunjukkan bahwa dalam batas tersebut, menambahkan banyak banyak parameter kebisingan dengan deviasi yang lebih kecil, pada akhirnya akan sama dengan regresi ridge (semakin banyak parameter kebisingan membatalkan satu sama lain). Tetapi pada saat yang sama, itu membutuhkan lebih banyak perhitungan (jika kita meningkatkan penyimpangan kebisingan, untuk memungkinkan untuk menggunakan lebih sedikit parameter dan mempercepat perhitungan, perbedaannya menjadi lebih besar).
Rho = 0,2
Rho = 0,4
Rho = 0,2 meningkatkan varians dari parameter kebisingan ke 2
contoh kode
# 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)