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

使用tidymodels构建XGBoost二分类模型时全模型失败报错

解决tidymodels中XGBoost二分类模型的terms类型错误

这个错误通常是目标变量类型、模型规格设置或预处理流程的问题导致的,以下是具体排查和解决步骤:

1. 确认目标变量为因子类型

XGBoost在tidymodels的分类任务中要求目标变量是因子(factor),而非双精度数值(比如0/1)。如果你的二分类目标列是数值型,必须转换为因子:

  • 数据清洗阶段转换:
    clean_data <- clean_data %>%
      mutate(loan_status = factor(loan_status, levels = c(0, 1), labels = c("reject", "approve")))
    
  • 或者在预处理recipe中转换:
    loan_recipe <- recipe(loan_status ~ ., data = train_data) %>%
      step_mutate(loan_status = factor(loan_status)) %>%
      # 其他预处理步骤...
    

2. 检查Recipe的目标角色与预处理逻辑

  • 确保目标变量没有被误当作特征处理,用update_role明确标记为结果列:
    loan_recipe <- recipe(loan_status ~ ., data = train_data) %>%
      update_role(loan_status, new_role = "outcome") %>%
      step_impute_mean(all_numeric_predictors()) %>%
      step_dummy(all_nominal_predictors())
    
  • 避免对目标变量应用数值型预处理步骤(比如step_scale、step_normalize),这些步骤只应作用于预测变量。

3. 正确设置XGBoost模型规格

必须明确指定模型的mode = "classification",否则tidymodels会默认按回归任务处理,引发类型不匹配:

xgb_spec <- boost_tree(
  trees = tune(),
  tree_depth = tune(),
  learn_rate = tune()
) %>%
  set_engine("xgboost") %>%
  set_mode("classification") # 关键:指定分类模式

4. 验证交叉验证集的输入

确保交叉验证的输入是经过拆分后的训练集,且训练集的目标变量类型正确:

data_split <- initial_split(clean_data, prop = 0.8, strata = loan_status)
train_data <- training(data_split)
# 检查目标变量类型
class(train_data$loan_status) # 应返回"factor"

folds <- vfold_cv(train_data, v = 5, strata = loan_status)

5. 确认工作流的正确组合

确保工作流正确绑定了预处理recipe和模型规格,不要传入错误的对象:

xgb_workflow <- workflow() %>%
  add_recipe(loan_recipe) %>%
  add_model(xgb_spec)

完整示例代码片段

# 数据准备
clean_data <- loan_data %>%
  # 转换目标变量为因子
  mutate(loan_status = factor(loan_status, levels = c(0, 1), labels = c("default", "paid"))) %>%
  select(-contains("id")) # 移除无关标识列

# 数据集拆分
data_split <- initial_split(clean_data, prop = 0.8, strata = loan_status)
train_data <- training(data_split)
test_data <- testing(data_split)

# 预处理Recipe
loan_recipe <- recipe(loan_status ~ ., data = train_data) %>%
  update_role(loan_status, new_role = "outcome") %>%
  step_impute_mean(all_numeric_predictors()) %>%
  step_dummy(all_nominal_predictors(), one_hot = TRUE) %>%
  step_normalize(all_numeric_predictors())

# XGBoost模型规格
xgb_spec <- boost_tree(
  trees = tune(),
  tree_depth = tune(),
  min_n = tune(),
  learn_rate = tune()
) %>%
  set_engine("xgboost") %>%
  set_mode("classification")

# 交叉验证设置
folds <- vfold_cv(train_data, v = 5, strata = loan_status)

# 调参工作流
xgb_workflow <- workflow() %>%
  add_recipe(loan_recipe) %>%
  add_model(xgb_spec)

# 网格搜索调参
xgb_grid <- grid_latin_hypercube(
  trees(),
  tree_depth(),
  min_n(),
  learn_rate(),
  size = 15
)

xgb_tune_results <- tune_grid(
  xgb_workflow,
  resamples = folds,
  grid = xgb_grid,
  metrics = metric_set(roc_auc, accuracy)
)

内容的提问来源于stack exchange,提问作者mbiella

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:28:28