2016-02-26 23 views
8

Tôi đã sử dụng org.apache.spark.ml.Pipeline cho các tác vụ học máy. Điều đặc biệt quan trọng là phải biết xác suất thực tế thay vì chỉ là nhãn được dự đoán và tôi gặp khó khăn để có được nó. Ở đây tôi đang làm một nhiệm vụ phân loại nhị phân với rừng ngẫu nhiên. Các nhãn lớp là "Có" và "Không". Tôi muốn xuất xác suất cho nhãn "Có". Xác suất được lưu trữ trong một DenseVector như đầu ra đường ống, chẳng hạn như [0,69, 0,31], nhưng tôi không biết cái nào tương ứng với "Có" (0,69 hoặc 0,31?). Tôi đoán có nên được someway để lấy nó từ labelIndexer?Cách nhận xác suất tương ứng với lớp học từ rừng ngẫu nhiên Spark ML

Đây là Mã nhiệm vụ của tôi cho đào tạo các mô hình

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

Sau đó, tôi sẽ được tải các đường ống dẫn và đưa ra dự đoán trên dữ liệu mới, và đây là mảnh đang

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

Tài liệu tham khảo liên quan đến các xác suất và nhãn cho RF: http://spark.apache.org/docs/latest/ml-classification-regression.html#random-forests

+0

Bạn có ý nghĩa gì với điều này "Tôi muốn xác suất đầu ra cho nhãn" 1 "và nhãn dự đoán. Các xác suất được lưu trữ trong DenseVector làm đầu ra đường ống, nhưng tôi không biết cái nào tương ứng đến 1". " ? – eliasah

+0

Xin chào, tôi đã cập nhật mô tả. Về cơ bản tôi muốn xuất ra xác suất tương ứng với nhãn "Có". – Qing

Trả lời

-1

bạn có nghĩa là bạn muốn trích xuất xác suất của nhãn dương trong DenseVector? Nếu có, bạn có thể tạo hàm udf để giải quyết xác suất. Trong DenseVector phân loại nhị phân, cột đầu tiên trình bày xác suất của "0" và dấu hai thứ hai của "1".

val prediction = pipelineModel.transform(result) 
val pre = prediction.select(getOne($"probability")).withColumnRenamed("UDF(probability)","probability") 
Các vấn đề liên quan