R语言Tidymodels/Embed中step_woe报错:变量类型不符合要求
问题解决:step_woe报错"所有选中列应为factor或character"
问题重现
在Tidymodels的Recipe中,先使用step_discretize_xgb对数值变量分箱后,添加step_woe步骤时持续报错,即使已确认待转换变量是分箱后的factor类型。简化示例代码如下:
library(embed) library(tidymodels) library(tidyverse) library(xgboost) TG <- sample(c(0,1), 1000, replace = TRUE) V1 <- rnorm(1000) train <- tibble(VARIABLE_1 = V1, TARGET = TG) rec <- recipes::recipe(TARGET ~ ., data = train) %>% step_discretize_xgb(all_numeric_predictors(), outcome = vars(TARGET)) %>% step_woe(all_of("VARIABLE_1"), outcome = vars(TARGET)) %>% prep(training = train)
报错信息:
Error in
check_type():
! All columns selected for the step should be factor or character
Backtrace:
- ... %>% prep(training = train)
- recipes:::prep.recipe(., training = train)
- embed:::prep.step_woe(x$steps[[i]], training = training, info = x$term_info)
- recipes::check_type(training[, outcome_name], quant = FALSE)
Error in check_type(training[, outcome_name], quant = FALSE) :
错误原因
从报错回溯信息可以看到,check_type检查的是目标变量(TARGET)的类型,而非你以为的待转换变量VARIABLE_1。step_woe要求分类任务的目标变量必须是factor或character类型,而你的TARGET是数值型(0/1),不符合要求。
解决方法
只需要将目标变量TARGET转换为factor类型即可,有两种方式:
方式1:创建数据框时直接转换
train <- tibble(VARIABLE_1 = V1, TARGET = factor(TG, levels = c(0,1)))
方式2:在Recipe中添加转换步骤
在step_discretize_xgb之前加入step_mutate转换目标变量:
rec <- recipes::recipe(TARGET ~ ., data = train) %>% step_mutate(TARGET = factor(TARGET, levels = c(0,1))) %>% step_discretize_xgb(all_numeric_predictors(), outcome = vars(TARGET)) %>% step_woe(all_of("VARIABLE_1"), outcome = vars(TARGET)) %>% prep(training = train)
运行上述修改后的代码即可正常执行,不会再触发类型检查错误。
内容的提问来源于stack exchange,提问作者Filipa
相关产品推荐
相关产品推荐

