PySpark:计算按 AUC 分组

Zel*_*ong 4 python apache-spark pyspark apache-spark-mllib

  • 火花版本:1.6.0

我尝试计算按字段分组的 AUC(ROC 下的面积)id。给出以下数据:

# Within each key-value pair
# key is "id"
# value is a list of (score, label)
data = sc.parallelize(
         [('id1', [(0.5, 1.0), (0.6, 0.0), (0.7, 1.0), (0.8, 0.0)),
          ('id2', [(0.5, 1.0), (0.6, 0.0), (0.7, 1.0), (0.8, 0.0))
         ]
Run Code Online (Sandbox Code Playgroud)

BinaryClassificationMetrics可以计算给定列表的 AUC (score, label)

我想通过键计算 AUC(即id1, id2)计算 AUC。但是如何class通过键将 a“映射”到 RDD 呢?

更新

我尝试将其包装BinaryClassificationMetrics在一个函数中:

def auc(scoreAndLabels):
    return BinaryClassificationMetrics(scoreAndLabels).areaUnderROC
Run Code Online (Sandbox Code Playgroud)

然后将包装函数映射到每个值:

data.groupByKey()\
    .mapValues(auc)
Run Code Online (Sandbox Code Playgroud)

但列表实际上(score, label)是在ResultIterablemapValues()BinaryClassificationMetrics在预期的RDD

有什么方法可以将 转换ResultIterable为以便可以应用RDD该函数吗?auc或者有任何其他计算分组 AUC 的解决方法(无需导入 scikit-learn 等第三方模块)?

小智 5

BinaryClassificationMetrics您可以使用sklearn.metrics.auc 并映射每个 RDD 元素值,而不是使用它,您将获得每个键的 AUC 值:

from sklearn.metrics import auc

data = sc.parallelize([
         ('id1', [(0.5, 1.0), (0.6, 0.0), (0.7, 1.0), (0.8, 0.0)]),
         ('id2', [(0.5, 1.0), (0.6, 0.0), (0.7, 1.0), (0.8, 0.0)])])

result_aucs = data.map(lambda x: (x[0] + '_auc', auc(*zip(*x[1]))))
result_aucs.collect()


Out [1]: [('id1_auc', 0.15000000000000002), ('id2_auc', 0.15000000000000002)]
Run Code Online (Sandbox Code Playgroud)