GLMnet 中的截距是如何计算的?

机器算法验证 r 套索 正则化 网络 弹性网
2022-03-18 10:06:37

我一直在使用 R 以外的其他软件实现 GLMNET 版本的弹性网络进行线性回归。我将我的结果与糖尿病数据的套索模式下的 R 函数 glmnet 进行了比较。

当改变参数(lambda)的值时,变量选择是可以的,但我得到的系数值略有不同。由于这个和其他原因,我认为它来自更新循环中的截距,当我计算当前拟合时,因为我不改变整个算法中的截距(我将其作为目标变量的平均值):如Trevor Hastie 的文章(Regularization Paths for Generalized Linear Models via Coordinate Descent,第 7 页,第 2.6 节)中解释了:

截距未正则化,[...] 对于 [...] lambda [L1 约束参数] 的所有值

但是尽管有文章,R 函数 glmnet 确实为正则化路径上的截距提供了不同的值(lambda 不同的值)。有没有人知道如何计算 Intercept 的值?

2个回答

我发现 GLMnet 中的截距是在新系数更新收敛后计算的。截距是用的平均值和的平均值计算的。该公式与我给出的前一个公式相似,但在更新循环之后yixijβjβ0=y¯j=1pβj^xj¯

在python中,这给出了类似的东西:

        self.intercept_ = ymean - np.dot(Xmean, self.coef_.T)

scikit-learn 页面上找到的。

编辑:系数必须在之前标准化:

        self.coef_ = self.coef_ / X_std

β0=y¯j=1pβj^xj¯i=1nxij2

我把它作为目标变量的平均值

我认为这可能是你出错的地方:与线性模型不同,你不能重新参数化预测变量,使它们总是与截距正交,因此截距不能仅仅计算为平均值。