2016-02-26 11 views
8

Makine öğrenimi görevleri için org.apache.spark.ml.Pipeline'ı kullanıyorum. Öngörülen bir etiket yerine gerçek olasılıkları bilmek özellikle önemlidir ve bunu elde etmekte güçlük çekiyorum. Burada rastgele orman ile ikili bir sınıflandırma görevi yapıyorum. Sınıf etiketleri "Evet" ve "Hayır" dır. "Evet" etiketinin çıktısını almak istiyorum. Olasılıklar, [0.69, 0.31] gibi boru hattı çıkışı olarak bir DenseVector'da saklanır, ancak hangisinin "Evet" e (0.69 veya 0.31?) Karşılık geldiğini bilmiyorum. Ben labelIndexer dan onu almak için bir yol olmalı? İşte Spark ML rastgele ormandan sınıfa karşılık gelen olasılıklar nasıl elde edilir

Sonra boru hattı yük ve yeni veriler üzerinde tahminlerde bulunsun modeli

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

eğitimi için benim görev Kodu ve burada ilişkin kod parçayı

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

Kaynaklar olduğunu RF: http://spark.apache.org/docs/latest/ml-classification-regression.html#random-forests

+0

bu '1 "Ben etiket için çıkış olasılığının istiyoruz' ve etiketi öngördü. olasılıkları boru hattı çıktı olarak bir DenseVector saklanır, ama karşılık gelen hangisinin bilmiyorum 1'e". " ? – eliasah

+0

Merhaba Açıklamayı güncelledim. Temel olarak, "Evet" etiketine karşılık gelen olasılığın çıktılarını vermek istiyorum. – Qing

cevap

-1

için olasılıklar ve etiketler, pozitif etiket olasılığını çıkarmak istediğiniz anlamına gelir DenseVector? Eğer öyleyse, olasılığı çözmek için bir udf fonksiyonu yaratabilirsiniz. İkili sınıflandırma DenseVector'da, ilk sütun "0" ve ikinci "1" harflerinin sunulma olasılığını gösterir. Eğer demek istiyorsunuz ne

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