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

使用recipes包构建预处理流程后训练lasso模型出现NA报错如何解决

报错核心原因

你遇到的两个报错是连锁反应:「NAs introduced by coercion」是强制类型转换时生成了NA,后续传入glmnet的输入包含NA/Inf/NaN,才触发了第二个函数调用错误。具体可能的诱因按出现概率从高到低排列:

  1. 代码笔误:你定义的预处理recipe对象名为c_recipe,但 workflow 中传入的是churn_recipe,如果环境中该对象不存在、或者是旧的未做缺失值填充的预处理逻辑,会直接导致输入模型的特征存在缺失值。
  2. 数值特征存在Inf/NaN:step_impute_mean仅能处理NA值,无法处理无穷大、非数值的NaN,如果原始数值特征中存在这类值,填充后仍会保留异常值传入模型。
  3. 目标变量类型不合法:glmnet做二分类要求目标变量为因子类型,如果你的目标变量c是字符型、或者存在非二分类的异常取值,强制转换时会生成NA。
  4. 名义变量编码异常:如果某名义变量存在训练集中完全没有出现过的取值、或者所有取值完全一致,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:54:03