在Shiny中使用randomForest预测时出错

时间:2015-01-12 20:06:30

标签: r shiny random-forest

注意:经过大量的代码试验,我完全重写了这个问题

我正在尝试在1行数据对象中使用用户输入值来使用randomForest预测用户的类别,但是我收到错误,指示我的数据对象的NA / Inf值。

我有一个randomForest分类器,我已经在一个污染数据集上训练并在验证数据集上进行了验证。这是在github上的文件analysis.R中完成的,对象保存为rf.rds,由server.R读入。

server.R中,我读取了名为x的训练数据(即x.rds),然后仅将第一行提取到userdf

ui.R中,我让用户输入反应性更新此对象的值:

  values <- reactiveValues()
  values$df <- userdf
  newEntry <- observe({
      values$df$bron_badges <- input$bron_badges
      values$df$silv_badges <- input$silv_badges
      values$df$gold_badges <- input$gold_badges
      values$df$reputation  <- input$reputation
      values$df$views       <- input$views
      values$df$votes       <- input$votes
  })

这似乎有效。我这样说是因为我可以跑:

output$table <- renderTable({data.frame(values$df)})

并在我的界面中观看值的更新。

然而,当我尝试运行以下代码为用户运行预测时,我收到一条错误消息,说明有NA:

  output$results <- renderText({
                      {  ds1        <- values$df 
                         x          <- x[,sort(names(x))] 
                         ds1        <- ds1[,sort(names(ds1))] 
                         names(ds1) <- colnames(x)
                         predict(rf, newdata = data.frame(ds1))
                      }
                      })

即使我“知道”数据不是NA在上述行中通过values$df观看ui.R更新,并且因为所有初始值来自x的{​​{1}}不是NA。我也尝试过没有data.frame声明的predict部分。

有趣的是,如果我用predict替换上面的table(is.na(ds1))语句,它会告诉我所有1,033个值都是NA

同样有趣的是,如果我在ds1语句中用userdf替换predict,那么一切运行正常(userdf是非反应对象)。

如果我将predict语句替换为setdiff(colnames(x), colnames(ds1)),则它不会显示任何不匹配的列名(直到上面添加colnames语句才会显示,因为有些奇怪的转换反应数据框的同名中的_.。)

最后,我发现如果我通过rf访问rf$forest$ncat中的姓名,我会收到“incorrect number of dimensions”作为我的错误:

  output$results <- renderTable({
                      {  ds1        <- values$df 
                         cn         <- rf$forest$ncat
                         cn         <- cn[,sort(names(cn))] 
                         ds1        <- ds1[,sort(names(ds1))] 
                         names(ds1) <- names(cn)#x #rf$forest$xlevels
                         predict(rf, newdata = data.frame(ds1))
                      }
                      })

但是,通过以下修改:

  output$results <- renderTable({
                      {  ds1        <- values$df 
                         cn         <- as.data.frame(t(rf$forest$ncat))
                         cn         <- cn[,sort(names(cn))] 
                         ds1        <- ds1[,sort(names(ds1))] 
                         names(ds1) <- names(cn)#x #rf$forest$xlevels
                         predict(rf, newdata = data.frame(ds1))
                      }
                      })

我的错误可以追溯到“variables in the training data missing in newdata”。

最小,可重复的示例https://github.com/hack-r/troubleshooting_predictor_minimal

以下是完整的可重现代码和数据:https://github.com/hack-r/coursera_shiny

0 个答案:

没有答案