代码之家  ›  专栏  ›  技术社区  ›  matsuo_basho

订阅分配中不允许NAs:预测概率错误

  •  0
  • matsuo_basho  · 技术社区  · 8 年前

    消息:“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)
    

    如你所见,问题是我的回答由两个变量组成。当我预测的行数少于训练集中的行数时,函数试图将训练集中的响应变量与测试集连接起来。

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

    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)
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Consistency    8 年前

    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")