首页 > 解决方案 > 为什么使用 glmnet 模型时 R 中的“预测”会返回高维预测?

问题描述

这是一个重现该问题的小示例:

model <- glmnet(matrix(rnorm(3*100), 100, 3), rbernoulli(100))
preds <- predict(model, matrix(rnorm(3*100), 100, 3))
dim(preds)
# 100 60

但由于预测变量是伯努利,我希望输出是 1 维或 2 维(1每个类别的概率或概率)。

我查看了 forglmnet和 for的文档,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函数似乎是通用的,尽管它显然对于两个二进制分类器的行为不同。

标签: rmachine-learningglmglmnet

解决方案


在 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

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

因此,如果您要从 python 转移到 R 来执行应用机器学习任务,最好利用caret 包,它是一个在统一建模方法下结合多个统计模型的同构框架。


推荐阅读