分享

使用pyspark Accumulator

smfswxj 发表于 2017-12-5 17:41:14 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 1 6398
怎么利用pyspark累加器 accumulator统计文档中访问jpg元素日志行出现的次数,最好有具体步骤,刚学不知道该怎么使用。

2013-09-15.rar

52.3 KB, 下载次数: 2

已有(1)人评论

跳转到指定楼层
nextuser 发表于 2017-12-5 18:22:50
一般使用Scala,对于Python不太熟悉。它们应该都是类似的。
这里提供下使用Accumulator统计指标,如果转换的过程中有问题,可以相互讨论,共同进步

  评价分类模型的性能时需要用到以下四个指标
1.png

最开始使用以下代码计算,发现代码需要跑近一个小时,而且这一个小时都花在这四行代码上


[mw_shl_code=bash,true]# evaluate model
TP = labelAndPreds.filter(lambda (v, p): (v == 1 and p == 1)).count()
FP = labelAndPreds.filter(lambda (v, p): (v == 0 and p == 1)).count()
TN = labelAndPreds.filter(lambda (v, p): (v == 0 and p == 0)).count()
FN = labelAndPreds.filter(lambda (v, p): (v == 1 and p == 0)).count()[/mw_shl_code]
心想着理论上可以只扫描一遍数据就可以计算出这四个指标。
一开始在foreach函数中传递一个自定义评估函数,这个函数来统计上面四个指标,然后在函数里再使用全局变量TP,TN等。
但是程序跑完四个指标都还是0,跟初始化时候的一样。后来查资料,发现pyspark有Accumulator(累加器)可以解决这个问题。

代码如下:

[mw_shl_code=bash,true]# evaluate model
TP = sc.accumulator(0)  #一开始直接用的TP = 0
FP = sc.accumulator(0)
TN = sc.accumulator(0)
FN = sc.accumulator(0)
def assess(v, p):
    global TP
    global FP
    global TN
    global FN   
    #print 'tgl\t',v,p
    if(v == 1 and p == 1):
        TP += 1
    if(v == 0 and p == 1):
        FP += 1
    if(v == 0 and p == 0):
        TN += 1
    if(v == 1 and p == 0):
        FN += 1
print 'assess model %s' % time.ctime()
labelAndPreds.foreach(lambda(v,p): assess(v, p))
print "TP=", TP
print "FP=", FP
print "TN=", TN
print "FN=", FN
if (TP.value + FP.value) != 0:
      print "The precision = " + str(TP.value*1.0 / (TP.value+FP.value))
if (TP.value + FN.value) != 0:
      print "The recall = " + str(TP.value*1.0 / (TP.value+FN.value))[/mw_shl_code]


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条