为什么在使用glmnet模型时R中的`predict`会返回高维预测?

时间:2019-01-01 19:09:29

标签: r machine-learning glm glmnet

这是一个重现此问题的小例子:

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

但是由于预测变量是bernoulli,我希望输出是一维或二维的(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函数似乎很笼统,尽管它在两个二进制分类器上的表现方式显然有所不同,但我发现其中很多令人困惑的地方。

1 个答案:

答案 0 :(得分:1)

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

对于String monomialRegex = "(-?\\d+(?:\\.\\d*)?x#-?\\d+(?:\\.\\d*)?\\$)"; String completeRegex = monomialRegex + "×" + monomialRegex + "÷" + monomialRegex; ,默认情况下,您提供一系列lambda:

λ(即收缩系数)是正则化回归模型(glmnet)的超参数。

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 默认情况下不需要超参数,因为它适合完整的树而无需修剪,这等效于提供一个与拟合数据相对应的单个超参数值,直到叶节点为止。因此,您将获得一组预测。使用当前分类器的不利之处在于它没有被概括。

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