使用配方在所有字段之间执行配对交互

时间:2019-04-18 00:58:21

标签: r tidymodels

我试图在glmnet模型的数据集的每个字段之间创建双向交互,而不必分别命名每个字段。但是,当它尝试自动执行此操作时,它就无法为针对它们的一键编码分类变量的所有变体创建变量(例如,它在Gender_MaleGender_Female之间创建了一个交互列,然后找不到任何值,因此整个内容都被NaN填充),从而使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)

看了this个问题后,我意识到数据中必须有NA s / NaN s,所以我运行了summary(train_data),结果看起来像这样:

enter image description here

因此,glmnet令人沮丧也就不足为奇了,但是我也不知道如何解决它。我真的不想自己手动定义每个配对。有没有recipes命令删除可能包含NaN的潜在预测变量列?

1 个答案:

答案 0 :(得分:0)

我不确定这是否是一个完美的(甚至是 good )解决方案,但是我使用了答案here来查找包含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)

到目前为止,它的行为方式似乎更有希望。