You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. ... %>% prep(training = train)
  2. recipes:::prep.recipe(., training = train)
  3. embed:::prep.step_woe(x$steps[[i]], training = training, info = x$term_info)
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:20:32