2016-05-26 21 views
1

Ich habe versucht, Precision, Recall by Threshold für LogisticRegression mit LBFGS unter Verwendung von BinaryclassificationMetrics zu berechnen. Ich habe all diese. Ich versuchte herauszufinden, ob ich eine grafische Ausgabe der PR- und AUC-Kurve erhalten könnte.Bewertungsmetrik für binäre Klassifizierung in Spark: AUC- und PR-Kurve

einfügen meine Codes unter:

import org.apache.spark.mllib.classification.LogisticRegressionWithLBFGS 
import org.apache.spark.mllib.evaluation.{BinaryClassificationMetrics, MulticlassMetrics} 
import org.apache.spark.mllib.linalg.Vectors 
import org.apache.spark.mllib.regression.LabeledPoint 
import org.apache.spark.rdd.RDD 
import org.apache.spark.{SparkConf, SparkContext} 



object log_reg_eval_metric { 

    def main(args: Array[String]): Unit = { 


    System.setProperty("hadoop.home.dir", "c:\\winutil\\") 


    val sc = new SparkContext(new SparkConf().setAppName("SparkTest").setMaster("local[*]")) 

    val sqlContext = new org.apache.spark.sql.SQLContext(sc); 

    val data: RDD[String] = sc.textFile("C:/Users/user/Documents/spark-1.5.1-bin-hadoop2.4/data/mllib/credit_approval_2_attr.csv") 


    val parsedData = data.map { line => 
     val parts = line.split(',').map(_.toDouble) 
     LabeledPoint(parts(0), Vectors.dense(parts.tail)) 
    } 

    //Splitting the data 
    val splits: Array[RDD[LabeledPoint]] = parsedData.randomSplit(Array(0.7, 0.3), seed = 11L) 
    val training: RDD[LabeledPoint] = splits(0).cache() 
    val test: RDD[LabeledPoint] = splits(1) 



    // Run training algorithm to build the model 
    val model = new LogisticRegressionWithLBFGS() 
     .setNumClasses(2) 
     .run(training) 
    // Clear the prediction threshold so the model will return probabilities 
    model.clearThreshold 

    // Compute raw scores on the test set 
    val predictionAndLabels = test.map { case LabeledPoint(label, features) => 
     val prediction = model.predict(features) 
     (prediction, label) 
    } 

    // Instantiate metrics object 
    val metrics = new BinaryClassificationMetrics(predictionAndLabels) 

    // Precision by threshold 
    val precision = metrics.precisionByThreshold 
    precision.foreach { case (t, p) => 
     println(s"Threshold: $t, Precision: $p") 
    } 


    // Precision-Recall Curve 
    val PRC = metrics.pr 

    print(PRC) 



    } 
} 

Ausgabe von print (PRC):

UnionRDD[39] at union at BinaryClassificationMetrics.scala:108 

Ich bin nicht sicher, was eine Gewerkschaft RDD ist und wie es zu benutzen. Gibt es eine andere Möglichkeit, die grafische Ausgabe zu erhalten? Ich forsche darüber. Jeder Vorschlag wäre großartig.

+0

Die 'Pr' Methode gibt ein RDD von (Precision, Recall) Paare. Vielleicht sollten Sie einige Werkzeuge verwenden, um Graphen mit diesen Punkten auszugeben (Entschuldigung, ich weiß sehr wenig von Scala). –

+0

Ich traf das gleiche Problem, haben Sie das gelöst? –

Antwort

1

Sie können BinaryLogisticRegressionTrainingSummary aus spark.ml Paket verwenden. Es bietet PR und ROC-Werte out of Box als Datenrahmen.

Sie können Eingangs diese Werte in jedem Rendering-Dienstprogramm die spezifischen Kurven zu sehen. (Alle mehrzeiligen Grundstück mit x- und y-Werte werden die Kurven angezeigt werden.)

+0

Danke Prashant. Ich muss den hier verwendeten Datenrahmen verstehen. –