Zel*_*ong 4 python apache-spark pyspark apache-spark-mllib
我尝试计算按字段分组的 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)