2016-05-26 2 views
1

J'essayais de calculer Precision, Recall par Threshold pour LogisticRegressionwithLBFGS en utilisant BinaryclassificationMetrics. J'ai tout ça. J'essayais de comprendre si je pouvais obtenir une sortie graphique de la courbe PR et AUC.Métriques d'évaluation pour la classification binaire dans Spark: courbe AUC et PR

mes codes ci-dessous coller:

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) 



    } 
} 

sortie de print (PRC):

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

Je ne sais pas ce qui est un RDD syndical et comment l'utiliser. Y a-t-il un autre moyen d'obtenir la sortie graphique? Faire mes recherches dessus. Toute suggestion serait géniale.

+0

La méthode 'Pr' renvoie un RDD de (précision, rappel) paires. Peut-être que vous devriez utiliser quelques outils pour produire un graphique avec ces points (désolé je sais très peu de scala). –

+0

J'ai rencontré le même problème, avez-vous résolu cela? –

Répondre

1

Vous pouvez utiliser BinaryLogisticRegressionTrainingSummary à partir du fichier spark.ml. Il fournit les valeurs PR et ROC en tant que données.

Vous pouvez saisir ces valeurs à tout rendu utilitaire pour voir les courbes spécifiques. (Toute parcelle multiligne avec des valeurs x et y affiche les courbes.)

+0

Merci Prashant. Je dois utiliser le cadre de données ici compris. –