繁体   English   中英

当缺少数据时,使用 R 随机森林预测新数据

[英]Predict on new data with R random forest when there are missing data

我想预测包含 NA 行的新数据。 我需要保持这些行在输入数据和预测输出中具有相同的行数。 如何使用经过 R Caret 训练的随机森林 model 来做到这一点? 我为 predict function 的参数 na.action 尝试了不同的值,例如:

predictions = predict(RF_model, newdata = newdata, type = "prob", na.action = "na.exclude")

使用na.excludena.omit删除行。 使用na.pass我有一个错误 output “缺失值”。

编辑:model 已经过训练,我们正在谈论对全新数据的预测,其中一些并不好。 我知道我们无法预测这些不良数据,但我需要跟踪这些行。

我想我明白你想要什么。 您想使用经过训练的 model 并对可能缺少值的新数据进行预测。 您不希望估算缺失值,而是希望那些具有缺失值的行的预测值为NA

这是一种方法。 我什至可以保持原来的行顺序。 假设您的新数据位于名为new_data的 data.frame 中,您训练的随机森林 model 名为my_forest 将这些替换为您的对象的名称。 我还假设回归 model。 如果这是一个分类问题,请告诉我,我可以更改代码。

这是解释我们正在做什么的分步方法。

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 工具的模式代码高效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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM