Ho utilizzato org.apache.spark.ml.Pipeline per attività di apprendimento automatico. È particolarmente importante conoscere le probabilità effettive anziché solo un'etichetta prevista, e ho difficoltà a ottenerlo. Qui sto facendo un compito di classificazione binaria con foresta casuale. Le etichette delle classi sono "Sì" e "No". Vorrei esprimere la probabilità per l'etichetta "Sì". Le probabilità sono memorizzate in un DenseVector come output della pipeline, come [0,69, 0,31], ma non so quale sia corrispondente a "Sì" (0,69 o 0,31?). Immagino che ci dovrebbe essere in qualche modo per recuperarlo da labelIndexer?Come ottenere probabilità corrispondenti alla classe dalla foresta casuale Spark ML
Ecco il mio codice compito per il training del modello
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")
Poi mi caricare il pipeline e fare previsioni su nuovi dati, e qui è il codice pezzo
// 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])
riferimenti in merito alla probabilità ed etichette per RF: http://spark.apache.org/docs/latest/ml-classification-regression.html#random-forests
Che cosa si intende con questo "Vorrei uscita probabilità per l'etichetta '1' e predetto etichetta. Le probabilità sono memorizzati in un DenseVector come l'uscita gasdotto, ma non so quale è corrispondente a "1". "? – eliasah
Ciao, ho aggiornato la descrizione. Fondamentalmente voglio produrre la probabilità corrispondente all'etichetta "Sì". – Qing