Выполнение парных взаимодействий между всеми полями с использованием рецептов
Я пытаюсь создать парные взаимодействия между каждым полем набора данных для 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)
Пока что он ведет себя более перспективно.