如何添加自定义指标以触发mlib评估程序?

时间:2018-10-25 15:10:15

标签: scala apache-spark

spark版本是2.3.1。

Spark-Mlib库提供了BinaryClassificationEvaluatorBinaryClassificationEvaluator.scala)类来评估算法,也可以用于搜索。但这只是假设两个指标

  val metric = $(metricName) match {
  case "areaUnderROC" => metrics.areaUnderROC()
  case "areaUnderPR" => metrics.areaUnderPR()
  //what i want todo
  case "areUnderXX"=> myCustomMetric()
}

我尝试添加更多内容,但是BinaryClassificationEvaluator的某些成员设置为private,因此我不能仅仅对其进行扩展。以下是无法在软件包外部查看的代码:

SchemaUtils.checkColumnTypes(schema, $(rawPredictionCol), Seq(DoubleType, new VectorUDT))
SchemaUtils.checkNumericType(schema, $(labelCol))

这些代码会进行某种类型检查,因此如果我将其删除,它将可以解决。但是,这似乎不安全且丑陋。那么,还有另一种方法吗?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您可以使用MulticlassMetrics。它提供了更多指标。例如,将DataFrame与标签和预测一起使用:

+---------+----------+
|label    |prediction|
+---------+-----+----+
|   1.0   |    0.0   |
|   0.0   |    0.0   |
+---------+----------+

您必须在 label 字段中旋转数据框

val metrics = df.select("prediction", labelName)
  .as[(Double, Double)]
  .rdd

val multim = new MulticlassMetrics(metrics)
val labels = multim.labels

val accuracy = multim.accuracy

println("Summary Statistics")
println(s"Accuracy = $accuracy")

labels.foreach { l =>
  println(s"Precision($l) = " + multim.precision(l))
}

// Recall by label
labels.foreach { l =>
  println(s"Recall($l) = " + multim.recall(l))
}

// False positive rate by label
labels.foreach { l =>
  println(s"FPR($l) = " + multim.falsePositiveRate(l))
}

您可以在https://spark.apache.org/docs/2.2.0/mllib-evaluation-metrics.html

中看到更多指标

根据所需的度量标准,也许应该将数据框与数据框一起处理。例如,如果您要计算混淆矩阵,则可以继续在“预测”列上进行旋转,例如:

df.groupBy("label").
      pivot("prediction", range)
      .count()
      .na.fill(0.0)
      .orderBy("label)
      .show()