如何用tidymodels调优recipe包step_impute_knn的neighbors参数
用tidymodels工作流自动调优
step_impute_knn的neighbors参数 当然可以通过tidymodels工作流实现step_impute_knn中neighbors参数的自动网格搜索调优,核心是把配方步骤里的参数标记为tune(),再结合工作流、交叉验证和网格搜索完成调优,完全不需要手动调整。
完整实现示例
以下是基于混合类型缺失值数据集的完整代码流程:
1. 加载工具包并准备数据
library(tidymodels) tidymodels_prefer() # 构造含缺失值的混合类型示例数据 set.seed(123) data <- tibble( num1 = c(rnorm(80), rep(NA, 20)), num2 = c(rnorm(75), rep(NA, 25)), cat1 = sample(c("A", "B", "C"), 100, replace = TRUE), cat2 = sample(c("X", "Y"), 100, replace = TRUE), target = rnorm(100) ) # 拆分数据集并创建交叉验证折 data_split <- initial_split(data, prop = 0.8) data_train <- training(data_split) data_test <- testing(data_split) data_folds <- vfold_cv(data_train, v = 5)
2. 定义带调优参数的预处理配方
把step_impute_knn的neighbors参数标记为tune(),该步骤会自动用Gower距离处理混合类型变量:
impute_recipe <- recipe(target ~ ., data = data_train) %>% step_dummy(all_nominal_predictors()) %>% step_impute_knn(all_predictors(), neighbors = tune())
3. 定义模型并组合工作流
这里以线性回归为例,你可以替换成任何符合任务需求的parsnip模型:
# 定义模型 lm_model <- linear_reg() %>% set_engine("lm") %>% set_mode("regression") # 组合工作流(配方+模型) impute_workflow <- workflow() %>% add_recipe(impute_recipe) %>% add_model(lm_model)
4. 创建调优网格并执行网格搜索
指定neighbors的候选范围,通过交叉验证评估不同参数的效果:
# 创建调优网格,生成5个候选值 impute_grid <- grid_regular(neighbors(range = c(3, 15)), levels = 5) # 执行网格搜索调优 impute_tune <- tune_grid( object = impute_workflow, resamples = data_folds, grid = impute_grid, metrics = metric_set(rmse) # 回归任务用RMSE,分类任务可替换为accuracy/roc_auc等 )
5. 查看调优结果并应用最优参数
# 查看最优参数候选 show_best(impute_tune, metric = "rmse") # 选择最优参数并更新工作流 best_impute <- select_best(impute_tune, metric = "rmse") final_workflow <- finalize_workflow(impute_workflow, best_impute) # 在测试集验证最终效果 final_fit <- last_fit(final_workflow, data_split) collect_metrics(final_fit)
关键说明
- tidymodels支持对预处理步骤参数和模型参数同时调优,无需局限于模型本身的参数
step_impute_knn默认使用Gower距离处理混合类型变量,调优neighbors不会改变这一距离度量逻辑- 评估指标需根据任务类型(分类/回归)选择对应的指标集合,确保调优方向符合业务需求
内容的提问来源于stack exchange,提问作者GreenManXY
相关产品推荐
相关产品推荐

