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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:08:31