Выполнение парных взаимодействий между всеми полями с использованием рецептов

Я пытаюсь создать парные взаимодействия между каждым полем набора данных для glmnet модель, без необходимости называть каждое поле индивидуально. Однако, когда он пытается выполнить это автоматически, он зацикливается на создании их для всех вариантов однозначно закодированных категориальных переменных по отношению к себе (например, он создает столбец взаимодействия между Gender_Male а также Gender_Female, а затем не может найти какие-либо значения, поэтому все это заполнено NaN s) который затем делает glmnet кинь ошибку.

Вот пример кода:

library(dplyr)
library(tidyr)
library(rsample)
library(recipes)
library(glmnet)

head(credit_data)

t <- credit_data %>%
  mutate(Status = as.character(Status)) %>%
  mutate(Status = if_else(Status == "good", 1, 0)) %>%
  drop_na()

set.seed(1234)
partitions <- initial_split(t, prop = 9/10, strata = "Status")

parsed_recipe <- recipe(Status ~ ., data = t)  %>%
  step_dummy(one_hot = TRUE, all_predictors(), -all_numeric()) %>%
  step_interact(~.:.) %>% #My attempt to apply the interaction
  step_scale(all_predictors()) %>%
  prep(training = training(partitions))

train_data <- bake(parsed_recipe, new_data = training(partitions))
test_data <- bake(parsed_recipe, new_data = testing(partitions))

fit <- train_data %>%
  select(-Status) %>%
  as.matrix() %>%
  glmnet(x = ., y = train_data$Status, family = "binomial", alpha = 0)

Когда я бегу glmnet раздел в конце, он дает мне эту ошибку:

Error in lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs,  : 
  NA/NaN/Inf in foreign function call (arg 5)

Посмотрев на этот вопрос, я понял, что должно быть NA с / NaN s в данных, поэтому я побежал summary(train_data) который выглядел так:

Поэтому неудивительно, что glmnet расстроен, но я тоже не уверен, как это исправить. Я действительно не хочу определять каждую пару вручную. Есть ли recipes команда для удаления столбцов потенциальных предикторов, содержащих NaN может быть?

1 ответ

Решение

Я не уверен, что это идеальное (или даже хорошее) решение, но я использовал ответ здесь, чтобы найти столбцы, которые содержали NAа затем убрал их оптом.

Итак, немного позже parsed_recipe был переключен на это:

interim_train <- bake(parsed_recipe, new_data = training(partitions))

columns_to_remove <- colnames(interim_train)[colSums(is.na(interim_train)) > 0]

train_data <- interim_train %>%
  select(-columns_to_remove)

summary(train_data)

test_data <- bake(parsed_recipe, new_data = testing(partitions)) %>%
  select(-columns_to_remove)

Пока что он ведет себя более перспективно.

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