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

Jul*_*teV 5 r predict random-forest r-caret

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

predictions = predict(RF_model, newdata = newdata, type = "prob", na.action = "na.exclude")
Run Code Online (Sandbox Code Playgroud)

随着na.excludena.omit行被删除。我得到na.pass了一个错误输出“缺失值”。

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

Ben*_*ris 3

我想我明白你想要什么。您想要采用经过训练的模型并对可能存在缺失值的新数据进行预测。您希望预测值是NA针对具有缺失值的行,而不是估算缺失值。

这是一种方法。我什至可以保持原来的行顺序。假设您的新数据位于名为 data.frame 的数据框中new_data,并且您经过训练的随机森林模型名为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
Run Code Online (Sandbox Code Playgroud)

这是使用dplyr. 请注意这看起来多么简单。该case_when结构使用 来检查每一行的 NA 值complete.cases(.)。参数.中的 指示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_)
Run Code Online (Sandbox Code Playgroud)