(최소 규범) OLS가 어떻게 초과 적합하지 않을 수 있습니까?
한마디로 :
실제 모델의 (알 수없는) 파라미터와 상관되는 실험 파라미터는 최소 표준 OLS 피팅 절차에서 높은 값으로 추정 될 가능성이 높습니다. 이는 'model + noise'에 맞고 다른 매개 변수는 'noise'에만 맞기 때문입니다 (따라서 더 낮은 계수 값으로 모델의 더 큰 부분에 맞고 높은 값을 가질 가능성이 높습니다) 최소 표준 OLS에서).
이 효과는 최소 표준 OLS 피팅 절차에서 과적 합의 양을 줄입니다. 더 많은 매개 변수를 사용할 수있는 경우 효과가 더 두드러지며, 그 결과 '참 모델'의 더 많은 부분이 추정에 통합 될 가능성이 높아집니다.
더 긴 부분 :
(문제가 나에게 명확하지 않기 때문에 여기에 무엇을 배치 해야할지 잘 모르겠거나 질문에 대한 답변이 어느 정도의 정밀도를 필요로하는지 모르겠습니다)
아래는 쉽게 구성하고 문제를 보여줄 수있는 예입니다. 그 효과는 그리 이상하지 않으며 예제를 쉽게 만들 수 있습니다.
- 변수로 sin-functions (수직이기 때문에)를 취했습니다.p=200
- 측정 값 으로 랜덤 모델을 생성했습니다 .
n=50
- 모형은 변수 중 만으로 구성 되므로 200 개의 변수 중 190 개가 과적 합을 생성 할 수 있습니다.tm=10
- 모델 계수는 무작위로 결정됩니다
이 예에서는 과적 합이 있지만 실제 모형에 속하는 모수의 계수가 더 높은 값을 갖는 것을 관찰합니다. 따라서 R ^ 2는 양의 값을 가질 수 있습니다.
아래 이미지 (및이를 생성하는 코드)는 과적 합이 제한됨을 보여줍니다. 200 개의 모수의 추정 모델과 관련된 점입니다. 빨간 점은 '진정한 모델'에도있는 매개 변수와 관련이 있으며 더 높은 값을 가지고 있음을 알 수 있습니다. 따라서 실제 모델에 접근하고 R ^ 2가 0보다 높아지는 정도가 있습니다.
- 직교 변수 (사인 함수)가있는 모델을 사용했습니다. 매개 변수가 상관 된 경우 상대적으로 매우 높은 계수를 가진 모델에서 매개 변수가 발생할 수 있으며 최소 규범 OLS에서 더 많은 처벌을받을 수 있습니다.
- '직교 변수'는 데이터를 고려할 때 직교하지 않습니다. 의 내부 곱은 의 전체 공간을 적분 할 때에 만 0 이며 샘플 가 적을 때는 아닙니다 . 결과적으로 노이즈가 0 인 경우에도 과적 합이 발생합니다 (그리고 R ^ 2 값은 노이즈를 제외하고 많은 요소에 의존하는 것처럼 보입니다. 물론 과 의 관계가 있지만 변수의 수는 중요합니다) 실제 모델과 피팅 모델에 몇 개가 있는지).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))
능선 회귀와 관련하여 잘린 베타 기술
파이썬 코드를 Amoeba에서 R로 변환하고 두 그래프를 결합했습니다. 노이즈 변수가 추가 된 각 최소 표준 OLS 추정치 에 대해 벡터에 대해 동일한 (대략) -norm 과 능선 회귀 추정치와 일치합니다 .l2β
- 잘린 노이즈 모델이 거의 동일한 것처럼 보입니다 (조금 더 느리게 계산하고 어쩌면 약간 덜 계산합니다).
- 그러나 잘림이 없으면 효과가 훨씬 덜 강해집니다.
매개 변수 추가와 능선 페널티 사이의 이러한 대응은 과적 합이없는 배후의 가장 강력한 메커니즘 일 필요는 없습니다. 이것은 릿지 회귀 매개 변수가 무엇이든 관계없이 1000p 곡선 (문제의 이미지에서)이 거의 0.3이되는 반면에 다른 p를 가진 다른 곡선은이 수준에 도달하지 못합니다. 그 실제 상황에서 추가 매개 변수는 릿지 매개 변수의 이동과 동일하지 않습니다 (추가 매개 변수가 더 좋고 더 완전한 모델을 만들 것이기 때문입니다).
노이즈 매개 변수는 한편으로는 능선 회귀처럼 표준을 줄이지 만 추가 노이즈를 발생시킵니다. Benoit Sanchez는 한계에서 작은 편차로 많은 노이즈 파라미터를 추가하면 릿지 회귀와 동일하게 될 것입니다 (노이즈 파라미터 수가 증가하면 서로 상쇄 됨). 그러나 동시에 훨씬 더 많은 계산이 필요합니다 (소음의 편차를 증가시키고 더 적은 매개 변수를 사용하고 계산 속도를 높이면 차이가 커집니다).
Rho = 0.2
Rho = 0.4
Rho = 0.2 노이즈 파라미터의 분산을 2로 증가
코드 예
# 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)