#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
данные будут повторно подготовлены, поэтому потребуются исходные данные (не переработанная версия)