以下代码博主所写,不一定准确,请勿乱用,如有参考,请注明地址。
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.spark.rdd.RDD
/**
* Created by cf on 17-8-31.
*/
class MyBinaryClassificationMetrics(scoreAndLabels:RDD[(Double, Double)]) extends Serializable {
val metrics = new BinaryClassificationMetrics(scoreAndLabels)
val auROC = metrics.areaUnderROC()
val auPR = metrics.areaUnderPR()
val testSize = scoreAndLabels.count
val TP = scoreAndLabels.filter{case (prediction, label) =>(prediction > 0.5) && (label > 0.5)}.count()
val TN = scoreAndLabels.filter{case (prediction, label) =>(prediction <= 0.5) && (label <= 0.5)}.count()
val FP = scoreAndLabels.filter{case (prediction, label) =>(prediction > 0.5) && (label <= 0.5)}.count()
val FN = scoreAndLabels.filter{case (prediction, label) =>(prediction <= 0.5) && (label > 0.5)}.count()
val accuracy = if(testSize == 0) 0 else (TP+TN)/(TP+TN+FP+FN).toDouble
val precision = if(TP+TN == 0) 0 else TP/(TP+TN).toDouble
val f1 = if(accuracy+precision == 0.0) 0 else 2 * accuracy * precision / (accuracy + precision)
}