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)
关键说明
- 步骤顺序:
step_novel必须在任何需要处理分类变量的预处理步骤(如插补、编码)之前执行,确保所有新水平被提前标记,后续步骤能正确识别。 - blueprint设置:
allow_novel_levels = TRUE确保模型在预测阶段接受novel水平,避免后续预测时再次报错。
内容的提问来源于stack exchange,提问作者GeorgeM
相关产品推荐
相关产品推荐

