注意:经过大量的代码试验,我完全重写了这个问题
我正在尝试在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