r-强制glmnet表现得像glm



我想将我的弹性网模型与非规则化模型进行比较。为了公平和简单起见,我想使用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来证明你的观点。否则,请考虑删除高度相关的预测因子。

相关内容

  • 没有找到相关文章

最新更新