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