python实现AUC

问题描述:

在牛客看到面经说手撕AUC,所以实现一下。首先要明白AUC的物理含义不仅是ROC曲线下的面积,AUC还有另外一个物理含义就是:给定正样本M个,负样本N个,以及他们的预测概率(0-1)之间,那么AUC的含义就是所有穷举所有的正负样本对,如果正样本的预测概率大于负样本的预测概率,那么就+1;如果如果正样本的预测概率等于负样本的预测概率,那么就+0.5, 如果正样本的预测概率小于负样本的预测概率,那么就+0;最后把统计处理的个数除以M×N就得到我们的AUC,公式描述如下:

            

代码实现:

对比了sklearn中auc的计算值,验证算法的正确性。

def AUC(label, pre):
  """
  适用于python3.0以上版本
   """
  #计算正样本和负样本的索引,以便索引出之后的概率值
    pos = [i for i in range(len(label)) if label[i] == 1]
    neg = [i for i in range(len(label)) if label[i] == 0]

    auc = 0
    for i in pos:
        for j in neg:
            if pre[i] > pre[j]:
                auc += 1
            elif pre[i] == pre[j]:
                auc += 0.5

    return auc / (len(pos)*len(neg))


if __name__ == '__main__':
    label = [1,0,0,0,1,0,1,0]
    pre = [0.9, 0.8, 0.3, 0.1, 0.4, 0.9, 0.66, 0.7]
    print(AUC(label, pre))

    from sklearn.metrics import roc_curve, auc
    fpr, tpr, th = roc_curve(label, pre , pos_label=1)
    print('sklearn', auc(fpr, tpr))

 

reference:
AUC详解与python实现

 

你可能感兴趣的:(python实现AUC)