GLMnet - “非标准化”线性回归系数

机器算法验证 标准化 网络
2022-03-26 16:03:09

在执行线性回归时,GLMnet 显然标准化了因变量 (y) 向量在运行回归之前具有单位方差,然后对得到的截距和系数进行非标准化。我假设标准化是通过划分每个yi由标准差y向量。

如果我使用预先标准化的方式运行 glmnety如何取消标准化结果方程?

(请注意,我目前正在预先标准化的 x 变量上运行我的程序/GLMnet,因此我不必担心反转 GLMnet 也执行的 x 变量标准化。)

我认为我可以通过将每个系数和截距乘以标准差来简单地取消标准化y向量。这不起作用- “非标准化”方程与我使用相同的非标准化运行 glmnet 时得到的结果不匹配y. 乘以标准偏差的唯一时间是当我使用lambda=0运行 glmnet 时。(这有效地将程序作为普通的最小二乘拟合运行。)

我正在用另一种语言重新创建 glmnet 作为练习。当我在预标准化上运行我的程序和 glmnet 时y,我得到相同的结果。我没有得到相同的结果y没有预先标准化。

我关于标准化的信息来自glmnet vignette

“请注意,对于“family=gaussian”,glmnet 在计算其 lambda 序列之前将 y 标准化为具有单位方差(然后对结果系数进行非标准化);如果您希望使用其他软件重现/比较结果,最好先提供标准化的 y (使用“1/N”方差公式)。”

2个回答

这主要是仔细计算数学的情况。我将处理两个预测器+拦截器的情况,应该清楚如何概括它。

标准化弹性网模型导致以下关系:

yμ(y)σ(y)=β1x1μ(x1)σ(x1)+β2x1μ(x1)σ(x1)

如果你非常小心地移动术语,直到只有y在左边,你会得到

y=β1σ(y)σ(x1)x1+β2σ(y)σ(x2)x2(β1μ(x1)σ(x1)+β2μ(x2)σ(x2))σ(y)+μ(y)

它给出了标准化和非标准化系数之间的关系。

这是一个快速演示,您可以使用它进行测试

X <- matrix(runif(100, 0, 1), ncol=2)
y <- 1 -2*X[,1] + X[,2]

Xst <- scale(X)
yst <- scale(y)

enet <- glmnet(X, y, lambda=0)

enetst <- glmnet(Xst, yst, lambda=0)
coef <- coefficients(enetst)

# Un-standardized betas
coef[2]*sd(y)/sd(X[,1]) # = -2
coef[3]*sd(y)/sd(X[,2]) # = 1

# Unstandardized intercept (= 1)
-(coef[2]*mean(X[,1])/sd(X[,1]) + coef[3]*mean(X[,2])/sd(X[,2]))*sd(y) + mean(y)

GLMnet 在计算线性回归系数时遵循的过程似乎如下:

标准化每个x通过减去平均值并除以标准偏差(在计算标准偏差时,除以N, 不是N1)。

标准化y通过除以其标准偏差(再次用'除以N' 公式)。

通过将其除以计算的标准偏差来更改目标 lambday.

计算βs 使用http://www.jstatsoft.org/v33/i01/paper中的公式。

不规范βs 在马修的答案中使用公式的变体。请注意,由于您没有减去y您不需要在最后添加它。

要计算截距,请使用非标准化βs 和非标准化xys。取平均值y并且每个x. 公式为:

intercept=y¯βx¯