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

R tidymodels:step_novel结合重采样工作流失效问题咨询

解决tidymodels重采样中step_novel仍报新因子水平错误的问题

问题根源

你的代码中**step_impute_knn的执行顺序在step_novel之前**,这会导致插补步骤优先处理未被标记为"novel"的新因子水平。在重采样的折叠中,部分训练集不包含"problem"这个水平,当测试集出现该水平时,knn插补无法识别未被预处理的新水平,从而触发报错。

修复方案

调整预处理步骤的顺序,将step_novel放在step_impute_knn之前,确保新因子水平先被标记为"novel",再执行插补操作。同时保持allow_novel_levels = TRUE的设置,确保模型能处理novel水平。

修改后的完整代码

# Create sample data
library(tidymodels)
library(tidyverse)

set.seed(123)
num_samples <- 100
outcome <- rnorm(num_samples, mean = 50, sd = 10)
numeric_predictor <- rnorm(num_samples, mean = 30, sd = 5)
categorical_predictor <- as.factor(sample(letters[1:4], num_samples, replace = TRUE))

# Create dataframe
df <- data.frame(
  Outcome = outcome,
  Numeric_Predictor = numeric_predictor,
  Categorical_Predictor = categorical_predictor
)

new_row <- data.frame(
  Outcome = 55,
  Numeric_Predictor = NA,
  Categorical_Predictor = "problem"
)

# Add the new row to the dataframe
df <- rbind(df, new_row)

# 调整步骤顺序:先处理novel水平,再做插补
lr_full_preprocessing <- 
  recipe(Outcome ~ ., data = df) %>%
  # 先标记新因子水平为novel
  step_novel(all_nominal_predictors()) %>%
  # 再执行knn插补
  step_impute_knn(all_predictors(), neighbors = 1, options = list(nthread = 8, eps = 1e-08))

lr_full <- linear_reg() %>%
  set_engine("lm")

lr_full_wf <- workflow() %>%
  add_recipe(lr_full_preprocessing, blueprint = hardhat::default_recipe_blueprint(allow_novel_levels = TRUE)) %>%
  add_model(lr_full)

set.seed(123)  # for reproducibility
folds <- vfold_cv(df, v = 10, repeats = 5)

lr_full_fit_rs <- lr_full_wf %>% 
  fit_resamples(folds)

collect_metrics(lr_full_fit_rs)

关键说明

  1. 步骤顺序:step_novel必须在任何需要处理分类变量的预处理步骤(如插补、编码)之前执行,确保所有新水平被提前标记,后续步骤能正确识别。
  2. blueprint设置:allow_novel_levels = TRUE确保模型在预测阶段接受novel水平,避免后续预测时再次报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:12:53