spark版本是2.3.1。
Spark-Mlib
库提供了BinaryClassificationEvaluator
(BinaryClassificationEvaluator.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))
这些代码会进行某种类型检查,因此如果我将其删除,它将可以解决。但是,这似乎不安全且丑陋。那么,还有另一种方法吗?任何帮助将不胜感激!
答案 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()