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

使用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)

关键修正点

  1. workflow_map()指定fn = "tune_cluster":明确告诉workflow_map对每个workflow执行聚类调优任务,替代原来的嵌套调用逻辑。
  2. 移除多余的tune_cluster()调用:workflow_map会自动遍历所有workflow完成调优,不需要单独再调用tune_cluster。
  3. 优化rec3的step_log:添加offset = 1避免数据为0时的log报错(mtcars中无0,但作为通用处理更安全)。

结果分析

  • ranked_results展示所有预处理方案+模型组合的调优结果排名,方便对比不同预处理逻辑对K值选择的影响。
  • best_params_per_workflow可查看每个预处理方案对应的最优K值。
  • best_overall给出所有方案中性能最优的组合及其参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:43:21