【机器学习】AUC/GAUC计算公式和代码实战

AUC计算公式

在这里插入图片描述

用到的数据

  1. result_v1 预测值文件
0 149416:1 1477513:1 2939262:1
0 166919:1 395399:1 1320293:1
0 1010289:1 4966769:1 3607361:1
1 164204:1 4082554:1 1464116:1
0 201240:1 1386825:1 149192:1
0 1010603:1 4920866:1 2520771:1
0 141606:1 2063107:1 3046934:1
1 179757:1 2302267:1 4763051:1
0 161876:1 1501215:1 238434:1
0 123817:1 5122835:1 824180:1

  1. test_shuffle 样本数据
0.011547
0.00102014
0.000152839
0.0492006
0.00437087
0.0680863
0.0278944
0.0531025
0.0158617
0.0288056

具体代码

def calAUC(prob,labels):
    """
    计算AUC主题逻辑
    :param prob:
    :param labels:
    :return:
    """

    # 组装预测值、标签,返回 List[(0.011547, 1), (0.00102014, 0), (0.000152839, 1)] 形式
    f = list(zip(prob, labels))
    # 以预测值为key进行排序,得到rank,记录了按照预测值排序后的label
    rank = [values2 for values1, values2 in sorted(f, key=lambda x:x[0])]
    # rankList记录了rank中正样本的位置(从1开始)
    rankList = [i+1 for i in range(len(rank)) if rank[i]==1]
    posNum = 0
    negNum = 0
    # 遍历label列表,查找正负样本数
    for i in range(len(labels)):
        if labels[i] == 1:
            posNum += 1
        else:
            negNum += 1
    auc = 0
    # 计算AUC, 计算公式 AUC = {正样本位置的和 - [正样本数*(正样本数+1)]/2} / 正样本数*负样本数
    auc = (sum(rankList) - (posNum*(posNum+1))/2)/(posNum*negNum)
    return auc


y = []
pred = []
with open("result_v1", 'r') as infile:
    for line in infile:
        pred.append(float(line.strip()))
with open("data/test_shuffle", 'r') as infile:
    for line in infile:
        y.append(int(line.strip().split(' ')[0]))

print(calAUC(pred,y))

GAUC:Group AUC

为什么要引入GAUC:因为AUC有时候不能满足推荐/广告系统中用户个性化的需求
【机器学习】AUC/GAUC计算公式和代码实战_第1张图片

你可能感兴趣的:(机器学习)