【问题标题】:NAs are not allowed in subscripted assignments: error in predicting probability下标作业中不允许使用 NA:预测概率错误
【发布时间】:2017-07-06 23:48:59
【问题描述】:

在预测选择一组二元互斥结果的概率的模型上使用 predict 时出现以下错误。使用 nnet 包的 multinom 函数。

predict.multinom(model_name, df.predict, "probs") 中的错误: 下标作业中不允许使用 NA 另外:警告 消息:“newdata”有 5 行,但找到的变量有 100 行

这是一个可重现的例子:

require(nnet)

response1 <- sample(runif(100))
response2 <- 1-response1
responses <- as.matrix(data.frame(response1 = response1, response2 = response2))

train <- data.matrix(data.frame(var1 = runif(100), var2 = runif(100)))

multinom.mod <- multinom(responses ~ train)

test.df <- data.frame(var1 = runif(5), var2 = runif(5))
predict.vec <- predict(multinom.mod, test.df)

如您所见,问题在于我的响应包含 2 个变量。看起来,当我预测的行数少于训练集中的行数时,该函数试图将训练集中的响应变量与测试集连接起来。

更新:

以下适用于新的预测集。但是,响应变量被视为分类变量,因此预测不正确:

require(nnet)

train <- data.frame(response1 = sample(runif(100)), response2 = 1-response1, var1 = runif(100), var2 = runif(100))

multinom.mod <- multinom(response1 + response2 ~ ., train, type = "probs")

test.df <- data.frame(var1 = runif(5), var2 = runif(5))

predict.vec <- predict(multinom.mod, test.df)

【问题讨论】:

  • 该错误消息意味着您传递给newdata 的任何内容都与公式中使用的名称不匹配,这通常意味着您打错了字,或者您在公式中使用了mydata$Y ~ mydataX1 + mydata$X2 之类的东西。你能展示用于拟合模型的代码和predict() 调用吗?
  • 用于拟合模型的代码为:fit_retail
  • 另外,如果names(df.logit.model.ready)==names(data.frame(train_))的结果(其中df.logit.model.ready是预测df,train_是训练df)都是TRUE,那么列名怎么可能不匹配?
  • 提问时,您应该向reproducible example 提供示例输入数据,以便我们运行并测试代码以查看发生了什么。
  • @MrFlick,添加了一个可重现的示例

标签: r na predict nnet


【解决方案1】:

如果您想预测每个响应类别的概率,您应该使用:

predict.vec <- predict(multinom.mod, test.df, type = "probs")

否则,默认情况下预测在课堂上,type = class

更新,一个完整的用法(训练和预测)应该是这样的:

require(nnet)

response1 <- sample(runif(100))
response2 <- 1 - response1

train <- data.frame(var1 = runif(100), var2 = runif(100))
# train with matrix
responses <- cbind(response1, response2)
multinom.mod <- multinom(responses ~ var1 + var2, train, type = "probs")
# train with category
train$response <- ifelse(response1 > response2, "response1", "response2")
multinom.mod1 <- multinom(response ~ var1 + var2, train)

test.df <- data.frame(var1 = runif(5), var2 = runif(5))
# no matter which training method you use,
# you can predict class (default) or probability
predict.cvec <- predict(multinom.mod, test.df, type = "class")
predict.pvec <- predict(multinom.mod, test.df, type = "probs")

predict.cvec1 <- predict(multinom.mod1, test.df, type = "class")
predict.pvec1 <- predict(multinom.mod1, test.df, type = "probs")

【讨论】:

  • 问题在于,如果训练集是数据帧,模型会将响应视为分类响应,即使在 multinom 函数中指定 type="probs" 作为参数时也是如此。这与文档一致:回归模型的公式表达式,形式为 response ~ predictors。响应应该是具有 K 列的因子或矩阵,这将被解释为每个 K 类的计数。
  • 好的,我想我明白你的问题了。您更新中的模型训练方法不正确。我将在解释如何使用该命令时对我的答案进行编辑。
  • 这太好了,非常感谢!这么小的修复程序解决了一个耗费大量时间的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
相关资源
最近更新 更多