在使用随机森林模型进行预测以合并回原始数据帧时,我试图在行上保留一个 ID。我在配方中使用 step_naomit,它在烘焙训练数据时删除了缺少数据的行,但也删除了测试数据中缺少数据的记录。不幸的是,我没有 ID 可以轻松知道哪些记录被删除,因此我可以准确地合并回预测。
我试图在原始数据中添加一个 ID 列,但是 bake 会删除公式中未包含的任何变量(并且我不想在公式中包含 ID)。我还认为我可以保留原始表中的 row.names 以进行合并,但似乎 row.name 在烘焙时也会重置。
我意识到我可以在配方之前删除 NA 值来解决这个问题,但是配方中 step_naomit 的意义何在?我还在 step_naomit 中尝试了 skip=TRUE,但随后在拟合模型时出现丢失数据的错误(仅适用于随机森林)。我觉得我在 tidymodels 中遗漏了一些可以让我在烘焙之前保留所有行的东西?
参见示例:
## R 3.6.1 ON WINDOWS 10 MACHINE
require(tidyverse)
require(tidymodels)
require(ranger)
set.seed(123)
temp <- iris %>%
dplyr::mutate(Petal.Width = case_when(
round(Sepal.Width) %% 2 == 0 ~ NA_real_, ## INTRODUCE NA VALUES
TRUE ~ Petal.Width))
mySplit <- rsample::initial_split(temp, prop = 0.8)
myRecipe <- function(dataFrame) {
recipes::recipe(Petal.Width ~ ., data = dataFrame) %>%
step_naomit(all_numeric()) %>%
prep(data = dataFrame)
}
myPred <- function(mySplit,myRecipe) {
train_set <- training(mySplit)
test_set <- testing(mySplit)
train_prep <- myRecipe(train_set)
analysis_processed <- bake(train_prep, new_data = train_set)
model <- rand_forest(
mode = "regression",
mtry = 3,
trees = 50) %>%
set_engine("ranger", importance = 'impurity') %>%
fit(Sepal.Width ~ ., data=analysis_processed)
test_processed <- bake(train_prep, new_data = test_set)
test_processed %>%
bind_cols(myPrediction = unlist(predict(model,new_data=test_processed)))
}
getPredictions <- myPred(mySplit,myRecipe)
nrow(getPredictions)
## 21 ROWS
max(as.numeric(row.names(getPredictions)))
## 21
nrow(testing(mySplit))
## 29 ROWS
max(as.numeric(row.names(testing(mySplit))))
## 150