我想将我的弹性网模型与非规则化模型进行比较。为了公平和简单起见,我想使用glmnet
包来训练这两个模型。然而,我最近发现glmnet
在一些数据集上覆盖了lambda=0
。
如何强制glmnet
表现得像glm
?
x <- structure(c(0.028, 0.023, 0.0077, 0.14, 0.027, 0.084, 0.018,
0.055, 0.0089, 0.016, 0.037, 0.043, 0.046, 0.031, 0.034, 0.056,
0.016, 0.048, 0.013, 0.02, 0.067, 0.046, 0.058, 0.054, 0.036,
0.043, 0.009, 0.12, 0.024, 0.018, 0.066, 0.046, 0.057, 0.054,
0.036, 0.043, 0.009, 0.12, 0.024, 0.018, 0.051, 0.043, 0.047,
0.045, 0.034, 0.04, 0.009, 0.085, 0.022, 0.016, 0.028, 0.023,
0.0089, 0.14, 0.028, 0.084, 0.02, 0.055, 0.0089, 0.016, 0.067,
0.049, 0.058, 0.055, 0.038, 0.043, 0.009, 0.12, 0.024, 0.018,
0.067, 0.046, 0.058, 0.054, 0.036, 0.043, 0.009, 0.12, 0.024,
0.018), .Dim = c(10L, 8L), .Dimnames = list(NULL, NULL))
y <- gl(2, 5)
fit <- glmnet::glmnet(x, y, family = "binomial", lambda = 0)
fit$lambda # should be 0 but actually infinity
Warning messages:
1: In lognet(xd, is.sparse, ix, jx, y, weights, offset, alpha, nobs, :
one multinomial or binomial class has fewer than 8 observations; dangerous ground
2: from glmnet Fortran code (error code -1); Convergence for 1th lambda value not reached after maxit=100000 iterations; solutions for larger lambdas returned
3: In getcoef(fit, nvars, nx, vnames) :
an empty model has been returned; probably a convergence issue
在您的示例中,一些预测因子高度相关,例如在3、4、7、8之间,其值基本相同:
round(cor(x),3)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1.000 0.308 0.290 0.294 0.330 1.000 0.292 0.290
[2,] 0.308 1.000 0.653 0.652 0.730 0.306 0.660 0.653
[3,] 0.290 0.653 1.000 1.000 0.989 0.285 0.999 1.000
[4,] 0.294 0.652 1.000 1.000 0.989 0.290 0.999 1.000
[5,] 0.330 0.730 0.989 0.989 1.000 0.325 0.992 0.989
[6,] 1.000 0.306 0.285 0.290 0.325 1.000 0.287 0.285
[7,] 0.292 0.660 0.999 0.999 0.992 0.287 1.000 0.999
[8,] 0.290 0.653 1.000 1.000 0.989 0.285 0.999 1.000
惩罚回归的目的之一是减少相关变量并改进回归。来自glmnet vigete:
众所周知,山脊惩罚使相互关联的预测因子,而套索倾向于选择其中一个丢弃其他的。弹性网罚混合这两个:如果预测因子在组中相关,则an=0.5倾向于选择或忽略整个特征组。这是一个更高级别的参数,用户可以预先选择一个值,或者用几个不同的值进行实验。的一个用法是用于数字稳定性例如,对于一些较小的>0的性能与套索非常相似,但删除了任何退化和由极端相关性引起的疯狂行为。
如果将lambda设置为0,将很难达到收敛,因为如何确定高度相关变量的系数?在这篇文章中,你可以将thres
设置为一个小值,但我怀疑它在你的情况下是否有效,因为相关性太高了。
为了证明这一点,让我们把x改为随机正规矩阵,你可以看到它收敛:
fit = glmnet::glmnet(matrix(rnorm(80),ncol=8), y, family = "binomial", lambda = 0)
Call: glmnet::glmnet(x = matrix(rnorm(80), ncol = 8), y = y, family = "binomial", lambda = 0)
Df %Dev Lambda
1 8 100 0
总之,我想谈谈比较的目的。如果你有很多预测因素,很多都是相关的,那么很明显,非规则回归的表现会很差,说明了glmnet
这样的情况。你可以用glm
来证明你的观点。否则,请考虑删除高度相关的预测因子。