r - 为什么使用 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
函数似乎是通用的,尽管它显然对于两个二进制分类器的行为不同。
解决方案
在 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 包,它是一个在统一建模方法下结合多个统计模型的同构框架。
推荐阅读
- flutter - 滚动视图内带有扩展小部件的颤振列
- azure - 无法在 Slack 中向机器人发送 DM。Bot 是使用 azure botframework 创建的,并使用了渠道集成
- pyinstaller - 微软后卫停止 pyinstaller
- android - Flutter 创建父目录失败
- arrays - 打印数组但突出显示特定值 {emu8086}
- microsoft-graph-api - 使用 curl 的 msgraph 客户端断言证书,如何生成断言
- css - Safari 13 中不支持网格模板列
- bokeh - 散景/面板不会与 Jupyter Lab 内联渲染
- bash - 如何理解 Bash 中被双引号包围的命令替换中的引号?
- c++ - 当矩阵值相同时,Needleman 算法不起作用