我在 Spark 1.5.1 中有一个 spark.ml 管道,它由一系列转换器和一个 k-means 估计器组成。我希望能够访问 KMeansModel .clusterCenters 拟合管道后,但无法弄清楚如何。是否有与 sklearn 的 pipeline.named_steps 功能等效的 spark.ml 功能?
我找到了 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
来完成.
最佳答案
回答我自己的问题...我终于在 spark.ml 文档深处偶然发现了一个示例,该示例展示了如何使用 stages
执行此操作PipelineModel
成员(member)类(class)。因此,对于我上面发布的示例,为了访问 k-means 聚类中心,请执行以下操作:val centers = fitKmeans.stages(2).asInstanceOf[KMeansModel].clusterCenters
哪里fitKmeans
是一个 PipelineModel 和 2
是 k-means 模型在流水线阶段数组中的索引。
引用: this page 上大部分示例的最后一行.
关于scala - 是否可以访问 spark.ml 管道中的估算器属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33220046/