2016-02-26 11 views
8

Używam org.apache.spark.ml.Pipeline dla zadań uczenia maszynowego. Szczególnie ważne jest poznanie rzeczywistych prawdopodobieństw zamiast tylko przewidywanej etykiety i mam trudności z jej uzyskaniem. Tutaj robię zadanie klasyfikacji binarnej z losowym lasem. Etykiety klas to "Tak" i "Nie". Chciałbym wyprowadzić prawdopodobieństwo dla etykiety "Tak". Prawdopodobieństwa są przechowywane w DenseVector jako dane wyjściowe potoku, takie jak [0,69, 0,31], ale nie wiem, który z nich odpowiada "Tak" (0,69 lub 0,31?). Sądzę, że powinno być jakiś sposób na odzyskanie go z labelIndexer?Jak uzyskać prawdopodobieństwa odpowiadające klasie z losowego lasu Spark ML

Oto mój kod zadaniem szkolenia model

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") 

Wtedy załadować rurociągu i dokonać prognozy na nowych danych, a tu jest kawałek Kod

// 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]) 

Referencje Odnośnie do prawdopodobieństwa i etykiety dla RF: http://spark.apache.org/docs/latest/ml-classification-regression.html#random-forests

+0

Co masz na myśli przez to "Chciałbym wyjściowe prawdopodobieństwo na etykiecie«1»i przewidywane etykietę. Prawdopodobieństwa są przechowywane w DenseVector jako wyjścia rurociągu, ale nie wiem który z nich odpowiada do "1". "? – eliasah

+0

Witam Zaktualizowałem opis. Zasadniczo chcę wyprowadzić prawdopodobieństwo odpowiadające etykiecie "Tak". – Qing

Odpowiedz

-1

czy masz na myśli, że chcesz wyodrębnić prawdopodobieństwo pozytywnej etykiety w DenseVector? Jeśli tak, możesz utworzyć funkcję udf, aby rozwiązać prawdopodobieństwo. W DenseVector klasyfikacji binarnej, pierwszy col przedstawia prawdopodobieństwo "0", a drugie col przedstawia "1".

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