当缺少数据时,使用 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.excludena.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(.) 将返回 FALSEcase_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 随机森林预测新数据的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用随机森林预测的不同结果

使用随机森林模型提高预测新数据的速度

在 R 中使用随机森林进行时间序列预测

随机森林预测

随机森林算法怎么提高预测数据的准确率

如何将经过训练和测试的随机森林模型应用于 tidymodels 中的新数据集?