Проблема с подбором модели в Tidymodels: Ошибка: ! Невозможно использовать NA в качестве индекса столбца с `[` в позициях 3 и 4:\

Пишу проект на Tidymodels. Я создал набор train и test, разложил recipe и model. Когда я вызываю workflow(), добавляю recipe и model, затем вызываю fit(data = df_train, я получаю следующую ошибку.

Error:
! Can't use NA as column index with `[` at positions 3 and 4.

Я использую R версии 4.1.3 и R Studio 2022.02.0 Build 443.

Для воспроизводимости вот рабочий процесс. Обратите внимание, что данные находятся на GitHub, поэтому для загрузки данных вам потребуется подключение к Интернету.

## Load package manager

if (!require(pacman)){
  
  install.packages("pacman")
  
}

## Load required packages. Download them if they do not exist in my system.

pacman::p_load(tidyverse, kableExtra, skimr, knitr, glue, GGally, 
               
               corrplot, tidymodels, themis, stargazer, rpart, rpart.plot, 
               
               vip, patchwork, data.table)

Следующим шагом будет загрузка данных.

df <- fread('https://raw.githubusercontent.com/Karuitha/data_projects/master/employee_turnover/data/employee_churn_data.csv') %>%

  mutate(left = factor(left, levels = c("yes", "no")))

Затем я разделяю данные на обучающий и тестовый наборы и создаю рецепт.

## Create a split object consisting 75% of data
split_object <- initial_split(df, prop = 0.75, 
                              
                              strata = left)

## Generate the training set
df_train <- split_object %>%
  
  training()

## Generate the testing set
df_test <- split_object %>%
  
  testing()

###############################################
## Create a recipe
df_recipe <- recipes::recipe(left ~ ., 
                             
                             data = df_train) %>%
  
  ##We upsample the data to balance the outcome variable
  themis::step_upsample(left, 
                        
                        over_ratio = 1, 
                        
                        seed = 500) %>%
  
  ##We make all character variables factors
  step_string2factor(all_nominal_predictors()) %>%
  
  ##We remove one in a pair of highly correlated variables
  ## The threshold for removal is 0.85 (absolute) 
  ## The choice of threshold is subjective. 
  step_corr(all_numeric_predictors(), 
            
            threshold = 0.85) %>%
  
  ## Train these steps on the training data
  prep(training = df_train)

Затем я определяю модель и пытаюсь подогнать ее.

## Define a logistic model
logistic_model <- logistic_reg() %>%
  
  set_engine("glm") %>%
  
  set_mode("classification")

Тогда подгоните.

workflow() %>% 
  
  add_recipe(df_recipe) %>% 
  
  add_model(logistic_model) %>% 
  
  fit(data = df_train)

Вот где я получаю ошибку

Error:
! Can't use NA as column index with `[` at positions 3 and 4.

Я проверял и перепроверял. Любая помощь приветствуется.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
48
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я отвечаю на свой собственный вопрос.

Я понял одну вещь: проблема в шаге recipe. Когда я заменяю step_str2factor на step_dummy, все работает нормально.

Я до сих пор не знаю, почему это так. Может быть, мне нужно будет изучить Tidymodels более пристально!!

В df_recipe удалите prep(training = df_train), т.е. определите его так:

## Create a recipe
df_recipe <- recipes::recipe(left ~ .,
                             data = df_train) %>%
  ##We upsample the data to balance the outcome variable
  themis::step_upsample(left,
                        over_ratio = 1,
                        seed = 500) %>%
  ##We make all character variables factors
  step_string2factor(all_nominal_predictors()) %>%
  ##We remove one in a pair of highly correlated variables
  ## The threshold for removal is 0.85 (absolute)
  ## The choice of threshold is subjective.
  step_corr(all_numeric_predictors(),
            threshold = 0.85) 

Удаление prep() не привело к ошибкам при запуске fit(). Я считаю, что prep() здесь не нужен, потому что workflow() делает то же самое.

Из справочного сообщения ?workflow:

When you specify and fit a model with a workflow(), parsnip and workflows match and reproduce the underlying behavior of the user-specified model’s computational engine.

От ?prep():

 If you are using a recipe as a preprocessor for modeling, we highly recommend that you use a workflow() instead of manually estimating a recipe (see the example in recipe()).

Когда вы должны использовать prep() тогда? По моему опыту, это полезно, когда вы хотите получить представление о том, как ваши данные будут выглядеть после обработки:

#how training data will look like after your recipe steps are applied
df_recipe %>% 
  prep() %>% 
  bake(new_data = NULL)
# A tibble: 10,134 x 9
   department  promoted review projects salary tenure satisfaction bonus left 
   <fct>          <int>  <dbl>    <int> <fct>   <dbl>        <dbl> <int> <fct>
 1 operations         0  0.578        3 low         5        0.627     0 no   
 2 sales              0  0.676        3 high        5        0.578     1 no   
 3 admin              0  0.620        4 high        5        0.687     0 no   
 4 sales              0  0.653        4 low         6        0.679     0 no   
 5 sales              0  0.642        3 medium      6        0.623     0 no   
 6 support            0  0.563        4 medium      5        0.559     0 no   
 7 engineering        0  0.799        3 medium      5        0.433     1 no   
 8 marketing          0  0.611        3 low         6        0.502     0 no   
 9 sales              0  0.567        3 medium      6        0.845     0 no   
10 finance            0  0.583        3 medium      6        0.608     0 no   
# ... with 10,124 more rows

Спасибо, Десмонд, что нашел время ответить. Я ценю. Я принял это к сведению.

John Karuitha 24.03.2022 08:57

Другие вопросы по теме