tidymodels中step_poly报错:'degree'需小于唯一点数的问题求助
问题分析
你遇到的错误来自step_poly调用的底层poly()函数,正交多项式要求多项式阶数必须小于变量的唯一值数量。报错信息里显示某个变量仅有1个唯一值,核心原因是训练数据中存在常量预测变量(所有观测值完全相同);另外你的代码存在语法失误:step_normalize行末尾缺少管道符|>,会导致step_poly和step_interact未被纳入预处理流程。
解决方案
1. 排查并移除低唯一值变量
先定位问题变量,再通过预处理步骤移除零方差/近零方差变量:
# 检查所有预测变量的唯一值数量 train |> select(-cost, -id) |> summarise(across(everything(), n_distinct)) # 修正语法并加入变量过滤步骤 rec <- recipe(cost ~ ., data = train) |> update_role(id, new_role = 'id') |> step_zv(all_predictors()) |> # 移除唯一值仅1个的变量 step_nzv(all_predictors()) |> # 移除唯一值极少的近零方差变量 step_normalize(all_numeric_predictors()) |> step_poly(all_predictors(), degree = 2) |> step_interact(~ all_predictors():all_predictors())
2. 改用原始多项式(绕过正交基限制)
如果不想移除变量,可以让step_poly使用原始多项式而非默认的正交多项式,这样能避开唯一值数量的限制(注意:变量值重复过多时,多项式特征可能无实际建模价值):
rec <- recipe(cost ~ ., data = train) |> update_role(id, new_role = 'id') |> step_normalize(all_numeric_predictors()) |> step_poly(all_predictors(), degree = 2, options = list(raw = TRUE)) |> step_interact(~ all_predictors():all_predictors())
3. 针对性设置多项式阶数
仅对唯一值足够的变量应用二阶多项式,对唯一值少的变量跳过处理:
# 筛选出唯一值≥3的变量(满足二阶多项式的最低要求) valid_vars <- train |> select(-cost, -id) |> summarise(across(everything(), n_distinct)) |> pivot_longer(everything()) |> filter(value >= 3) |> pull(name) # 仅对符合条件的变量应用多项式变换 rec <- recipe(cost ~ ., data = train) |> update_role(id, new_role = 'id') |> step_normalize(all_numeric_predictors()) |> step_poly(all_of(valid_vars), degree = 2) |> step_interact(~ all_predictors():all_predictors())
内容的提问来源于stack exchange,提问作者codeweird
相关产品推荐
相关产品推荐

