当缺少数据时,使用 R 随机森林预测新数据
Posted
技术标签:
【中文标题】当缺少数据时,使用 R 随机森林预测新数据【英文标题】:Predict on new data with R random forest when there are missing data 【发布时间】:2021-06-19 02:28:37 【问题描述】:我想预测包含 NA 行的新数据。 我需要保持这些行在输入数据和预测输出中具有相同的行数。 如何使用 R Caret 训练的随机森林模型来做到这一点? 我为 predict 函数的参数 na.action 尝试了不同的值,例如:
predictions = predict(RF_model, newdata = newdata, type = "prob", na.action = "na.exclude")
使用na.exclude
和na.omit
,行将被删除。使用na.pass
,我得到一个错误输出“缺失值”。
编辑:模型已经过训练,我们正在谈论对全新数据的预测,其中一些并不好。我知道我们无法预测这些不良数据,但我需要跟踪这些行。
【问题讨论】:
这是数据科学中的常见问题。您想要做的是估算缺失值,但有多种策略可供选择。在您的情况下(或任何情况下)哪个是最好的不是 Stack Overflow 的主题,因为它不是编程问题。但是,如果您有一个特定的插补方法,您正在努力在 R 中实现,那就是主题。 不,我不想估算缺失值,我想保留这些缺失值的行,以便用户知道数据不利于预测。所以问题是:如何在预测输出中有 NA。在这里,我的输入和输出具有不同的行数,然后我无法绑定我的数据框以向用户显示完整的结果。我认为使用na.exclude
可以解决问题,但事实并非如此。
【参考方案1】:
我想我明白你想要什么。您想采用经过训练的模型并对可能具有缺失值的新数据进行预测。对于那些缺失值的行,您希望预测值为NA
,而不是估算缺失值。
这是一种方法。我什至可以保持原来的行顺序。假设您的新数据位于名为 new_data
的 data.frame 中,而您经过训练的随机森林模型名为 my_forest
。将这些替换为您的对象的名称。我还假设一个回归模型。如果这是一个分类问题,请告诉我,我可以修改代码。
这是一个逐步说明我们在做什么的方法。
library(tidyr)
library(dplyr)
new_data <- new_data %>% rowid_to_column() # add column with rownumber
new_data_na <- new_data %>%
filter(!complete.cases(.)) # save those rows with NA in separate data.frame
new_data_complete <- new_data %>%
filter(complete.cases(.)) # keep only those rows with no NA
new_data_complete$predicted <- predict(my_forest, newdata = new_data_complete) # make predictions
new_data_na$predicted <- NA_real # ensure that that NA is the same data type
new_data_predicted <- rbind(new_data_na, new_data_complete) # bind rows
arrange(new_data_predicted, rowid) # return data to original order
这是使用dplyr
工具的一种模式代码高效管道方法。请注意这看起来多么简单。 case_when
结构使用complete.cases(.)
检查每一行的 NA 值。参数中的 .
告诉 complete.cases
使用所有列。如果没有 NA
值,complete.cases(.)
将返回 TRUE
,并在该行上运行预测。同样,newdata = .
用于告诉predict()
使用所有列。如果有一个或多个 NA
值,complete.cases(.)
将返回 FALSE
。 case_when
结构的第二行是当第一行不是TRUE
时的总称。如果第一行不是TRUE
,我们希望预测值返回NA
。请注意,此方法不涉及将数据分开,因此无需努力将其重新组合在一起。
library(dplyr)
new_data %>%
mutate(predicted = case_when(complete.cases(.) ~ predict(my_forest, newdata = .),
TRUE ~ NA_real_)
【讨论】:
亲爱的@Ben Norris,我试图重现您的示例,但由于 NA_real 对象似乎未定义,因此不存在,因此出现错误。我可能忘记了什么,或者是否有必要修复示例代码中的某些内容。提前致谢。 @JLLavin - 那是因为我的答案中有一个错字,几个月都没有被发现。指定 double 类型的 NA 值的正确方法是NA_real_
。注意末尾的额外下划线。
非常感谢您的解释!
当我在您的代码中使用 predict 时(使用我的 RandomForest 模型) predict(rfmodel, newdata = new_data_complete) 我收到以下错误: eval 中的错误(predvars, data, env) : object 'rowId ' 未找到可能是因为“rowId”列不在用于生成模型的变量/列中吗?还是与代码本身有关?提前感谢您的友好回答。 PD。我正在疯狂地试图找出一种方法来获取我的输入表的每一行的预测/标签,使用插入符号作为机器学习的 R 包。以上是关于当缺少数据时,使用 R 随机森林预测新数据的主要内容,如果未能解决你的问题,请参考以下文章