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

使用tidymodels拟合调优KNN工作流模型时遇orig_rows兼容错误

问题排查与解决方案

错误原因分析

你遇到的orig_rows行数不匹配错误,核心原因在于预处理步骤顺序错误和重复冗余的处理操作:

  1. 你在step_dummy之后调用step_percentile和step_corr,导致all_numeric_predictors()包含了标称变量转换而来的二进制dummy变量,对这类变量执行百分位转换、相关性筛选是不合理的,会引发数据处理过程中的索引异常。
  2. 重复执行step_percentile和step_corr步骤,不仅冗余,还会干扰数据的正常转换流程,最终导致行数匹配错误。

修正后的代码

调整预处理Recipe

重新梳理预处理步骤顺序,先完成数值变量的缺失值填充、相关性筛选、百分位转换和范围缩放,最后处理标称变量的dummy编码,同时移除重复步骤:

# 修正后的预处理recipe
recipeKnnTunedPrep <- trainOrangeOrigin|>
  recipe(Purchase ~.)|>
  # 填充数值变量的缺失值
  step_impute_knn(all_numeric_predictors())|>
  # 筛选数值变量中相关性过高的特征
  step_corr(all_numeric_predictors(), threshold=0.7)|>
  # 数值变量转百分位
  step_percentile(all_numeric_predictors())|>
  # 数值变量缩放到0-1范围
  step_range(all_numeric_predictors(), min=0, max=1)|>
  # 最后处理标称预测变量的dummy编码
  step_dummy(all_nominal_predictors())

完整修正后的代码

# loading dataset
orange <- read.csv('https://raw.githubusercontent.com/selva86/datasets/master/orange_juice_withmissing.csv')

# data partitioning
orange_split <- initial_split(orange,
                              prop = 0.8,
                              strata=Purchase)

trainOrangeOrigin <- training(orange_split)
testOrangeOrigin <- testing(orange_split)

# 修正后的预处理recipe
recipeKnnTunedPrep <- trainOrangeOrigin|>
  recipe(Purchase ~.)|>
  step_impute_knn(all_numeric_predictors())|>
  step_corr(all_numeric_predictors(), threshold=0.7)|>
  step_percentile(all_numeric_predictors())|>
  step_range(all_numeric_predictors(), min=0, max=1)|>
  step_dummy(all_nominal_predictors())

# model and hyperparameters selection
modelKnnTunedPrep <-
  nearest_neighbor(neighbors = tune())|>
  set_engine("kknn")|>
  set_mode("classification")

# regular grid of values for hyperparameter tuning
gridKnn <- grid_regular(neighbors(),
                        levels = 5)

# cross-validation folds for tuning
set.seed(234, sample.kind = "Rounding")
folds <- vfold_cv(trainOrangeOrigin, v=5)

# Workflow creation, fitting and model plotting
set.seed(345, sample.kind = "Rounding")

WF_BaseKnnTunedPrep <- workflow()|>
  add_recipe(recipeKnnTunedPrep)|>
  add_model(modelKnnTunedPrep)

# fitting
resultWF_KnnTunedPrep <- 
  WF_BaseKnnTunedPrep|> 
  tune_grid(resamples = folds,
            control = control_resamples(save_pred = TRUE),
            grid = gridKnn)

额外说明

  • dummy变量是二进制分类特征,不需要执行数值变量的百分位转换或范围缩放,因此必须将step_dummy放在所有数值变量处理步骤之后。
  • 重复的预处理步骤会增加计算开销,还可能引发不可预期的数据异常,务必确保每个处理步骤只执行一次。

内容的提问来源于stack exchange,提问作者damiano pincolini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 10:08:12