Выполнение парных взаимодействий между всеми полями с использованием рецептов - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь создать парные взаимодействия между каждым полем набора данных для модели 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 s / NaN s вданные, поэтому я запустил summary(train_data), который выглядел так:

enter image description here

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

1 Ответ

0 голосов
/ 23 апреля 2019

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

Таким образом, бит после 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)

Пока что, похоже, он ведет себя более многообещающе.

...