(最小范数)OLS如何过拟合?
简而言之:
与真实模型中(未知)参数相关的实验参数将更有可能在最小范数OLS拟合过程中以高值进行估算。那是因为它们将适合“模型+噪声”,而其他参数仅适合“噪声”(因此,它们将以较低的系数值拟合模型的较大部分,并且更有可能具有较高的值在最小标准OLS中)。
这种效果将减少最小标准OLS拟合过程中的过度拟合量。如果有更多可用参数,则效果会更加明显,因为这样一来,“真实模型”的较大部分就有可能被纳入估算。
较长的部分:(
我不确定在此放置什么,因为这个问题对我来说还不是很清楚,或者我不知道答案以多大的精确度来解决这个问题)
下面是一个可以轻松构造并演示该问题的示例。效果并不那么奇怪,并且易于创建示例。
- 我将 sin函数(因为它们是垂直的)作为变量p=200
- 用测量值创建了一个随机模型。
n=50
- 该模型仅使用的变量构建,因此200个变量中的190个正在产生生成过度拟合的可能性。tm=10
- 模型系数是随机确定的
在此示例中,我们观察到有些过度拟合,但是属于真实模型的参数的系数具有较高的值。因此,R ^ 2可以具有一些正值。
下图(以及生成它的代码)证明了过度拟合是有限的。与200个参数的估计模型有关的点。红点与“真实模型”中也存在的那些参数有关,我们看到它们具有较高的值。因此,在某种程度上接近真实模型并使R ^ 2大于0。
- 请注意,我使用的模型带有正交变量(正弦函数)。如果参数相关,则它们可能会以相对非常高的系数出现在模型中,并在最小范数OLS中变得更加不利。
- 注意,当我们考虑数据时,“正交变量”不是正交的。当我们对的整个空间进行积分时,的内积仅为零,而当我们只有几个样本时,它们的内积才为零。结果是,即使噪声为零,也会发生过度拟合(R ^ 2值似乎除噪声外还取决于许多因素。当然,存在关系和,但重要的是要计算多少个变量在真实模型中以及在拟合模型中有多少)。X X Ñ psin(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))
截断beta技术与岭回归相关
我已经将变形虫的python代码从R转换为R,并将两个图形组合在一起。对于每个具有添加的噪声变量的最小范数OLS估计,我都将向量的岭回归估计与相同的(近似)范数匹配。 βl2β
- 似乎截断后的噪声模型做了很多相同的事情(仅计算速度较慢,也许更差一些)。
- 但是,如果没有截断,效果将大大减弱。
在没有过度拟合的情况下,添加参数和山脊惩罚之间的这种对应关系不一定是最强的机制。尤其是在1000p曲线(在问题的图像中)几乎达到0.3的情况下,可以看到这一点,而其他曲线(具有不同的p)则不会达到此水平,无论岭回归参数是什么。在实际情况下,附加参数与ridge参数的移动不同(我猜这是因为附加参数将创建更好,更完整的模型)。
噪声参数一方面降低了范数(就像脊回归一样),但同时也引入了其他噪声。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)