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
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
Witam Zaktualizowałem opis. Zasadniczo chcę wyprowadzić prawdopodobieństwo odpowiadające etykiecie "Tak". – Qing