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))这些代码做了一些类型检查,所以如果我删除它,它可以解决。但是,它似乎是不安全和丑陋的。那么,有没有别的办法呢?任何帮助都将不胜感激!
发布于 2018-10-25 23:51:22
您可以使用MulticlassMetrics。它提供了更多的指标。以使用带有标签和预测的DataFrame为例:
+---------+----------+
|label |prediction|
+---------+-----+----+
| 1.0 | 0.0 |
| 0.0 | 0.0 |
+---------+----------+您必须为数据帧 label字段设置pivot
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()https://stackoverflow.com/questions/52992639
复制相似问题