Scala Spark: рассчитать сгруппированы по AUC - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь вычислить AUC (область под ROC), сгруппированную по ключевому полю, используя API Scala, аналогично следующему вопросу: PySpark: вычисление сгруппировано по AUC .

К сожалению, я не могу использовать sklearn. Как я могу продолжить?

1 Ответ

0 голосов
/ 27 августа 2018

Мы будем использовать тот же метод, что и в sklearn / mllib, который является Трапециевидным правилом .Это метод, используемый для аппроксимации определенного интеграла.

Это довольно просто, вы можете найти тот же код в исходном коде .

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|
// +---+--------------------+-------------------+

Надеюсь, это поможет.

...