рецепты ::step_dummy caret::train -> Ошибка: присутствуют не все переменные в рецепте

#r #r-caret #r-recipes

#r #r-каретка #r-recipes

Вопрос:

Я получаю следующую ошибку при использовании recipes::step_dummy с кареткой ::train (первая попытка объединения двух пакетов):

Ошибка: Не все переменные в рецепте присутствуют в поставляемом обучающем наборе

Не уверен, что вызывает ошибку, и не знаю наилучшего способа отладки. Была бы очень признательна за помощь в обучении модели.

 library(caret)
library(tidyverse)
library(recipes)
library(rsample)

data("credit_data")

## Split the data into training (75%) and test sets (25%)
set.seed(100)
train_test_split <- initial_split(credit_data)
credit_train <- training(train_test_split)
credit_test <- testing(train_test_split)

# Create recipe for data pre-processing
rec_obj <- recipe(Status ~ ., data = credit_train) %>%
  step_knnimpute(all_predictors()) %>%
  #step_other(Home, Marital, threshold = .2, other = "other") %>%
  #step_other(Job, threshold = .2, other = "others") %>%
  step_dummy(Records)  %>% 
  step_center(all_numeric())  %>%
  step_scale(all_numeric()) %>%
  prep(training = credit_train, retain = TRUE) 

train_data <- juice(rec_obj)
test_data  <- bake(rec_obj, credit_test)

set.seed(1055)
# the glm function models the second factor level.
lrfit <- train(rec_obj, data = train_data,
                     method = "glm",
                     trControl = trainControl(method = "repeatedcv", 
                                              repeats = 5))
  

Ответ №1:

Не готовьте рецепт перед его отправкой train и используйте оригинальный обучающий набор:

 library(caret)
#> Loading required package: lattice
#> Loading required package: ggplot2
library(tidyverse)
library(recipes)
#> 
#> Attaching package: 'recipes'
#> The following object is masked from 'package:stringr':
#> 
#>     fixed
#> The following object is masked from 'package:stats':
#> 
#>     step
library(rsample)

data("credit_data")

## Split the data into training (75%) and test sets (25%)
set.seed(100)
train_test_split <- initial_split(credit_data)
credit_train <- training(train_test_split)
credit_test <- testing(train_test_split)

# Create recipe for data pre-processing
rec_obj <- 
  recipe(Status ~ ., data = credit_train) %>%
  step_knnimpute(all_predictors()) %>%
  #step_other(Home, Marital, threshold = .2, other = "other") %>%
  #step_other(Job, threshold = .2, other = "others") %>%
  step_dummy(Records)  %>% 
  step_center(all_numeric())  %>%
  step_scale(all_numeric()) 

set.seed(1055)
# the glm function models the second factor level.
lrfit <- train(rec_obj, data = credit_train,
               method = "glm",
               trControl = trainControl(method = "repeatedcv", 
                                        repeats = 5))
lrfit
#> Generalized Linear Model 
#> 
#> 3341 samples
#>   13 predictor
#>    2 classes: 'bad', 'good' 
#> 
#> Recipe steps: knnimpute, dummy, center, scale 
#> Resampling: Cross-Validated (10 fold, repeated 5 times) 
#> Summary of sample sizes: 3006, 3008, 3007, 3007, 3007, 3007, ... 
#> Resampling results:
#> 
#>   Accuracy   Kappa    
#>   0.7965349  0.4546223
  

Создано 2019-03-20 пакетом reprex (версия 0.2.1)

Комментарии:

1. В приложении большего масштаба я получаю сообщение «В [<-.factor ( *tmp* , !is_complete(data), значение = «Отсутствует»): недопустимый уровень фактора, сгенерирован NA», мне интересно, нужно ли мне как-то передать strings_as_factors= FALSE для обучения? Если я добавлю step_factor2string(all_nominal()) в качестве первого шага в рецепте, я больше не получаю сообщение об ошибке, — есть ли другой способ?

Ответ №2:

Кажется, вам все еще нужна формула в функции train (несмотря на то, что она указана в рецепте)?…

 glmfit <- train(Status ~ ., data = juice(rec_obj),
                     method = "glm",
                     trControl = trainControl(method = "repeatedcv", repeats = 5))
  

Комментарии:

1. Нет, проблема не в этом. train данные будут повторно подготовлены, поэтому потребуются исходные данные (не переработанная версия)