缺少数据时使用 R 随机森林预测新数据
Predict on new data with R random forest when there are missing data
我想预测包含 NA 行的新数据。
我需要保持这些行在输入数据和预测输出中具有相同的行数。
我如何使用使用 R Caret 训练的随机森林模型来做到这一点?
我为预测函数的参数 na.action 尝试了不同的值,例如:
predictions = predict(RF_model, newdata = newdata, type = "prob", na.action = "na.exclude")
na.exclude
和 na.omit
行被删除。使用 na.pass
我得到错误输出“缺失值”。
编辑:模型已经过训练,我们正在谈论对全新数据的预测,其中一些并不好。我知道我们无法预测这些不良数据,但我需要跟踪这些行。
我想我明白你想要什么。您想要采用训练有素的模型并对可能有缺失值的新数据进行预测。对于那些具有缺失值的行,您希望预测值为 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(.)
return 和 TRUE
,预测将在该行上运行。同样,newdata = .
用于告诉 predict()
使用所有列。如果有一个或多个 NA
值,complete.cases(.)
将 return FALSE
。当第一行不是 TRUE
时,case_when
结构的第二行是一个包罗万象的东西。如果第一行不是TRUE
,我们希望预测值为returnNA
。请注意,此方法不涉及将数据分开,因此无需费力将其重新组合在一起。
library(dplyr)
new_data %>%
mutate(predicted = case_when(complete.cases(.) ~ predict(my_forest, newdata = .),
TRUE ~ NA_real_)
我想预测包含 NA 行的新数据。 我需要保持这些行在输入数据和预测输出中具有相同的行数。 我如何使用使用 R Caret 训练的随机森林模型来做到这一点? 我为预测函数的参数 na.action 尝试了不同的值,例如:
predictions = predict(RF_model, newdata = newdata, type = "prob", na.action = "na.exclude")
na.exclude
和 na.omit
行被删除。使用 na.pass
我得到错误输出“缺失值”。
编辑:模型已经过训练,我们正在谈论对全新数据的预测,其中一些并不好。我知道我们无法预测这些不良数据,但我需要跟踪这些行。
我想我明白你想要什么。您想要采用训练有素的模型并对可能有缺失值的新数据进行预测。对于那些具有缺失值的行,您希望预测值为 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(.)
return 和 TRUE
,预测将在该行上运行。同样,newdata = .
用于告诉 predict()
使用所有列。如果有一个或多个 NA
值,complete.cases(.)
将 return FALSE
。当第一行不是 TRUE
时,case_when
结构的第二行是一个包罗万象的东西。如果第一行不是TRUE
,我们希望预测值为returnNA
。请注意,此方法不涉及将数据分开,因此无需费力将其重新组合在一起。
library(dplyr)
new_data %>%
mutate(predicted = case_when(complete.cases(.) ~ predict(my_forest, newdata = .),
TRUE ~ NA_real_)