在spark.ml管道中,是否可以访问评估器属性?

16
我在Spark 1.5.1中有一个spark.ml流水线,由一系列变压器组成,后跟一个k-means评估器。我想在拟合管道后能够访问KMeansModel.clusterCenters ,但不知道如何做到。是否有spark.ml相当于sklearn的pipeline.named_steps功能的等效项?
我找到了这个答案,其中给出了两个选项。如果我将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


你的问题不够清晰!你能否用 MCVE 重新表述一下? - eliasah
@eliasah 好的,已添加一个示例。 - hilarious
1个回答

24
作为回答自己的问题......最终我在spark.ml文档中发现了一个示例,展示了如何使用PipelineModel类的stages成员来完成此操作。因此,对于我上面发布的示例,为了访问k-means聚类中心,请执行以下操作:val centers = fitKmeans.stages(2).asInstanceOf[KMeansModel].clusterCenters,其中fitKmeans是一个PipelineModel,2是管道阶段数组中k-means模型的索引。
参考资料:this page上大多数示例的最后一行。

5
这太荒唐了,也太棒了。 - maxymoo
更新链接:http://spark.apache.org/docs/latest/ml-classification-regression.html#tree-ensembles - Chuck
查看管道中的所有阶段: model.stages。如果您知道您的 ML 是最后一步,而不是搜索索引,您始终可以执行 model.stages.last - kevin_theinfinityfund

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接