我在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
完成此操作。
答案 0 :(得分:18)
回答我自己的问题......我终于偶然发现了一个深入spark.ml文档的示例,该文档演示了如何使用stages
类的PipelineModel
成员执行此操作。因此,对于上面发布的示例,为了访问k-means集群中心,请执行以下操作:
val centers = fitKmeans.stages(2).asInstanceOf[KMeansModel].clusterCenters
其中fitKmeans
是PipelineModel,2
是管道阶段数组中k-means模型的索引。
参考:this page上大多数示例的最后一行。