auc介绍:AUC即ROC曲线下的面积,假设是一个二分类的问题,我们如果使用逻辑回归,需要设定一个阈值做分类,AUC的计算方法同时考虑了分类器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器作出合理的评价

python AUC手写代码 python auc函数_正例

roc曲线的横坐标和纵坐标分别是True Positive Rate(真阳率)、False Positive(伪阳率);

  • TPRate的意义是所有真实类别为1的样本中,预测类别为1的比例。
  • FPRate的意义是所有真实类别为0的样本中,预测类别为1的比例。

但是如果直接去计算,需要计算的是很多多边形的面积,这样肯定不方便计算;

AUC的理解:随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率的概率。AUC反应的是模型对样本的排序能力。它的统计意义是从所有正样本随机抽取一个正样本,从所有负样本随机抽取一个负样本,当前pred使得正样本排在负样本前面的概率。

第一种计算方式就是:根据定义,把正样本和负样本统计成两个列表,然后两个for循环去计算正样本大于负样本的个数,再除以所有的情况(正样本个数*负样本个数);

def auc(y_pred = [0.1,0.4,0.35,0.8], y_true = [0,0,1,1]):
    pos_num, neg_num = [0, 0]
    pos_list, neg_list = [], []
    for idx,i in enumerate(y_true):
        if i == 1:
            pos_num += 1
            pos_list.append(idx)
        else:
            neg_num += 1
            neg_list.append(idx)
    n = pos_num * neg_num
    cnt = 0
    for i in pos_list:
        for j in neg_list:
            if y_pred[i] > y_pred[j]:
                cnt += 1
            elif y_pred[i] == y_pred[j]:
                cnt += 0.5
    auc_val = cnt / n
    return auc_val
    #print(auc)
auc()

计算方法二:从统计意义来,例如:

首先按照pred升序

pred: [0.1 0.35 0.4 0.8]

true: [0      1      0     1 ]

然后在true == 1的情况下得到正样本排在负样本前面的个数,用rank表示就是

rank: [ 0 1 0 3],其实就是索引下标,但是包含了一些重复的情况,例如选择第4个,样本的时候,前面有个正样本的情况要除去;

如果有m个正样本和n个负样本,则第一个正样本需要减去m - 1个,第二个需要减去m - 2,依次类推,一共是1+2+...+m - 1 = m(m - 1) / 2;

所以,计算方式是:

def compute_auc(y_pred = [0.1,0.4,0.35,0.8], y_true = [0,0,1,1]):
    f = list(zip(y_pred, y_true))
    f = sorted(f,key = lambda x : x[0])
    rank = [i for i in range(len(f)) if f[i][1] == 1]
    pos_num, neg_num = [0, 0]
    for i in range(len(y_true)):
        if y_true[i] == 1:
            pos_num += 1
        else:
            neg_num += 1
    auc = (sum(rank) - pos_num*(pos_num-1)/2) / (pos_num*neg_num)
    
    return auc
compute_auc()