是否可以访问spark.ml管道中的估算器属性?

时间:2015-10-19 17:04:12

标签: scala apache-spark pipeline apache-spark-ml

我在Spark 1.5.1中有一个spark.ml管道,它包含一系列变换器,后跟k-means估算器。我希望能够在安装管道后访问KMeansModel。clusterCenters,但无法弄清楚如何。是否有一个spark.ml相当于sklearn的pipeline.named_steps功能?

我发现this answer有两种选择。如果我从我的管道中取出k-means模型并单独使用它,那么第一个工作,但这有点挫败了管道的目的。第二个选项不起作用 - 我得到error: value getModel is not a member of org.apache.spark.ml.PipelineModel

编辑:示例管道:

import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}
import org.apache.spark.ml.clustering.{KMeans, KMeansModel}
import org.apache.spark.ml.Pipeline

// create example dataframe
val sentenceData = sqlContext.createDataFrame(Seq(
  ("Hi I heard about Spark"),
  ("I wish Java could use case classes"),
  ("K-means models are neat")
  )).toDF("sentence")

// initialize pipeline stages
val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
val hashingTF = new HashingTF().setInputCol("words").setOutputCol("features").setNumFeatures(20)
val kmeans = new KMeans()
val pipeline = new Pipeline().setStages(Array(tokenizer, hashingTF, kmeans))

// fit the pipeline
val fitKmeans = pipeline.fit(sentenceData)

现在fitKmeans的类型为org.apache.spark.ml.PipelineModel。我的问题是,如何访问由此管道中包含的k-means模型计算的集群中心?如上所述,当管道中包含时,可以使用fitKmeans.clusterCenters完成此操作。

1 个答案:

答案 0 :(得分:18)

回答我自己的问题......我终于偶然发现了一个深入spark.ml文档的示例,该文档演示了如何使用stages类的PipelineModel成员执行此操作。因此,对于上面发布的示例,为了访问k-means集群中心,请执行以下操作:

val centers = fitKmeans.stages(2).asInstanceOf[KMeansModel].clusterCenters

其中fitKmeans是PipelineModel,2是管道阶段数组中k-means模型的索引。

参考:this page上大多数示例的最后一行。