2016-02-26 11 views
8

Ho utilizzato org.apache.spark.ml.Pipeline per attività di apprendimento automatico. È particolarmente importante conoscere le probabilità effettive anziché solo un'etichetta prevista, e ho difficoltà a ottenerlo. Qui sto facendo un compito di classificazione binaria con foresta casuale. Le etichette delle classi sono "Sì" e "No". Vorrei esprimere la probabilità per l'etichetta "Sì". Le probabilità sono memorizzate in un DenseVector come output della pipeline, come [0,69, 0,31], ma non so quale sia corrispondente a "Sì" (0,69 o 0,31?). Immagino che ci dovrebbe essere in qualche modo per recuperarlo da labelIndexer?Come ottenere probabilità corrispondenti alla classe dalla foresta casuale Spark ML

Ecco il mio codice compito per il training del modello

val sc = new SparkContext(new SparkConf().setAppName(" ML").setMaster("local")) 
val data = .... // load data from file 
val df = sqlContext.createDataFrame(data).toDF("label", "features") 
val labelIndexer = new StringIndexer() 
         .setInputCol("label") 
         .setOutputCol("indexedLabel") 
         .fit(df) 

val featureIndexer = new VectorIndexer() 
         .setInputCol("features") 
         .setOutputCol("indexedFeatures") 
         .setMaxCategories(2) 
         .fit(df) 


// Convert indexed labels back to original labels. 
val labelConverter = new IndexToString() 
    .setInputCol("prediction") 
    .setOutputCol("predictedLabel") 
    .setLabels(labelIndexer.labels) 

val Array(trainingData, testData) = df.randomSplit(Array(0.7, 0.3)) 


// Train a RandomForest model. 
val rf = new RandomForestClassifier() 
    .setLabelCol("indexedLabel") 
    .setFeaturesCol("indexedFeatures") 
    .setNumTrees(10) 
    .setFeatureSubsetStrategy("auto") 
    .setImpurity("gini") 
    .setMaxDepth(4) 
    .setMaxBins(32) 

// Create pipeline 
val pipeline = new Pipeline() 
    .setStages(Array(labelIndexer, featureIndexer, rf,labelConverter)) 

// Train model 
val model = pipeline.fit(trainingData) 

// Save model 
sc.parallelize(Seq(model), 1).saveAsObjectFile("/my/path/pipeline") 

Poi mi caricare il pipeline e fare previsioni su nuovi dati, e qui è il codice pezzo

// Ignoring loading data part 

// Create DF 
val testdf = sqlContext.createDataFrame(testData).toDF("features", "line") 
// Load pipeline 
val model = sc.objectFile[org.apache.spark.ml.PipelineModel]("/my/path/pipeline").first 

// My Question comes here : How to extract the probability that corresponding to class label "1" 
// This is my attempt, I would like to output probability for label "Yes" and predicted label . The probabilities are stored in a denseVector, but I don't know which one is corresponding to "Yes". Something like this: 
val predictions = model.transform(testdf).select("probability").map(e=> e.asInstanceOf[DenseVector]) 

riferimenti in merito alla probabilità ed etichette per RF: http://spark.apache.org/docs/latest/ml-classification-regression.html#random-forests

+0

Che cosa si intende con questo "Vorrei uscita probabilità per l'etichetta '1' e predetto etichetta. Le probabilità sono memorizzati in un DenseVector come l'uscita gasdotto, ma non so quale è corrispondente a "1". "? – eliasah

+0

Ciao, ho aggiornato la descrizione. Fondamentalmente voglio produrre la probabilità corrispondente all'etichetta "Sì". – Qing

risposta

-1

vuoi dire che vuoi estrarre la probabilità di etichetta positiva nel DenseVector? Se è così, puoi creare una funzione udf per risolvere la probabilità. Nel DenseVector della classificazione binaria, la prima colonna presenta la probabilità di "0" e la seconda colonna presenta "1".

val prediction = pipelineModel.transform(result) 
val pre = prediction.select(getOne($"probability")).withColumnRenamed("UDF(probability)","probability")