【问题标题】:how to add custom metrics to spark mlib evaluator?如何将自定义指标添加到 spark mllib 评估器?
【发布时间】:2018-10-26 00:06:18
【问题描述】:

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))

这些代码做了一些类型检查,所以如果我删除它,它会变通。但是,它似乎不安全和丑陋。那么,还有其他方法吗?任何帮助将不胜感激!

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    您可以使用 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()
    

    【讨论】:

    • 谢谢。如果我只想测量模型结果,这很有效。但我想做的是实现一个评估器,它可以使用原始工作流进行管道传输(以便进行搜索和其他操作),所以这可能行不通。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2014-01-28
    相关资源
    最近更新 更多