Làm thế nào (định mức tối thiểu) OLS không thể vượt quá?
Nói ngắn gọn:
Các tham số thử nghiệm tương quan với các tham số (chưa biết) trong mô hình thực sẽ có nhiều khả năng được ước tính với các giá trị cao trong quy trình khớp OLS định mức tối thiểu. Đó là bởi vì chúng sẽ phù hợp với 'model + noise' trong khi các tham số khác sẽ chỉ phù hợp với 'noise' (do đó chúng sẽ phù hợp với phần lớn hơn của mô hình với giá trị thấp hơn của hệ số và có nhiều khả năng có giá trị cao trong OLS định mức tối thiểu).
Hiệu ứng này sẽ làm giảm lượng quá mức trong quy trình lắp OLS định mức tối thiểu. Hiệu ứng sẽ rõ rệt hơn nếu có nhiều tham số hơn kể từ đó có nhiều khả năng là một phần lớn hơn của 'mô hình thực' được kết hợp trong ước tính.
Phần dài hơn:
(Tôi không chắc chắn nên đặt gì ở đây vì vấn đề không hoàn toàn rõ ràng đối với tôi hoặc tôi không biết chính xác câu trả lời nào cần giải quyết câu hỏi)
Dưới đây là một ví dụ có thể dễ dàng xây dựng và chứng minh vấn đề. Hiệu quả không quá xa lạ và các ví dụ rất dễ thực hiện.
- p=200
- n=50
- tm=10
- hệ số mô hình được xác định ngẫu nhiên
Trong trường hợp ví dụ này, chúng tôi quan sát thấy có một số khớp quá mức nhưng hệ số của các tham số thuộc về mô hình thực có giá trị cao hơn. Do đó, R ^ 2 có thể có một số giá trị dương.
Hình ảnh bên dưới (và mã để tạo ra nó) chứng minh rằng sự phù hợp quá mức bị hạn chế. Các dấu chấm liên quan đến mô hình ước lượng 200 tham số. Các chấm đỏ liên quan đến các tham số cũng có trong 'mô hình thực' và chúng tôi thấy rằng chúng có giá trị cao hơn. Do đó, có một số mức độ tiếp cận mô hình thực và nhận R ^ 2 trên 0.
- Lưu ý rằng tôi đã sử dụng một mô hình với các biến trực giao (các hàm sin). Nếu các tham số tương quan thì chúng có thể xảy ra trong mô hình với hệ số tương đối rất cao và bị phạt nhiều hơn trong OLS định mức tối thiểu.
- 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))
Kỹ thuật beta rút ngắn liên quan đến hồi quy sườn
l2β
- Có vẻ như mô hình nhiễu cắt ngắn thực hiện nhiều điều tương tự (chỉ tính toán chậm hơn một chút và có thể thường kém hơn một chút).
- Tuy nhiên, không có sự cắt bớt, hiệu ứng sẽ kém mạnh mẽ hơn nhiều.
Sự tương ứng giữa việc thêm tham số và hình phạt sườn núi không nhất thiết là cơ chế mạnh nhất đằng sau sự không phù hợp quá mức. Điều này có thể được nhìn thấy đặc biệt là trong đường cong 1000p (trong hình ảnh của câu hỏi) sẽ gần như 0,3 trong khi các đường cong khác, với p khác nhau, không đạt đến mức này, bất kể tham số hồi quy sườn là gì. Các tham số bổ sung, trong trường hợp thực tế đó, không giống như một sự thay đổi của tham số sườn núi (và tôi đoán rằng điều này là do các tham số phụ sẽ tạo ra một mô hình tốt hơn, đầy đủ hơn).
Các tham số tiếng ồn làm giảm chỉ tiêu một mặt (giống như hồi quy sườn) nhưng cũng giới thiệu thêm tiếng ồn. Benoit Sanchez cho thấy trong giới hạn, thêm nhiều tham số nhiễu với độ lệch nhỏ hơn, cuối cùng nó sẽ trở thành giống như hồi quy sườn (số lượng tham số nhiễu tăng dần triệt tiêu lẫn nhau). Nhưng đồng thời, nó đòi hỏi nhiều tính toán hơn (nếu chúng ta tăng độ lệch của nhiễu, để cho phép sử dụng ít tham số hơn và tăng tốc độ tính toán, sự khác biệt sẽ lớn hơn).
Rho = 0,2
Rho = 0,4
Rho = 0,2 tăng phương sai của các tham số nhiễu lên 2
mã ví dụ
# 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)