【发布时间】:2019-05-28 14:53:38
【问题描述】:
这是一个重现问题的小例子:
model <- glmnet(matrix(rnorm(3*100), 100, 3), rbernoulli(100))
preds <- predict(model, matrix(rnorm(3*100), 100, 3))
dim(preds)
# 100 60
但由于预测变量是伯努利,我希望输出是一维或二维(1 的概率,或每个类别的概率)。
我查看了glmnet 和predict 的文档,但找不到任何描述这种行为的内容。我正在寻找的是简单地将模型拟合到一些训练数据,然后计算类概率以便我可以计算 AUC。
我主要是询问这种行为,因为例如,如果我将 rpart 包与predict 一起使用,则不会发生这种情况,例如
df <- data.frame(cbind(matrix(rnorm(3*100), 100, 3), rbernoulli(100)))
model <- rpart(X4 ~ ., df)
length(predict(model, data.frame(matrix(rnorm(3*100), 100, 3))))
# 100, as expected
由于来自 Python,我发现很多这样的东西令人困惑,因为 predict 函数似乎是通用的,尽管它对于两个二元分类器的行为显然不同。
【问题讨论】:
-
看起来您正在获得对多个 lambda 值的预测——如果您想要一个预测,您需要选择一个 lambda 值,即 cv.glmnet
-
我没有答案,但相关文档不在
?predict,而是在?predict.glmnet。根据 user20650 的评论,s参数似乎相关! -
?predict.glmnet提供predict(object, newx, s = NULL, type=c("link","response","coefficients","nonzero","class"), exact = FALSE, newoffset, ...)。然后,对于s:Value(s) of the penalty parameter lambda at which predictions are required. Default is the entire sequence used to create the model.因为你没有提供s,所以默认情况下在glmnet生成的每个lambda 上运行predict。 -
感谢大家的回复,虽然我有点困惑。 lambda不应该在训练时确定吗?
-
@JakubArnold 如第一条语句所述,您应该使用
cv.glmnet而不是glmnet来确定最佳 lambda。
标签: r machine-learning glm glmnet