Tidymodels排错:因子出现新水平NA警告问题求助
问题解决:tidymodels recipe插补时出现「有新的因子水平NA」警告
问题根源
你的recipe步骤顺序错误:先执行了step_dummy()编码因子变量,再做KNN插补。当因子变量(比如penguins里的sex)存在NA时,step_dummy()会把NA当作一个未定义的新因子水平保留,后续的插补步骤无法回溯修正这个已经被编码的问题,最终触发警告。
正确解决方案
调整步骤顺序,先处理因子变量的缺失/未知水平,再执行插补,最后做数值变换和dummy编码:
修正后的代码
# penguins dataset tidymodels # libraries library(tidyverse) library(tidymodels) library(workflowsets) library(skimr) library(DataExplorer) library(SmartEDA) library(dlookr) library(dataMaid) library(GGally) # import data <- penguins # split set.seed(1) data_split <- data %>% initial_split(prop = 0.75, strata = species) data_train <- training(data_split) data_test <- testing(data_split) # 修正后的model recipe:先处理因子缺失,再插补,最后数值处理+编码 recipe <- recipe(species ~ ., data = data_train) %>% # 先给因子的NA标记为统一的新水平,避免step_dummy识别为未定义水平 step_novel(all_nominal_predictors()) %>% # 对所有变量执行KNN插补(包括因子变量) step_impute_knn(all_predictors()) %>% # 数值变量处理放在插补之后,保证插补用的是原始数据信息 step_log(all_numeric_predictors()) %>% step_normalize(all_numeric_predictors()) %>% step_corr(all_numeric_predictors(), threshold = 0.9) %>% step_zv(all_numeric_predictors()) %>% step_nzv(all_numeric_predictors()) %>% # 最后对因子做dummy编码 step_dummy(all_nominal_predictors()) # 应用预处理流程 baked_data_train <- recipe %>% prep() %>% bake(data_train) baked_data_test <- recipe %>% prep() %>% bake(data_test)
关键说明
step_novel()必须放在插补和step_dummy()之前:它会把因子中的NA标记为__novel__这个统一的新水平,让后续插补步骤能正常识别并处理,不会让step_dummy()把NA当成未定义的异常水平。- 插补步骤要在数值变换(log、标准化)和dummy编码之前:插补依赖原始变量的分布和分类信息,提前做数值变换或编码会破坏这些信息,导致插补结果失真。
- 若想直接把NA替换为自定义水平,可用
step_unknown(all_nominal_predictors(), new_level = "unknown")替代step_novel(),效果一致且更直观。
内容的提问来源于stack exchange,提问作者viki
相关产品推荐
相关产品推荐

