我正在尝试使用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对象的方法。
答案 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)
在这里你可以看到对应于左边虚线的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)