【问题标题】:PySpark: Calculate grouped-by AUCPySpark:按 AUC 计算分组
【发布时间】:2016-10-01 15:09:31
【问题描述】:
  • Spark 版本:1.6.0

我尝试计算按字段 id 分组的 AUC(ROC 下的区域)。给定以下数据:

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

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

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

更新

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

def auc(scoreAndLabels):
    return BinaryClassificationMetrics(scoreAndLabels).areaUnderROC

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

data.groupByKey()\
    .mapValues(auc)

(score, label) 的列表实际上是mapValues() 中的ResultIterable 类型,而BinaryClassificationMetrics 需要RDD

是否有任何方法可以将ResultIterable 转换为RDD 以便可以应用auc 函数?或者任何其他计算分组 AUC 的解决方法(不导入第三方模块,如 scikit-learn)?

【问题讨论】:

  • 使用第三方代码其实是一个不错的选择。虽然手动获得 AUC 并不难,但手动获得相当乏味。另一方面,如果单个类足够小,可以使用本地数据结构处理,则使用 BinaryClassificationMetrics 没有多大意义。

标签: python apache-spark pyspark apache-spark-mllib


【解决方案1】:

这是一种无需使用sklearn 即可获得auc 的方法:

keys = data.map(lambda x: x[0]).distinct().collect()
rslt = {}
for k in keys:
    scoreAndLabels = data.filter(lambda x: x[0]==k).flatMap(lambda x: x[1])
    rslt[k] = BinaryClassificationMetrics(scoreAndLabels).areaUnderROC

print(rslt)

注意:此解决方案要求key 的数量足够小以适合内存。

如果你有太多的键不能collect()它们进入内存,不要使用这个

【讨论】:

    【解决方案2】:

    您可以使用 sklearn.metrics.auc 并映射每个 RDD 元素值,而不是使用 BinaryClassificationMetrics,然后您将获得每个键的 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)]
    

    【讨论】:

    • 你的最后一行代码有一个小错字,应该是结果
    • 在这种情况下是否必须在 Spark 集群的每个节点上安装 sklearn?
    • 是的,你知道。在我启动集群后,我通常使用parallel-sshdsh 在所有机器上提供我需要的一切pip install
    猜你喜欢
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2019-06-16
    • 2011-06-21
    • 1970-01-01
    相关资源
    最近更新 更多