【问题标题】:glmnet, multinomial prediction returned objectglmnet,多项预测返回对象
【发布时间】:2018-02-10 04:57:43
【问题描述】:

我正在尝试使用 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) x 6830(p),y 对象为 57(n) x 8(类数)。返回的预测对象是一个带有标签的 57 x 100 矩阵。其中哪些是预测的标签?

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

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

【问题讨论】:

  • 出于好奇,您将 glmnet 多项式预测用于什么目的?
  • @OLIVER.KOO 我正在他们的样本数据集“NCI(微阵列)”上尝试与“统计学习的要素:数据挖掘、推理和预测。第二版”不同的方法,该方法处理识别不同癌症的基因。
  • 哇 @user3707850 听起来超级酷。我可以向你借那本书吗?

标签: r predict glmnet lasso-regression


【解决方案1】:

当您在不指定 lambda 值的情况下拟合 glmnet 模型时,默认情况下会拟合包含 100 个 lambda 值的范围。当您在未指定 lambda 的情况下对此类模型调用 predict 时,将对所有 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(误差为 1 se 的 lambda,其附近的误差最小)右边。

这些值位于:

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)

【讨论】:

  • 这是一个有用的答案,谢谢!当我设置dfmax 值时,您是否知道type=class 会返回什么? predict() 的返回值仍然是一个矩阵,ncols 似乎会根据 dfmax 而有所不同。假设我设置了dfmax=10;根据您的回答,这些列似乎对应于所有 lambdas,导致模型具有 10 个或更少特征的非零系数。你认为这是正确的吗?
  • 很高兴我能帮上忙。 dfmax 限制特征的数量,因此正则化参数可以至少与选择 dfmax 中指定的最大特征数量一样小。是的,我认为你是对的。话虽如此,如果我想优化预测准确性,我会避免使用 dfmax 参数。
  • 谢谢!我需要约束 dfmax 值,因为我需要将模型约束到固定数量的术语。尽管设置该值似乎并不总是有效(我看到另一个 SO 线程也提到了这一点:stats.stackexchange.com/questions/114128/…)。
  • 基于该线程(以及 Hong Ooi 的评论),看起来 pmax 是您的解决方案。当我查看glmnet 的帮助文件时,这是有道理的。
  • 谢谢!我想我可能会发布一个关于这些参数的新问题 - 在family='multinomial' 的情况下,我发现它们有点令人困惑。
猜你喜欢
  • 2012-03-09
  • 2014-09-28
  • 2022-07-22
  • 2019-05-28
  • 2018-09-11
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 2018-12-18
相关资源
最近更新 更多