【发布时间】: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