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

使用sparklyr进行ml_kmeans分析:最优分配预测聚类成员的方法

优雅解决sparklyr ml_kmeans聚类结果与原始数据合并的问题

针对你提到的ml_kmeans预测结果顺序可能不一致、现有合并方案冗长的问题,我们可以通过简化sdf_predict的使用逻辑来优化整个流程,同时彻底解决顺序匹配的问题。

优化后的完整代码

library(sparklyr)

# 连接Spark集群
sc <- spark_connect(master = "local")

# 给原始数据添加唯一ID(用于后续严格匹配顺序)
iris <- iris %>% mutate(id = row_number())

# 将数据复制到Spark环境
iris_tbl <- sdf_copy_to(sc, iris, overwrite = TRUE)

# 训练K-Means模型(仅使用特征列)
iris_kmeans <- iris_tbl %>% 
  select(-id, -Species) %>% 
  ml_kmeans(centers = 5L, init_mode = "k-means||")

# 直接预测并保留所有原始列,同时按ID确保顺序一致
iris_result <- sdf_predict(iris_kmeans, new_data = iris_tbl) %>%
  arrange(id) %>%  # 用自定义ID强制排序,彻底规避顺序错误
  collect()

关键优化点说明

  1. 一站式完成预测与合并
    sdf_predict支持直接传入包含所有列的原始Spark表(iris_tbl),它会自动识别训练时用到的特征列进行预测,同时保留原始表中的所有列(包括id和Species),并新增prediction聚类标签列。这一步就同时完成了预测和数据合并,省去了单独提取标签、手动绑定列的冗余操作。

  2. 彻底解决顺序问题
    通过给原始数据添加自定义id列,最后用arrange(id)强制排序,完全规避了GitHub注释中提到的返回结果顺序错误的风险,确保聚类标签和原始数据行严格一一对应。

关于broom包的替代方案

确实目前broom对sparklyr的ml_kmeans支持有限,但你可以用sparklyr自带的函数获取整洁的聚类分析结果:

  • 获取聚类中心的结构化数据:
    cluster_centers <- ml_cluster_centers(iris_kmeans) %>% collect()
    
  • 获取样本的轮廓系数(用于评估聚类效果):
    silhouette_scores <- ml_silhouette(iris_kmeans, iris_tbl) %>% collect()
    

对比原代码的简化点

  • 去掉了单独提取prediction列、手动绑定数据的冗余步骤
  • 减少了中间变量(无需单独创建iris_cluster、id_col等)
  • 用dplyr风格的arrange替代sdf_sort,代码更统一易读

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:58:27