0

在预测选择一组二元互斥结果的概率的模型上使用 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)
4

1 回答 1

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")
于 2017-07-09T02:26:18.910 回答