2015-10-19 14 views
11

Ho una pipeline spark.ml in Spark 1.5.1 che consiste in una serie di trasformatori seguita da uno stimatore k-means. Voglio essere in grado di accedere allo KMeansModel .clusterCenters dopo aver installato la pipeline, ma non riesco a capire come. Esiste un equivalente spark.ml della caratteristica pipeline.named_steps di sklearn?È possibile accedere agli attributi dello stimatore nelle pipeline spark.ml?

Ho trovato this answer che offre due opzioni. Il primo funziona se prendo il mio modello k-means dalla mia pipeline e lo adattare separatamente, ma in qualche modo sconfigge lo scopo di una pipeline. La seconda opzione non funziona: ricevo error: value getModel is not a member of org.apache.spark.ml.PipelineModel.

EDIT: Esempio gasdotto:

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) 

Così ora fitKmeans è di tipo org.apache.spark.ml.PipelineModel. La mia domanda è: come posso accedere ai centri di cluster calcolati dal modello k-means contenuto in questa pipeline? Come notato sopra, quando non contenuto in una pipeline, questo può essere fatto con fitKmeans.clusterCenters.

+0

Quello che stai chiedendo non è chiaro! Ti piacerebbe riformulare con un [MCVE] (http://stackoverflow.com/help/mcve)? – eliasah

+0

@eliasah Ok, aggiunto un esempio. – hilarious

risposta

18

Rispondere alla mia domanda ... Alla fine mi sono imbattuto in un esempio in profondità nei documenti spark.ml che mostra come farlo usando il membro stages della classe PipelineModel. Quindi per l'esempio ho postato sopra, al fine di accedere alla k-mezzi di centri di cluster, vedere:

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

dove fitKmeans è un PipelineModel e 2 è l'indice del modello k-means nella matrice di fasi del gasdotto

Riferimento: l'ultima riga della maggior parte degli esempi su this page.

+4

questo è ridicolo e fantastico – maxymoo

Problemi correlati