sparklyr ml_kmeans 字段“功能”不存在

Posted

技术标签:

【中文标题】sparklyr ml_kmeans 字段“功能”不存在【英文标题】:sparklyr ml_kmeans Field "features" does not exist 【发布时间】:2018-05-11 06:40:09 【问题描述】:

AWS EC2 Spark / Hadoop 集群。

以下 baisc K-Means sparklyr 代码适用于 Spark 2.0.1

  kmeans_model <- iris_tbl %>%
  select(Petal_Width, Petal_Length) %>%
  ml_kmeans(centers = 3)

我已升级到 Spark 2.1.1,但出现此错误

    Error: java.lang.IllegalArgumentException: Field "features" does not exist.
        at org.apache.spark.sql.types.StructType$$anonfun$apply$1.apply(StructType.scala:264)
        at org.apache.spark.sql.types.StructType$$anonfun$apply$1.apply(StructType.scala:264)
 ...
io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)

我用代码做了一些测试

kmeans_model <- iris_tbl %>%
  select(Petal_Width, Petal_Length) %>%
  ml_kmeans(k = 3, features = c("Petal_Length", "Petal_Width"))

kmeans_model <- iris_tbl %>%
  dplyr::select(Petal_Width, Petal_Length) %>%
  ml_kmeans(centers = 3, features = c("Petal_Length", "Petal_Width"))

但仍然得到同样的错误。

【问题讨论】:

我希望 features 参数能够实现向后兼容性。您可以在github.com/rstudio/sparklyr/issues/1150 跟踪问题。我们鼓励formula 接口,正如@user9019279 在下面指出的那样,因为它可以支持监督学习算法的交互。 【参考方案1】:

此代码在 Spark 2.0 中无法使用,就像在更新的版本中无法使用一样。此代码的应用不正确,与 Spark 版本无关。默认情况下ml_kmeans(和其他ml_* 函数),期望Vector 类型列名为featuresfeatures 可以用来覆盖名称,应该是:

长度为一的字符向量

不使用ft_vector_assembler 的唯一方法是提供formula

kmeans_model <- iris_tbl %>% 
  ml_kmeans(formula= ~ Petal_Width + Petal_Length, k = 3)

【讨论】:

感谢您的回答!要覆盖特征列名称,实际上需要指定 features_col(对应于 Scala featuresCol)。 features 的向后兼容性仍应受到尊重,我正在为此进行修复。 我接受了答案,但正如我在帖子开头所说的那样,代码在 Spark 2.0 中仍然有效

以上是关于sparklyr ml_kmeans 字段“功能”不存在的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 'sparklyr::replace.na()' 替换一列上的 NaN?

SparkR vs sparklyr [关闭]

Sparklyr 忽略行分隔符

在 sparklyr 中禁用 hive 支持

从 Sparklyr 中提取和可视化模型树

如何使用 sparklyr 过滤部分匹配