apache-spark - 斯卡拉 Spark : Calculate grouped-by AUC

标签 apache-spark apache-spark-sql apache-spark-mllib apache-spark-ml

我正在尝试使用 Scala API 计算按关键字段分组的 AUC(ROC 下的面积),类似于以下问题:PySpark: Calculate grouped-by AUC .

不幸的是,我不能使用sklearn。我该如何进行?

最佳答案

我们将使用 sklearn/mllib 中使用的相同方法,即 Trapezoidal rule .这是一种用于逼近定积分的技术。

非常简单,您可以在 source code 中找到相同的代码.

def trapezoid(points: Seq[(Double, Double)]): Double = {
    require(points.length == 2)
    val x = points.head
    val y = points.last
    (y._1 - x._1) * (y._2 + x._2) / 2.0
}

def areaUnderCurve(curve: Iterable[(Double, Double)]): Double = {
    curve.toIterator.sliding(2).withPartial(false).aggregate(0.0)(
      seqop = (auc: Double, points: Seq[(Double, Double)]) => auc + trapezoid(points),
      combop = _ + _
    )
}

val seq = Seq((0.0, 0.0), (1.0, 1.0), (2.0, 3.0), (3.0, 0.0))
areaUnderCurve(seq)
// res77: Double = 4.0 

结果如预期的那样是 4.0

现在让我们将其应用于数据集。数据已在此处按键分组:

val data = Seq(("id1", Array((0.5, 1.0), (0.6, 0.0), (0.7, 1.0), (0.8, 0.0))), ("id2", Array((0.5, 1.0), (0.6, 0.0), (0.7, 1.0), (0.8, 0.3)))).toDF("key","values")

case class Record(key : String, values : Seq[(Double,Double)])

data.as[Record].map(r => (r.key, r.values, areaUnderCurve(r.values))).show
// +---+--------------------+-------------------+
// | _1|                  _2|                 _3|
// +---+--------------------+-------------------+
// |id1|[[0.5, 1.0], [0.6...|0.15000000000000002|
// |id2|[[0.5, 1.0], [0.6...|0.16500000000000004|
// +---+--------------------+-------------------+

希望对您有所帮助。

关于apache-spark - 斯卡拉 Spark : Calculate grouped-by AUC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52034650/

相关文章:

java - 将 Spark Dataframe 写入 JSON 会丢失 MLLIB 稀疏 vector 的格式

intellij-idea - 如何高效地使用 SBT、Spark 和 "provided"依赖项?

scala - 在 Apache Spark DataFrame 中,如何删除所有非 None 值都相同的所有列?

apache-spark - Spark 是否在内部跨节点分发数据帧?

python - 将两个 Spark mllib 管道连接在一起

apache-spark - 如何在 Java 中将 String 映射到 Spark 中的 Seq<String>

apache-spark - Hive 元存储中的上次访问时间更新

apache-spark - 如何调试 Spark 工作线程上的映射函数中的错误?

scala - 如果我继续在其中添加列,是否应该保留一个Spark数据框?

python - 过滤 Spark Dataframe 中的列以查找每个元素的百分比