glmnet,多项式预测返回对象

时间:2018-02-10 04:57:44

标签: r predict glmnet lasso

我正在尝试使用glmnet进行分类预测,但是我不能推断出" glmnet.predict"的返回对象是什么。应该代表。使用代码

mlogit_r<-glmnet(train_x, cbind(cns_label, renal_label,breast_label,nsclc_label,ovarian_label,leuk_label,colon_label, mela_label),
            family="multinomial", alpha=0)
pred <- predict(mlogit_r, train_x, type="class")

,train_x为57(n)×6830(p),y对象为57(n)×8(num类)。返回的预测对象是带有标签的57 x 100矩阵。以下哪些是预测标签?

它没有在文档中显示,因为它只是说

  

返回的对象取决于。 。 。传递给的论证   预测glmnet对象的方法。

1 个答案:

答案 0 :(得分:2)

当您在不指定lambda值的情况下拟合glmnet模型时,默认情况下,包含100个lambda值的范围是合适的。当你在没有指定lambda的情况下在这样的模型上调用预测时,会对所有lambda进行预测,因此你会从100个不同的模型中获得100个不同的预测。

通常会运行交叉验证以选择一个最佳的lambda然后使用它进行预测:

library(glmnet)
data(iris)

让我们使用120行进行培训:

z <- sample(1:nrow(iris), 120)

现在使用未命中分类错误运行5倍交叉验证,以选择最佳lambda:

cv_fit <- cv.glmnet(as.matrix(iris[z,-5]),
                   iris[z,5],
                   nfolds = 5,
                   type.measure = "class",
                   alpha = 0,
                   grouped = FALSE,
                   family = "multinomial")

plot(cv_fit)

enter image description here

在这里你可以看到对应于左边虚线的lambda.min(5倍交叉验证中具有最低错误的lambda)和lambda.1se(lambda,误差为1 se,其附近的误差最小)右边。

这些值位于:

cv_fit$lambda.min
#[1] 0.05560455

cv_fit$lambda.1se
#[1] 0.09717054

现在,当你知道最好的lambda时,你可以在100个lambda值上建立一个模型:

fit <- glmnet(as.matrix(iris[z,-5]),
              iris[z, 5],
              alpha = 0,
              family = "multinomial")

并预测特定的一个:

predict(fit, as.matrix(iris[-z,-5]), s = cv_fit$lambda.min, type = "class")

或在一个lambda上构建模型

fit1 <- glmnet(as.matrix(iris[z,-5]),
              iris[z, 5],
              alpha = 0,
              lambda = cv_fit$lambda.min,
              family = "multinomial")

并预测而不指定lambda:

all.equal(as.vector(predict(fit, as.matrix(iris[-z,-5]), s = cv_fit$lambda.min, type = "class")),
          as.vector(predict(fit1, as.matrix(iris[-z,-5]), type = "class")))

#TRUE

要查看系数受约束的程度,您可以绘制模型和使用的lambda:

plot(fit, xvar = "lambda")
abline(v = log(cv_fit$lambda.min), lty = 2)

enter image description here