在 Shiny 中使用 predict 和 randomForest 时出错

Errors in using predict with randomForest in Shiny

提问人:Hack-R 提问时间:1/13/2015 最后编辑:Hack-R 更新时间:1/22/2015 访问量:710

问:

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

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

我有一个分类器,我已经在 taining 数据集上进行了训练,并在验证数据集上进行了验证。这是在我在 github 上的文件中完成的,对象被保存为 ,由 读取)。randomForestanalysis.Rrf.rdsserver.R

在我读入称为(即)的训练数据,然后仅将第一行提取到 .server.Rxx.rdsuserdf

在“我允许用户输入响应式更新此对象的值”中: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)})

并观察这些值在我的 UI 中精美更新。

但是,当我尝试运行以下代码来为用户运行预测时,我收到一条错误消息,指出存在 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))
                      }
                      })

即使我“知道”数据不是来自通过上述行观看更新,并且由于来自的所有初始值都不是.我也尝试过没有陈述的一部分。NAvalues$dfui.RxNAdata.framepredict

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

同样有趣的是,如果我在语句中替换为,那么一切都运行良好(是非反应式对象)。ds1userdfpredictuserdf

如果我用它替换语句,它不会显示任何不匹配的列名(直到添加上述语句,由于在反应式数据帧的列名中对 to 进行了一些奇怪的转换)。predictsetdiff(colnames(x), colnames(ds1))colnames_.

最后,我发现如果我从via访问名称,我会得到“”作为我的错误:rfrf$forest$ncatincorrect 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

r 闪亮 的随机森林

评论

0赞 MrFlick 1/13/2015
请创建一个最小的、可重复的例子。你的例子似乎并不小。这将有助于隔离错误。你在 Shiny 之外有这个工作吗?
2赞 John Paul 1/13/2015
@Hack-R 1)一旦你做了一个东西,它就已经是反应性的了,所以你不要把东西包装在or中。2) 您的错误可能是由于中使用的列名和您用于获取的数据不同。你最初用来获取的代码是什么?reactiveValuesnewEntryrunmodelobserversuserdata()rfrf
2赞 Hack-R 1/14/2015
@MrFlick 我已经创建了一个全新的、可克隆的 github 存储库,其中包含此错误/应用程序的绝对最小版本。请看一下。
3赞 John Paul 1/15/2015
@Hack-R:声明是怎么回事?看起来你先给一个 ,然后用字符向量覆盖它们,使用 这是你想要的还是你只想拥有与 相同的名称?colnamesdata.frameds1ds1<-colnames(x)ds1x
2赞 MrFlick 1/15/2015
这条线是怎么回事?也就是说,将 data.frame 替换为字符向量。把它拿出来,预测应该有效。newdata= 参数必须是 data.frame。ds1 <- colnames(x)ds1

答: 暂无答案