使用recipes包构建预处理流程后训练lasso模型出现NA报错如何解决
报错核心原因
你遇到的两个报错是连锁反应:「NAs introduced by coercion」是强制类型转换时生成了NA,后续传入glmnet的输入包含NA/Inf/NaN,才触发了第二个函数调用错误。具体可能的诱因按出现概率从高到低排列:
- 代码笔误:你定义的预处理recipe对象名为
c_recipe,但 workflow 中传入的是churn_recipe,如果环境中该对象不存在、或者是旧的未做缺失值填充的预处理逻辑,会直接导致输入模型的特征存在缺失值。 - 数值特征存在Inf/NaN:
step_impute_mean仅能处理NA值,无法处理无穷大、非数值的NaN,如果原始数值特征中存在这类值,填充后仍会保留异常值传入模型。 - 目标变量类型不合法:glmnet做二分类要求目标变量为因子类型,如果你的目标变量
c是字符型、或者存在非二分类的异常取值,强制转换时会生成NA。 - 名义变量编码异常:如果某名义变量存在训练集中完全没有出现过的取值、或者所有取值完全一致,dummy编码后会生成全空列。
排查解决步骤
- 先修正代码笔误,将workflow代码修改为:
logistic_wf <- workflow() %>% add_recipe(c_recipe) %>% add_model(lasso_spec) %>% fit(train)
- 检查目标变量是否符合二分类要求:
# 确认是因子类型 class(train$c) # 确认无缺失、只有两个分类水平 table(train$c, useNA = "always")
如果不是因子,先转换:train$c <- as.factor(train$c)。
- 排查原始数据中的异常值:
# 检查所有数值列的Inf/NaN数量 num_cols <- sapply(train, is.numeric) lapply(train[, num_cols], function(x) sum(is.infinite(x) | is.nan(x)))
如果存在Inf/NaN,提前替换为NA再做预处理:train[num_cols] <- lapply(train[num_cols], function(x) replace(x, is.infinite(x)|is.nan(x), NA))。
- 单独验证预处理流程输出是否正常:
# 运行预处理 prepped <- prep(c_recipe, train) processed_data <- bake(prepped, new_data = NULL) # 检查处理后的数据是否还有异常值 sum(is.na(processed_data)) sum(sapply(processed_data, function(x) any(is.infinite(x)|is.nan(x))))
如果仍有异常,逐步骤删减预处理step定位问题来源。
内容的提问来源于stack exchange,提问作者V.Sun
相关产品推荐
相关产品推荐

