使用tidymodels拟合调优KNN工作流模型时遇orig_rows兼容错误
问题排查与解决方案
错误原因分析
你遇到的orig_rows行数不匹配错误,核心原因在于预处理步骤顺序错误和重复冗余的处理操作:
- 你在
step_dummy之后调用step_percentile和step_corr,导致all_numeric_predictors()包含了标称变量转换而来的二进制dummy变量,对这类变量执行百分位转换、相关性筛选是不合理的,会引发数据处理过程中的索引异常。 - 重复执行
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
相关产品推荐
相关产品推荐

