Scala Spark:计算分组的 AUC

Posted

技术标签:

【中文标题】Scala Spark:计算分组的 AUC【英文标题】:Scala Spark : Calculate grouped-by AUC 【发布时间】:2018-08-27 07:35:32 【问题描述】:

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

很遗憾,我不能使用sklearn。我该如何进行?

【问题讨论】:

【参考方案1】:

我们将使用与 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|
// +---+--------------------+-------------------+

我希望这会有所帮助。

【讨论】:

非常感谢。更重要的是,我明白阅读源代码的重要性 @nick_liu 学习框架的最好方法是阅读它的源代码。

以上是关于Scala Spark:计算分组的 AUC的主要内容,如果未能解决你的问题,请参考以下文章

Scala中的Spark分组映射UDF

数据框:如何在 Scala 中分组/计数然后按计数排序

如何在 Spark 中找到分组数据的准确中位数

Spark集群搭建记录 | 云计算[CentOS7] | Scala Maven项目访问Spark实现单词计数

如何使用 Spark Scala 计算 Bin 平均值?

spark 例子groupByKey分组计算