在高维度(


50

考虑一个具有预测变量和样本大小旧回归问题。通常的看法是,OLS估计量将过拟合,并且通常会比岭回归估计量好:通常使用交叉验证来找到最佳正则化参数。在这里,我使用10倍CV。澄清更新:当,通过“ OLS估计器”,我理解给出的“最小范数OLS估计器”pβ = X X + λ - 1 X ÿ λ Ñ < p β OLS = X X + X Ŷ = X + ý n

β^=(XX+λI)1Xy.
λn<p
β^OLS=(XX)+Xy=X+y.

我有一个和的数据集。所有的预测变量都是标准化的,并且有很多(单独)可以很好地预测。如果我随机选择一个较小的预测变量(例如,则会得到一条合理的CV曲线:大值产生零R平方,小值产生负R平方(因为过度拟合),并且介于两者之间。对于,曲线看起来相似。但是,对于远大于情况,例如,我根本没有任何最大值:曲线平稳,这意味着OLS与p > 1000 ÿ p = 50 < Ñ λ λ p = 100 > Ñ p p = 1000 λ →交通0 λn=80p>1000yp=50<nλλp=100>npp=1000λ0与最佳岭回归效果一样好。λ

在此处输入图片说明

这怎么可能?它对我的数据集有何影响?我是否遗漏了一些明显的东西,或者确实违反直觉?假设和都大于,则在质上有什么区别?p = 1000 np=100p=1000n

在什么条件下最小范数OLS解决方案不会过拟合?n<p


更新:注释中有些令人难以置信,因此这是使用的可复制示例glmnet。我使用Python,但是R用户可以轻松修改代码。

%matplotlib notebook

import numpy as np
import pylab as plt
import seaborn as sns; sns.set()

import glmnet_python    # from https://web.stanford.edu/~hastie/glmnet_python/
from cvglmnet import cvglmnet; from cvglmnetPlot import cvglmnetPlot

# 80x1112 data table; first column is y, rest is X. All variables are standardized
mydata = np.loadtxt('../q328630.txt')   # file is here https://pastebin.com/raw/p1cCCYBR
y = mydata[:,:1]
X = mydata[:,1:]

# select p here (try 1000 and 100)
p = 1000

# randomly selecting p variables out of 1111
np.random.seed(42)
X = X[:, np.random.permutation(X.shape[1])[:p]]

fit = cvglmnet(x = X.copy(), y = y.copy(), alpha = 0, standardize = False, intr = False, 
               lambdau=np.array([.0001, .001, .01, .1, 1, 10, 100, 1000, 10000, 100000]))
cvglmnetPlot(fit)
plt.gcf().set_size_inches(6,3)
plt.tight_layout()

在此处输入图片说明 在此处输入图片说明


2
@DJohnson不要开玩笑。通常是10倍CV,这意味着每个训练集的n = 72和每个测试集的n = 8。
变形虫说恢复莫妮卡

2
这与通常的简历相去甚远。鉴于人们怎么可能期望得到可检测的结果?
Mike Hunter

3
@DJohnson我不明白你为什么要说这与平常相去甚远。这就是10倍CV。
变形虫说恢复莫妮卡

2
@ seanv507我明白了。好吧,我建议将“ lambda = 0的解”定义为“ lambda = 0的最小范数解”。我想我的问题可以重新表述为:在什么条件下,n <p过度拟合与不过度拟合的最小范数OLS解决方案?
变形虫说恢复莫妮卡

3
@amoeba:谢谢您提出这个问题。到目前为止,它一直非常有启发性和有趣。
恢复单胞菌usεr11852说,

Answers:


23

由于的理论PCA中存在许多小成分,因此发生了自然的正则化。这些小分量被隐式地使用小系数来拟合噪声。使用最小范数OLS时,您可以使用许多小的独立分量来拟合噪声,这具有与Ridge正则化等效的正则化效果。这种正则化通常太强了,可以使用被称为负Ridge的 “反正则化”来对其进行补偿。在这种情况下,您将看到值为负的MSE曲线的最小值出现λxλ

从理论上讲,PCA是指:

令为多元正态分布。有一个线性等距例如,其中是对角线的:的分量是独立的。是通过对角简单地获得的。˚F ù = ˚F X Ñ 0 ð ð ù ð ΣxN(0,Σ)fu=f(x)N(0,D)DuDΣ

现在可以将模型写成 (线性等距保留点积)。如果您写,则模型可以写为 。此外因此,拟合方法(例如Ridge或最小范数OLS)是完全同构的: 的估计量是的估计量的 像。y=β.x+ϵy=f(β).f(x)+ϵγ=f(β)y=γ.u+ϵý = γ u + ϵ f y = β x + ϵβ=γy=γ.u+ϵfy=β.x+ϵ

理论PCA将非独立预测变量转换为独立预测变量。它仅与使用经验协方差矩阵的经验PCA松散相关(与样本量较小的理论协方差矩阵有很大差异)。理论PCA实际上不是可计算的,仅在此处用于在正交预测变量空间中解释模型。

让我们看看将许多与小方差无关的预测变量附加到模型时会发生什么:

定理

系数岭正则化等效于(当):p →交通λp

  • 添加伪造的独立预测变量(集中且分布均匀),每个预测变量均具有方差λpλp
  • 用最小范数OLS估计量拟合丰富的模型
  • 仅保留真实预测变量的参数

(略图)证明

我们将证明成本函数渐近相等。让我们将模型分为真实和虚假的预测变量:。Ridge的成本函数(对于真正的预测变量)可以写成:y=βx+βx+ϵ

costλ=β2+1λyXβ2

当使用最小范数OLS时,响应非常合适:误差项为0。成本函数仅关于参数的范数。它可以分为真实参数和伪参数:

costλ,p=β2+inf{β2Xβ=yXβ}

在正确的表达式中,最小范数解由下式给出:

β=X+(yXβ)

现在将SVD用于:X

X=UΣV

X+=VΣ+U

我们看到的范数基本上取决于的奇异值,它们是的奇异值的倒数 。的规范化版本是。我看过文献,大型随机矩阵的奇异值是众所周知的。对于和足够大,最小和最大 奇异值近似为(请参见定理1.1):X ' + X ' X ' βX+XXpñ小号分钟小号最大p/λXpnsminsmax

smin(p/λX)p(1n/p)
smax(p/λX)p(1+n/p)

因为对于大,趋于0,所以我们只能说所有奇异值都由近似。从而:pn/pp

β1λyXβ

最后:

costλ,pβ2+1λyXβ2=costλ

注意:在模型中保留假预测变量的系数并不重要。引入的方差是 。因此,您的MSE 只会增加的因子,而无论如何趋向于1。您无需以某种方式将假预测变量与真实预测变量区别对待。βxλpβ21pyXβ2npMSE(β)1+n/p

现在,回到@amoeba的数据。在将理论PCA应用于(假定为正常)之后,通过线性等距线转换为变量其成分是独立的,并按递减的降序排序。问题等效于变换后的问题。xxuy=βx+ϵy=γu+ϵ

现在想象一下组件的变化形式:

在此处输入图片说明

考虑最后一个分量中的许多,称它们的方差之和。它们每个具有大约等于的方差,并且是独立的。它们在定理中扮演假预测变量的角色。pλλ/p

在@jonny模型中,这一事实更加清楚:只有理论PCA的第一部分与相关(它与成比例),并且具有很大的方差。所有其他分量(与成比例)具有相对较小的方差(编写协方差矩阵并将其对角线化以查看此情况),并扮演虚假的预测变量。我计算出,这里的正则化(大约与上的先验而真正的。这肯定过度收缩。最终的MSE比理想的MSE大得多,这是可见的。正则化效果太强。yx¯xix¯γ1γ 2 1 =1N(0,1p2)γ1γ12=1p

有时可以通过Ridge改善这种自然的正则化。首先,您有时有时需要定理中的非常大(1000、10000 ...),才能与Ridge较劲,而的有限性就像一个不精确的东西。但是,这也表明,Ridge是自然存在的隐式正则化之后的附加正则化,因此影响很小。有时,这种自然的正则化已经太强了,Ridge甚至没有改善。不仅如此,最好使用反正则化:具有负系数的Ridge。这显示了@jonny模型()的MSE ,使用:p p = 1000 λ &Element; [Rppp=1000λR

在此处输入图片说明


2
+1非常好,感谢您撰写本文。我认为有必要澄清,当您说“正则化”时,是指(即山脊)正则化。人们希望套索或弹性网能够表现得更好,而这确实是人们在情况下使用的东西。在这种情况下,没有人使用纯脊,标准建议是使用加强稀疏性的正则化。因此,纯岭的行为可能只具有学术意义。尽管如此,我们似乎在这里发现它还是非常令人惊讶的。为什么这不是众所周知的? Ñ » pL2np
变形虫说恢复莫妮卡

1
与成正比的硬编码不良。抱歉,我没时间做些适当的事情。我的主要重点是最小范数OLS的行为,以了解它与您的示例有所不同,并且在40个首尾进行“有些不太糟糕的正则化”要好得多。σ 2λσ2
贝诺瓦·桑切斯

3
我想我已经理解了一个谜:系数为 Ridge正则化等效于最小范数OLS添加伪造的预测变量,每个预测变量的方差为(对于大渐近而言)。由于PCA的方差最低,因此在您的数据和Johny模型中,一切都没有发生。现在我需要时间找到一种清楚地解释这一点的方法……p λ / p pλpλ/pp
Benoit Sanchez

1
我澄清了一点:伪造的预测变量的系数并不会大大增加误差(请参见证明末尾的注释)。这很重要,因为它们不可避免地保留在您的数据/ jonny中。
贝努瓦·桑切斯

3
我尝试了负面的里奇。我不敢相信,但它有效!!!(并且不仅限于乔尼的模型……)
Benoit Sanchez,

16

感谢大家的持续不断的讨论。问题的症结在于,最小范数OLS有效地执行了与脊回归相似的收缩。这似乎在时发生。具有讽刺意味的是,添加纯噪声预测器甚至可以用作非常怪异的形式或正则化。pn


第一部分:人工数据和分析性简历的演示

@Jonny(+1)提出了一个非常简单的人工示例,在这里我会稍作修改。生成大小的和以使所有变量均为具有单位方差的高斯变量,并且每个预测变量和响应之间的相关性为。我将修复。Ñ × p Ŷ ρ ρ = 0.2Xn×pyρρ=.2

我将使用留一法式CV,因为存在平方误差的解析表达式:称为PRESS,即“预测平方和”。其中是残差和是帽子矩阵就SVD。这允许复制@Jonny的结果,而无需使用也不需要实际执行交叉验证(我正在绘制PRESS与平方和的比):

PRESS=i(ei1Hii)2,
ei
e=yy^=yHy,
H
H=X(XX+λI)1X=US2S2+λU
X=USVglmnety

在此处输入图片说明

这种分析方法允许计算的限制。简单地将插入PRESS公式是行不通的:当和,残差全为零,并且hat矩阵是在对角线上带有1的恒等矩阵,这意味着PRESS中的分数方程未定义。但是,如果我们将处的限制计算,则它将对应于的最小范数OLS解。λ0λ=0n<pλ=0λ0λ=0

诀窍是当时对帽子矩阵进行泰勒展开: 在这里,我介绍了Gram矩阵。λ0

H=U11+λ/S2UU(1λ/S2)U=IλUS2U=IλG1.
G=XX=US2U

我们差不多完成了:Lambda被取消,因此这里有极限值。我在上图(在的面板上)上用一个大黑点画了它,并完美匹配。

PRESS=i(λ[G1y]iλGii1)2=i([G1y]iGii1)2.
p>n

更新2月21日。上面的公式是准确的,但是我们可以通过进一步近似来获得一些见解。即使具有非常不相等的值,看起来在对角线上也具有近似相等的值(可能是因为很好地混合了所有特征值)。因此,对于每个我们都有,其中方括号表示平均值。使用此近似值,我们可以重写:上图以红色空心圆显示了该近似值。G1SUiGii1S2

PRESSS2S2Uy2.

这是否将是大于或小于依赖于奇异值。在此仿真中,与的第一个PC相关,因此很大,所有其他项都很小。(在我的实际数据中,领先的PC也很好地预测了。)现在,在情况下,如果的列足够随机,则所有奇异值将彼此接近(行数大约为正交)。“主要”术语y2=Uy2SyXU1yypnXU1y将乘以小于1的因子。最后的项将乘以大于1但不大很多的因子。总体而言,规范减少了。相反,在情况下,将有一些非常小的奇异值。反演之后,它们将成为增加总体规范的大因素。pn

[这个论点很容易动摇;我希望可以使它更精确。

作为一个健全性检查,如果我交换奇异值的顺序,S = diag(flipud(diag(S)));则在第二个和第三个面板上,预测的MSE都将高于。1

figure('Position', [100 100 1000 300])
ps = [10, 100, 1000];

for pnum = 1:length(ps)
    rng(42)
    n = 80;
    p = ps(pnum);
    rho = .2;
    y = randn(n,1);
    X = repmat(y, [1 p])*rho + randn(n,p)*sqrt(1-rho^2);

    lambdas = exp(-10:.1:20);
    press = zeros(size(lambdas));
    [U,S,V] = svd(X, 'econ');
    % S = diag(flipud(diag(S)));   % sanity check

    for i = 1:length(lambdas)
        H = U * diag(diag(S).^2./(diag(S).^2 + lambdas(i))) * U';
        e = y - H*y;
        press(i) = sum((e ./ (1-diag(H))).^2);
    end

    subplot(1, length(ps), pnum)
    plot(log(lambdas), press/sum(y.^2))
    hold on
    title(['p = ' num2str(p)])
    plot(xlim, [1 1], 'k--')

    if p > n
        Ginv = U * diag(diag(S).^-2) * U';
        press0 = sum((Ginv*y ./ diag(Ginv)).^2);
        plot(log(lambdas(1)), press0/sum(y.^2), 'ko', 'MarkerFaceColor', [0,0,0]);

        press0approx = sum((diag(diag(S).^-2/mean(diag(S).^-2)) * U' * y).^2);
        plot(log(lambdas(1)), press0approx/sum(y.^2), 'ro');
    end
end

第二部分 添加纯噪声预测器作为正则化形式

@ Jonny,@ Benoit,@ Paul,@ Dikran和其他人提出了很好的论据,即增加预测变量的数量将缩小最小范数OLS解决方案。实际上,一旦,任何新的预测变量都只能降低最小范数解的范数。因此,添加预测变量会降低范数,这有点类似于岭回归对范数的惩罚。p>n

那么可以将其用作正则化策略吗?我们从和,然后继续添加纯噪声预测变量作为正则化尝试。我将进行LOOCV并将其与脊的LOOCV进行比较(如上计算)。请注意,在预测变量上获得之后,我将在处“截断”它,因为我只对原始预测变量感兴趣。n=80p=40qβ^p+qp

在此处输入图片说明

有用!!!

实际上,不需要“截断” beta。即使我使用完整的beta和完整的预测变量,我也可以获得良好的性能(右侧子图上的虚线)。我认为这类似于我在问题中的实际数据:只有很少的预测变量可以真正预测,大多数预测变量是纯噪声,它们可以用作正则化。在这种情况下,附加的脊正则化完全没有帮助。p+qy

rng(42)
n = 80;
p = 40;
rho = .2;
y = randn(n,1);
X = repmat(y, [1 p])*rho + randn(n,p)*sqrt(1-rho^2);

lambdas = exp(-10:.1:20);
press = zeros(size(lambdas));
[U,S,V] = svd(X, 'econ');

for i = 1:length(lambdas)
    H = U * diag(diag(S).^2./(diag(S).^2 + lambdas(i))) * U';
    e = y - H*y;
    press(i) = sum((e ./ (1-diag(H))).^2);
end

figure('Position', [100 100 1000 300])
subplot(121)
plot(log(lambdas), press/sum(y.^2))
hold on
xlabel('Ridge penalty (log)')
plot(xlim, [1 1], 'k--')
title('Ridge regression (n=80, p=40)')
ylim([0 2])

ps = [0 20 40 60 80 100 200 300 400 500 1000];
error = zeros(n, length(ps));
error_trunc = zeros(n, length(ps));
for fold = 1:n
    indtrain = setdiff(1:n, fold);
    for pi = 1:length(ps)
        XX = [X randn(n,ps(pi))];
        if size(XX,2) < size(XX,1)
            beta = XX(indtrain,:) \ y(indtrain,:);
        else
            beta = pinv(XX(indtrain,:)) * y(indtrain,:);
        end
        error(fold, pi) = y(fold) - XX(fold,:) * beta;
        error_trunc(fold, pi) = y(fold) - XX(fold,1:size(X,2)) * beta(1:size(X,2));
    end
end

subplot(122)
hold on
plot(ps, sum(error.^2)/sum(y.^2), 'k.--')
plot(ps, sum(error_trunc.^2)/sum(y.^2), '.-')
legend({'Entire beta', 'Truncated beta'}, 'AutoUpdate','off')
legend boxoff
xlabel('Number of extra predictors')
title('Extra pure noise predictors')
plot(xlim, [1 1], 'k--')
ylim([0 2])

@MartijnWeterings在此实验中,我从n = 80和p = 40开始。随着预测变量的总数(p + q)接近n = 80,问题变得病态,OLS解决方案急剧过度拟合。q = 40附近的误差有一个极大的峰值。一旦p + q> n出现,“最小范数”约束就会出现,并且误差开始减小,但是要等到回到q = 0时才需要一段时间。它发生在q = 70左右,即p + q = 130。此后,误差甚至进一步减小,该图的这一部分类似于岭回归图。是否有意义?
变形虫说恢复莫妮卡

@MartijnWeterings在第一条评论:我们在同一页上。关于第二条评论:在我的问题中,我没有截断beta,是的。但是实际上,如果我没有在模拟中截断beta(使用y(fold) - XX(fold,:) * beta代替XX(fold,1:size(X,2)) * beta(1:size(X,2))),那么结果不会有太大变化。我想我应该将此添加到我的答案中。我认为我的原始数据显示了这种行为。
变形虫说恢复莫妮卡

(1/2):我仍在努力通过所有注释和代码来理解,但我想到:在我们观察到的这种现象与岭回归与随机效应之间是否存在关系?
瑞安·西蒙斯

(2/2):根据Randel在这里的答案(stats.stackexchange.com/questions/122062/…),我们看到了随机效应和岭回归之间的估计当量,其中lambda等于残差与方差之比。随机效果。在这里,根据Benoit Sanchez的答案,我们看到岭回归等效于添加任意数量的伪独立预测变量,每个独立预测变量的方差等于lambda和参数数量的函数。在我看来,这是一种概念上的关系。
瑞安·西蒙斯

@amoeba,这是一个错误。在矩阵X上添加缩放向量y确实可以使规则化,但与岭回归或噪声向量不同。但是,这的确使我感到奇怪,当我们从每个x中减去,以使每个变量与y向量略微负相关(或不太正)时,会发生什么。为了执行一些“负”正则化。为了“撤消” 1000个向量的正则化(在某些时候它可能变得太多,如您所见,峰值/最佳正则化系数现在几乎超出范围)。y
Sextus Empiricus

15

这是人为的情况,发生这种情况。假设每个预测变量是目标变量的副本,并且应用了大量的高斯噪声。最好的模型是所有预测变量的平均值。

library(glmnet)
set.seed(1846)
noise <- 10
N <- 80
num.vars <- 100
target <- runif(N,-1,1)
training.data <- matrix(nrow = N, ncol = num.vars)
for(i in 1:num.vars){
  training.data[,i] <- target + rnorm(N,0,noise)
}
plot(cv.glmnet(training.data, target, alpha = 0,
               lambda = exp(seq(-10, 10, by = 0.1))))

具有100个预测变量的各种Lambda的MSE

100个变量以“正常”方式运行:λ的一些正值可最大程度地减少样本误差。

但是,将上述代码中的num.vars增加到1000,这是新的MSE路径。(我扩展到log(Lambda)= -100来说服自己。

具有1000个预测变量的各种Lambda的MSE

我认为正在发生的事情

当以低正则化拟合大量参数时,系数以高方差随机分布在其真实值附近。

当预测变量的数量变得非常大时,“平均误差”趋向于零,并且最好让系数落在它们可能的位置并加总所有内容,而不是将它们偏向0。

我确信,真正的预测是所有预测变量的平均值的情况并不是唯一的发生时间,但是我不知道如何在此处确定最大的必要条件。

编辑:

由于解决方案正在收敛到最小范数OLS解决方案,因此始终会发生非常低的lambda的“平坦”行为。类似地,当解决方案收敛到0时,对于非常高的λ,曲线将是平坦的。如果这两种解决方案之一是最优的,就不会有最小值。

为什么在这种情况下最小范数的OLS解决方案这么好(相对)?我认为这与以下行为有关,我发现这很违反直觉,但反思很有意义。

max.beta.random <- function(num.vars){
  num.vars <- round(num.vars)
  set.seed(1846)
  noise <- 10
  N <- 80
  target <- runif(N,-1,1)
  training.data <- matrix(nrow = N, ncol = num.vars)

  for(i in 1:num.vars){
    training.data[,i] <- rnorm(N,0,noise)
  }
  udv <- svd(training.data)

  U <- udv$u
  S <- diag(udv$d)
  V <- udv$v

  beta.hat <- V %*% solve(S) %*% t(U) %*% target

  max(abs(beta.hat))
}


curve(Vectorize(max.beta.random)(x), from = 10, to = 1000, n = 50,
      xlab = "Number of Predictors", y = "Max Magnitude of Coefficients")

abline(v = 80)

随着预测变量数量的增加,最大系数幅度的图

随着随机生成的预测变量与响应无关,随着p的增加,系数变大,但是一旦p远大于N,它们就会缩小为零。在我的示例中也是如此。因此,非常宽松地讲,针对这些问题的非正规解决方案不需要缩减,因为它们已经很小了!

发生这种情况的原因很简单。可以精确地表示为列的线性组合。是系数的最小范数向量。随着添加更多列,的范数必须减少或保持不变,因为可能的线性组合是使先前系数保持相同并将新系数设置为。yXβ^β^0


1
(+1)。因此,当预测变量相关时,该现象似乎发生了。这并不正式意味着误差曲线没有正最小值,也不表示0的极限不大。这仅表示曲线趋于平坦,并且对于大,正则化停止工作所必需的阈值趋向于0 。在这里,此阈值超出了计算限制,但Firebug的答案表明它可能一直存在。λλp
贝努瓦·桑切斯

1
为什么需要glmnet更新?如果只需要最小范数OLS解,则有一个直接公式(请参阅我的问题中的第二个公式),如果计算 SVD,则此公式将变成。R中可能也有一个函数可以计算该解决方案,但我真的不知道R :)X=USVβ^=VS1Uy
阿米巴说Reinstate Monica

2
再多考虑一点也就不足为奇了。可以精确表示为中向量的线性组合。是范数最小的系数向量。添加向量时,的范数必须减小或保持不变,因为您可以使旧系数保持不变,并将新系数设置为零。yXβ^β^
强尼·罗蒙德

3
乔尼的例子很好,因为已经对其进行了分析:请参阅James-Stein估计器。当估计维度为3或更大的固定向量的均值时,我们总是可以通过偏向零来改善简单平均,这或多或少是岭回归的作用。我想知道在这种情况下改进是否太小而无法观察?θ
保罗

3
众所周知的事实是,岭回归等效于向数据集中添加额外的“伪”样本,每个样本在一个特征中具有值,而在其他所有地方均具有零,并且所有相应的响应均为零。(以这种形式重写RR成本函数很简单。)我现在想知道是否有一种方法可以添加具有类似效果的额外功能(例如,纯噪声?)。当然,添加额外的功能意味着将增加其维数,但是只能查看“原始”预测变量的值。@Paulpλβ^
变形虫说恢复莫妮卡

6

因此,我决定使用mlrR中的专用包运行嵌套交叉验证,以查看建模方法的实际作用。

代码(在普通笔记本上运行需要几分钟)

library(mlr)
daf = read.csv("https://pastebin.com/raw/p1cCCYBR", sep = " ", header = FALSE)

tsk = list(
  tsk1110 = makeRegrTask(id = "tsk1110", data = daf, target = colnames(daf)[1]),
  tsk500 = makeRegrTask(id = "tsk500", data = daf[, c(1,sample(ncol(daf)-1, 500)+1)], target = colnames(daf)[1]),
  tsk100 = makeRegrTask(id = "tsk100", data = daf[, c(1,sample(ncol(daf)-1, 100)+1)], target = colnames(daf)[1]),
  tsk50 = makeRegrTask(id = "tsk50", data = daf[, c(1,sample(ncol(daf)-1, 50)+1)], target = colnames(daf)[1]),
  tsk10 = makeRegrTask(id = "tsk10", data = daf[, c(1,sample(ncol(daf)-1, 10)+1)], target = colnames(daf)[1])
)

rdesc = makeResampleDesc("CV", iters = 10)
msrs = list(mse, rsq)
configureMlr(on.par.without.desc = "quiet")
bm3 = benchmark(learners = list(
    makeLearner("regr.cvglmnet", alpha = 0, lambda = c(0, exp(seq(-10, 10, length.out = 150))),
    makeLearner("regr.glmnet", alpha = 0, lambda = c(0, exp(seq(-10, 10, length.out = 150))), s = 151)
    ), tasks = tsk, resamplings = rdesc, measures = msrs)

结果

getBMRAggrPerformances(bm3, as.df = TRUE)
#   task.id    learner.id mse.test.mean rsq.test.mean
#1    tsk10 regr.cvglmnet     1.0308055  -0.224534550
#2    tsk10   regr.glmnet     1.3685799  -0.669473387
#3   tsk100 regr.cvglmnet     0.7996823   0.031731316
#4   tsk100   regr.glmnet     1.3092522  -0.656879104
#5  tsk1110 regr.cvglmnet     0.8236786   0.009315037
#6  tsk1110   regr.glmnet     0.6866745   0.117540454
#7    tsk50 regr.cvglmnet     1.0348319  -0.188568886
#8    tsk50   regr.glmnet     2.5468091  -2.423461744
#9   tsk500 regr.cvglmnet     0.7210185   0.173851634
#10  tsk500   regr.glmnet     0.6171841   0.296530437

它们在所有任务中的作用基本相同。

那么,最佳lambda呢?

sapply(lapply(getBMRModels(bm3, task.ids = "tsk1110")[[1]][[1]], "[[", 2), "[[", "lambda.min")
# [1] 4.539993e-05 4.539993e-05 2.442908e-01 1.398738e+00 4.539993e-05
# [6] 0.000000e+00 4.539993e-05 3.195187e-01 2.793841e-01 4.539993e-05

请注意,lambda已被转换。有些折甚至选择了最小的lambda。λ=0

我摆弄了更多的东西glmnet,发现那里没有选择最小的lambda。校验:

编辑:

经过变形虫的评论后,很明显,正则化路径是glmnet估算的重要步骤,因此代码现在可以反映出来。这样,大多数差异就消失了。

cvfit = cv.glmnet(x = x, y = y, alpha = 0, lambda = exp(seq(-10, 10, length.out = 150)))
plot(cvfit)

在此处输入图片说明

结论

因此,基本上,确实提高了拟合度(编辑:但幅度不大!)。λ>0

这怎么可能?它对我的数据集有何影响?我是否遗漏了一些明显的东西,或者确实违反直觉?

我们可能会将数据设置的真实分布更接近一个大于零的较小值。但是,没有什么违反直觉的。λ

编辑:请记住,但是,当我们调用时glmnet,岭正则化路径会使用先前的参数估计,但这超出了我的专业知识。如果我们将lambda隔离度设置得很低,则可能会降低性能。

编辑:lambda选择确实说明了有关您的数据的更多信息。随着较大的Lambda降低性能,这意味着模型中存在优先系数,较大的系数,因为较大的Lambda将所有系数缩小为零。尽管表示模型中的有效自由度小于表观自由度。λ0p

假设p = 100和p = 1000都大于n,在质上有什么区别?

p=1000始终包含至少相同的信息,甚至大于。p=100


评论

看来您得到的是一些非零的lambda的极小最小值(我在看您的图),但曲线实际上仍然非常平坦。因此,我的主要问题仍然是为什么λ→0不会明显过拟合。我在这里还没有找到答案。您是否认为这是普遍现象?即,对于任何具有n≪p的数据,lambda = 0的效果几乎和最佳lambda一样好?还是这些数据有什么特别之处?如果您在上面的评论中查看,您会发现很多人甚至都不相信我这是可能的。

我认为您是将验证性能与测试性能混为一谈,这种比较是不正确的。

编辑:请注意,尽管lambda在运行整个正则化路径后将其设置为0并不会因此降低性能,所以正则化路径是了解发生了什么的关键!

另外,我不太明白您的最后一行。查看cv.glmnet输出,其中p = 100。它将具有截然不同的形状。那么,当p = 100或p = 1000时,什么会影响该形状(左侧渐近线与没有渐近线)?

让我们比较两者的正则化路径:

fit1000 = glmnet(x, y, alpha = 0, lambda = exp(seq(-10,10, length.out = 1001)))
fit100 = glmnet(x[, sample(1000, 100)], y, alpha = 0, lambda = exp(seq(-10,10, length.out = 1001)))
plot(fit1000, "lambda")

在此处输入图片说明

x11()
plot(fit100, "lambda")

在此处输入图片说明

很明显,在增大时提供较大的系数,即使在两个图的左侧,它的渐近OLS脊系数都较小。因此,基本上,在图形的左侧过拟合,这可能解释了它们之间行为的差异。p=1000λp=100

它是更难,因为过度拟合,即使岭收缩系数为零,它们永远不会达到零。这意味着该模型的预测能力在更多组件之间共享,从而更容易围绕均值进行预测,而不会被噪声所干扰。p=1000


+1感谢您进行这些实验!看来您正在为一些非零的lambda(我正在看您的图)获得极小的最小值,但是曲线实际上仍然非常平坦。因此,我的主要问题仍然是为什么不会明显过拟合。我在这里还没有找到答案。您是否认为这是普遍现象?即,对于具有任何数据,lambda = 0的表现几乎与最佳lambda一样好?还是这些数据有什么特别之处?如果您在上面的评论中查看,您会发现很多人甚至都不相信我这是可能的。λ0np
变形虫说恢复莫妮卡

另外,我不太明白您的最后一行。查看cv.glmnetp = 100 的输出。它将具有截然不同的形状。那么当p = 100或p = 1000时,什么会影响该形状(左侧渐近线与没有渐近线)?
变形虫说恢复莫妮卡

您是否知道mlr选择lambda.min还是lambda.1se(在cv.glmnet术语中)?
变形虫说恢复莫妮卡

@amoeba lambda.min。还有一个regr.cvglmnet学习者,它可能允许选择其他规则。
Firebug

谢谢。老实说,我不了解您的1e-100基准测试的结果。例如,对于p = 1100,它的MSE为1.45。但是在这里,内部回路中没有超参数调整,因此基本上一个根本不需要内部CV回路。这意味着结果应与在lambda = 1e-100时的非嵌套CV相同。但是我们从第一个数字可以看出,MSE约为0.7。这对我来说没有意义。
变形虫说恢复莫妮卡

5

(最小范数)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)

1
(+1)谢谢。我认为答案开头的直觉论点是有道理的。
变形虫说恢复莫妮卡

1

如果您熟悉线性运算符,那么您可能会喜欢我的答案,这是理解该现象的最直接途径:为什么范数回归至少不会完全失败?原因是您的问题()是不适定的逆问题,伪逆是解决问题的方法之一。正则化是一种改进。np

本文可能是最紧凑,最相关的解释:Lorenzo Rosasco等,学习,正则化和不适定逆问题。他们将您的回归问题设置为学习,请参阅等式3,其中参数的数量超过观察的数量: 其中是希尔伯特空间上的线性算子,而噪声数据。δ

Ax=gδ,
Agδ

显然,这是一个不适定的逆问题。因此,您可以使用SVD或Moore-Penrose逆来求解,这实际上将提供最小范数的解决方案。因此,它应该奇怪,你最不规范的解决方案不彻底失败。

但是,如果您按照本文进行操作,则可以看到岭回归将对上述内容有所改进。由于Moore-Penrose解不一定是有界的,因此改进实际上是估计器的更好行为。

更新

我意识到我并没有明确指出不适的问题会导致过度拟合。这是来自班加JRGáborA的报价。生物系统动态模型的鲁棒有效参数估计。BMC系统生物学。2015; 9:74。doi:10.1186 / s12918-015-0219-2:

这些问题的病态通常源于(i)具有大量参数的模型(过度参数化),(ii)实验数据稀缺和(iii)重大测量误差[19,40]。结果,我们经常获得这种动力学模型的过度拟合,即,与现有数据具有合理拟合但校正能力差(低预测值)的校准模型

因此,我的论点可以说如下:

  • 不适的问题导致过度拟合
  • (n <p)情况是一个极端不适的逆问题
  • 您在问题中称为 Moore-Penrose伪逆(或其他工具,如SVD)解决了不适定的问题X+
  • 因此,它至少在一定程度上会过度拟合,并且它不会完全失效也就不足为奇了,这与常规的OLS应该

同样,正则化仍然是一个更强大的解决方案。


1
(+1)谢谢,但是我不太明白本文的相关性。明天我会详细介绍。他们到底在哪里说最小规范OLS解决方案不会过拟合,或者最小规范要求可以看作是正则化?
变形虫说恢复莫妮卡

1
让我们讨论一下您阅读本文时的情况。他们没有说伪逆是正则化。他们说的是解决不适的问题。我的意思是说,过度拟合是由于问题的不适性所致,所以通过解决后者,您可以照顾到前者,尽管不如正规化。
阿克萨卡族人

1
我认为令人费解的不是最小范数解决方案在某种程度上没有缓解过度拟合的问题,而是增加更多的正则化并不能进一步改善情况。另外,为什么随着功能数量的增加,最小范数解决方案更有效。我的直觉是,具有更多参数的问题需要更多的正则化(在所有其他方面都相等)而不是更少。这是一个非常有趣的问题,可能有助于解释为什么即使是非规则神经网络也无法像您期望的那样过度拟合。
迪克兰有袋动物

1
@Dikran实际上,其他形式或正则化仍然可以改善性能:例如,我可以通过主成分回归或弹性网来改善性能(与最小范数OLS相比)。只是岭正则化变得毫无用处。与神经网络的类比是一个令人着迷的想法,至今还没想到。不过,我最近想的是,难怪没有人能理解为什么批处理归一化之类的棘手的深度学习真正起作用,因为即使统计数据101中的线性岭回归也是如此令人困惑:-)
阿米巴说Reinstate Monica

2
这不是眼前的主要问题,但我认为,通过进行交叉验证,本来可以解决问题的一系列优秀问题,答案和评论却步履蹒跚。对于此讨论,从用于模拟数据的来计算总体线性预测变量,并计算线性预测变量的任何估计量的MSE 会容易得多。而且我看到了这样一种情况:对于我找不到针对岭回归(R 包函数)的最佳校正AIC 。但是我需要使用真正的线性预测变量作为黄金标准来重新运行它。Ñ < < pβn<<prmsols
Frank Harrell '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.