【问题标题】:Why does `predict` in R when using a glmnet model return a high dimensional prediction?为什么使用 glmnet 模型时 R 中的“预测”会返回高维预测?
【发布时间】: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 的概率,或每个类别的概率)。

我查看了glmnetpredict 的文档,但找不到任何描述这种行为的内容。我正在寻找的是简单地将模型拟合到一些训练数据,然后计算类概率以便我可以计算 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, ...)。然后,对于sValue(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


【解决方案1】:

在 R 中,您会发现许多示例,在这些示例中,您会根据函数输入的维度/类等获得输出。

对于glmnet,默认情况下您提供一系列 lambda:

lambda(即收缩因子)是正则化回归模型(glmnet)的超参数。

set.seed(1)
model <- glmnet(matrix(rnorm(3*100), 100, 3), purrr::rbernoulli(100))
preds <- predict(model, matrix(rnorm(3*100), 100, 3))

dim(preds)
#[1] 100  61

length(model$lambda)
[1] 61

您需要根据所需的性能指标对其进行调整,以找到适合您模型的最佳/最佳值。拥有它后,您可以使用它来获得最终预测。类似的东西:

model <- glmnet(matrix(rnorm(3*100), 100, 3), purrr::rbernoulli(100), 
                lambda = 0.19)        # assuming its an optimal value
preds <- predict(model, matrix(rnorm(3*100), 100, 3))

dim(preds)
# [1] 100   1

虽然rpart 默认情况下不需要超参数,因为它无需修剪即可拟合完整的树,这相当于提供与拟合数据对应的单个超参数值直到叶节点。因此,您获得了一组预测。使用当前分类器的缺点是它没有泛化。

因此,如果您从 python 转移到 R 来执行应用机器学习任务,最好利用 caret package,它是一个在统一建模方法。

【讨论】:

    猜你喜欢
    • 2014-03-15
    • 2020-11-04
    • 1970-01-01
    • 2020-09-12
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多