【发布时间】:2015-06-01 09:49:15
【问题描述】:
我正在开展一个项目,该项目将展示一组事件对结果的潜在影响。我正在使用 glmnet() 包,特别是使用泊松功能。这是我的代码:
# de <- data imported from sql connection
x <- model.matrix(~.,data = de[,2:7])
y <- (de[,1])
reg <- cv.glmnet(x,y, family = "poisson", alpha = 1)
reg1 <- glmnet(x,y, family = "poisson", alpha = 1)
**Co <- coef(?reg or reg1?,s=???)**
summ <- summary(Co)
c <- data.frame(Name= rownames(Co)[summ$i],
Lambda= summ$x)
c2 <- c[with(c, order(-Lambda)), ]
一开始用SQL从我的数据库中导入大量数据。然后我将其放入矩阵格式,并将响应与预测变量分开。
这就是我感到困惑的地方:我无法弄清楚 glmnet() 函数和 cv.glmnet() 函数之间的确切区别。我意识到 cv.glmnet() 函数是 glmnet() 的 k 倍交叉验证,但实际上这到底意味着什么?它们为 lambda 提供了相同的值,但我想确保我没有遗漏关于两者之间区别的重要信息。
我也不清楚为什么当我指定 alpha=1(应该是默认值)时它运行良好,但如果我忽略它就不行?
提前致谢!
【问题讨论】:
-
试试看
plot(reg)。 -
永远不要依赖 glmnet 的默认 lambda 序列! 臭名昭著的问题。始终提供您自己的序列。然后从
fit$lambda.min获取最佳 lambda 值,并在所有对predict()、coef()等的调用中将其与s=lambda.min参数一起使用。 -
@smci 为什么不使用 lambda.1se?正是这个被 predict() 使用
-
能否详细说明为什么不使用预定义的 lambda 以及如何选择更好的序列?
-
@smci 你能证实你关于默认 lambda 序列是垃圾的说法吗?除了我认为 glmnet 的作者知道他们在做什么之外,该序列从一个最大 lambda(其所有系数都保证为零)到一个非常小的一个(通常所有系数都进入模型)(当然取决于在你的矩阵的形状上),这很有意义 IMO。在我的情况下,它运行良好。是否有一些模型没有?
标签: r classification glm cross-validation glmnet