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

Posted

技术标签:

【中文标题】是否可以访问 spark.ml 管道中的估计器属性?【英文标题】:Is it possible to access estimator attributes in spark.ml pipelines? 【发布时间】:2016-01-18 03:10:42 【问题描述】:

我在 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 来完成。

【问题讨论】:

你问的不清楚!你愿意用MCVE 改写吗? @eliasah 好的,添加了一个示例。 【参考方案1】:

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

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

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

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

【讨论】:

这太可笑了 更新链接:spark.apache.org/docs/latest/… 查看管道中的所有阶段:model.stages。如果你知道你的机器学习是最后一步,而不是搜索索引,你总是可以做model.stages.last

以上是关于是否可以访问 spark.ml 管道中的估计器属性?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 scikit learn 中使用管道对象的最终估计器的属性?

是否可以将多个管道组合到 Neuraxle 或 sklearn 中的单个估计器中以创建多输出分类器并一次性适应

spark 与 scikit-learn 机器学习流程组件设计哲学比较

使用 Pyspark 从结构化流数据帧构建 Spark ML 管道模型

我如何使用不在 sklearn 中的估计器进行模型管道

有啥方法可以在 Spark ML Pipeline 中序列化自定义 Transformer