2015-10-19 112 views
11

我在Spark 1.5.1中有一個spark.ml管道,它由一系列變壓器組成,後面跟着一個k均值估計器。我想在裝配管道之後能夠訪問KMeansModel .clusterCenters,但無法弄清楚。有沒有sparkle.m相當於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) 

所以現在fitKmeansorg.apache.spark.ml.PipelineModel類型。我的問題是,如何訪問由此管道中包含的k-means模型計算出的聚類中心?如上所述,當管道中包含而不是時,可以使用fitKmeans.clusterCenters完成此操作。

+0

你在問什麼不清楚!你會關心一個[MCVE](http://stackoverflow.com/help/mcve)嗎? – eliasah

+0

@eliasah好的,增加了一個例子。 – hilarious

回答

18

回答我自己的問題......我終於無意中發現了spark.ml文檔中的一個示例,它展示瞭如何使用PipelineModel類的stages成員執行此操作。因此,對於例如我張貼以上,爲了訪問k均值聚類中心,執行:

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

其中fitKmeans是PipelineModel和2是k均值模型的所述陣列中的索引流水線階段。

參考:this page上的大多數例子的最後一行。

+4

這是荒謬可怕的 – maxymoo

相關問題