使用配方在所有字段之间执行配对交互
Performing pairways interactions between all fields using recipes
我正在尝试在 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)
看了this问题,我意识到数据中一定有NA
s / NaN
s,所以我运行 summary(train_data)
,结果看起来像这样:
所以,glmnet
感到沮丧并不奇怪,但我也不确定如何解决它。我真的不想自己手动定义每一个配对。是否有 recipes
命令删除包含 NaN
的潜在预测列,也许?
我不确定它是否是一个完美的(甚至 好的 )解决方案,但我使用答案 here 找到包含 [=11] 的列=]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)
到目前为止,它的表现似乎更有前途。
我正在尝试在 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)
看了this问题,我意识到数据中一定有NA
s / NaN
s,所以我运行 summary(train_data)
,结果看起来像这样:
所以,glmnet
感到沮丧并不奇怪,但我也不确定如何解决它。我真的不想自己手动定义每一个配对。是否有 recipes
命令删除包含 NaN
的潜在预测列,也许?
我不确定它是否是一个完美的(甚至 好的 )解决方案,但我使用答案 here 找到包含 [=11] 的列=]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)
到目前为止,它的表现似乎更有前途。