使用Tidymodels、Workflowsets和Recipes调优K-means聚类的K值
问题解决:Tidymodels Workflowset 聚类调优错误
错误原因
你遇到的Error in tune_cluster(): The first argument to [tune_cluster()] should be either a model or workflow.错误,核心原因是**tune_cluster()仅支持单个模型或工作流对象**,但你把workflow_map()的输出(一个批量处理后的workflowset结果对象)传给了它。实际上workflow_map()本身就是用来批量处理workflowset中所有工作流的调优任务的,不需要额外嵌套tune_cluster()。
修正后的完整代码
# INSTALL PACKAGES pacman::p_load(tidyverse, tidymodels, tidyclust, janitor, ClusterR, knitr, moments, visdat, skimr, DescTools) mtcars <- mtcars %>% mutate( `am` = factor(`am`, labels = c(`0` = "auto", `1` = "man")), `vs` = factor(`vs`, labels = c(`0` = "V-shaped", `1` = "straight")), `cyl` = factor(`cyl`), `gear` = factor(`gear`), `carb` = factor(`carb`) ) # SET UP 10 FOLD CROSS VALIDATION mtcars_cv <- vfold_cv(mtcars, v = 10) # SET SEED FOR REPRODUCABILITY set.seed(123) # MODEL SPEC -------------------------------------------------------------- kmeans_spec <- k_means(num_clusters = tune()) # PREPROCESSING RECIPES --------------------------------------------------- rec1 <- recipe(~., data = mtcars) %>% step_dummy(all_nominal_predictors()) %>% step_zv(all_predictors()) %>% step_normalize(all_numeric_predictors()) rec2 <- recipe(~., data = mtcars) %>% step_novel(all_nominal()) %>% step_dummy(all_nominal()) %>% step_zv(all_predictors()) %>% step_normalize(all_predictors()) %>% step_pca(all_predictors(), num_comp = 2) rec3 <- recipe(~., data = mtcars) %>% step_log(all_numeric_predictors(), offset = 1) %>% # 加offset避免log(0)风险 step_center(all_numeric_predictors()) %>% step_scale(all_numeric_predictors()) clust_num_grid <- grid_regular(num_clusters(), levels = 10 ) # WORKFLOW ---------------------------------------------------------------- wf_set <- workflow_set( preproc = list(rec1, rec2, rec3), models = list(kmeans_spec) ) # TUNE HYPER-PARAMETERS --------------------------------------------------- # 用workflow_map批量执行每个workflow的tune_cluster tune_results <- wf_set %>% workflow_map( fn = "tune_cluster", # 指定要执行的调优函数 resamples = mtcars_cv, grid = clust_num_grid, metrics = cluster_metric_set(sse_within_total, sse_total, sse_ratio), control = tune::control_grid(save_pred = TRUE, extract = identity) ) # 查看所有workflow的调优结果排名(按sse_ratio最优排序) ranked_results <- tune_results %>% rank_results(rank_metric = "sse_ratio", select_best = TRUE) # 提取每个workflow的最优参数 best_params_per_workflow <- tune_results %>% extract_workflow_set_result() %>% map(select_best, metric = "sse_ratio") # 获取整体最优的workflow和参数 best_overall <- ranked_results %>% slice(1)
关键修正点
workflow_map()指定fn = "tune_cluster":明确告诉workflow_map对每个workflow执行聚类调优任务,替代原来的嵌套调用逻辑。- 移除多余的
tune_cluster()调用:workflow_map会自动遍历所有workflow完成调优,不需要单独再调用tune_cluster。 - 优化
rec3的step_log:添加offset = 1避免数据为0时的log报错(mtcars中无0,但作为通用处理更安全)。
结果分析
ranked_results展示所有预处理方案+模型组合的调优结果排名,方便对比不同预处理逻辑对K值选择的影响。best_params_per_workflow可查看每个预处理方案对应的最优K值。best_overall给出所有方案中性能最优的组合及其参数。
内容的提问来源于stack exchange,提问作者TheGoat
相关产品推荐
相关产品推荐

