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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:42:53