美文网首页
AUC值计算与实现

AUC值计算与实现

作者: 牧小熊 | 来源:发表于2020-01-29 16:57 被阅读0次

AUC(Area under curve)是机器学习常用的二分类评测手段,直接含义是ROC曲线下的面积。
ROC曲线理解起来更加的复杂且计算工程更加麻烦,因此从计算概率的角度理解AUC
也可以理解为:随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率的概率。

那如何实现这样的计算呢?
我们从字面上的意思开始理解
一对样本,根据模型预测的结果,预测得到正样本的概率大于负样本概率的概率。
因此计算方法即为如下:

在有M个正样本,N个负样本的数据集里。
一共有 MxN 对样本(一对样本即,一个正样本与一个负样本)。
统计这 MxN 对样本里,正样本的预测概率大于负样本的预测概率的个数

image.png
举个例子:
class label pre
A 0 0.1
B 0 0.4
C 1 0.3
D 1 0.8

假设有4条样本。2个正样本,2个负样本,那么MxN=4
即总共有4个样本对。分别是:
(C,A), (C,B), (D,A), (D,B)

在(C,B)样本对中,正样本C预测的概率小于负样本B预测的概率(也就是C的得分比B低),记为0
在(D,B)样本对中,正样本D预测的概率大于负样本B预测的概率(也就是D的得分比B高),记为1
所以最后的AUC结果即为:
(C,A), (C,B), (D,A), (D,B) =1+0+1+1
总样本对为MxN=4
所以结果为:

image.png

如果遇见得分一样的呢?

class label pre
A 0 0.1
B 0 0.4
C 1 0.4
D 1 0.8

同样本是4个样本对,对于样本对(C,B)其I值为0.5。


image.png
from sklearn.metrics import roc_auc_score
def calcAUC(labels, probs):
    N = 0
    P = 0
    neg_prob = []
    pos_prob = []
    for _,i in enumerate(labels):
        if (i == 1):
            P += 1
            pos_prob.append(probs[_])
        else:
            N += 1
            neg_prob.append(probs[_])
    number = 0
    for pos in pos_prob:
        for neg in neg_prob:
            if (pos > neg):
                number += 1
            elif (pos == neg):
                number += 0.5
    return number / (N * P)

y = np.array([1,0,0,0,1,0,1,0,])
pred = np.array([0.9, 0.8, 0.3, 0.1,0.4,0.9,0.66,0.7])
print('auc=',calcAUC(y,pred))
print('roc_auc=',roc_auc_score(y,pred))
auc= 0.5666666666666667
roc_auc= 0.5666666666666667

上面的计算方法用了2个循环,时间复杂度高,因此我们对其进行如下优化。

首先按照预测的概率从小到高排列:

class label pre
A 0 0.1
C 1 0.3
B 0 0.4
D 1 0.8

显然比C小的就是A
比D小的就是A,B
C的位置是2 D的位置是4
2+4 =A+C+A+B+C+D -----------(1)
而我们的目标是:
1+2=A+A+B -----------(2)
因此需要将(1)式减去 C+C+D
显然就是将正样本进行排列然后用等差数列求和公式即:


image.png

所以最后的求解公式为:


image.png

如果出现预测相同的情况

class label pre rangk
A 0 0.1 1
B 1 0.5 2
C 1 0.5 3
D 0 0.5 4
E 0 0.5 5
F 1 0.8 6
G 1 0.9 7

那就是正负样本平分位置即可


image.png

用python实现:

import numpy as np
from sklearn.metrics import roc_curve
from sklearn.metrics import auc


def auc_calculate(labels,preds,n_bins=100):
    postive_len = sum(labels)   #正样本数量(因为正样本都是1)
    negative_len = len(labels) - postive_len #负样本数量
    total_case = postive_len * negative_len #正负样本对
    pos_histogram = [0 for _ in range(n_bins)] 
    neg_histogram = [0 for _ in range(n_bins)]
    bin_width = 1.0 / n_bins
    for i in range(len(labels)):
        nth_bin = int(preds[i]/bin_width)
        if labels[i]==1:
            pos_histogram[nth_bin] += 1
        else:
            neg_histogram[nth_bin] += 1
    accumulated_neg = 0
    satisfied_pair = 0
    for i in range(n_bins):
        satisfied_pair += (pos_histogram[i]*accumulated_neg + pos_histogram[i]*neg_histogram[i]*0.5)
        accumulated_neg += neg_histogram[i]
    return satisfied_pair / float(total_case)

if __name__ == '__main__':
    y = np.array([1,0,0,0,1,0,1,0,])
    pred = np.array([0.9, 0.8, 0.3, 0.1,0.4,0.9,0.66,0.7])

    fpr, tpr, thresholds = roc_curve(y, pred, pos_label=1)
    print("sklearn:",auc(fpr, tpr))
    print("验证:",auc_calculate(y,pred))

sklearn: 0.5666666666666667
验证: 0.5666666666666667

参考:
AUC计算的两种实现方式以及python代码
AUC详解与python实现

相关文章

  • AUC值计算与实现

    AUC(Area under curve)是机器学习常用的二分类评测手段,直接含义是ROC曲线下的面积。ROC曲线...

  • 机器学习评估指标02

    OC曲线与AUC值 ROC曲线绘制方法与AUC值计算方法 除了F1-Score以外,还有一类指标也可以很好的评估模...

  • AUC面试

    目录 混淆矩阵 ROC曲线 AUC定义 AUC计算 AUC 优点和缺点 AUC的python实现代码 1. 混淆矩...

  • AUC和ROC

    AUC(只能用于二分类) AUC值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的...

  • reportROC包绘制ROC曲线、计算约登指数及各种度

    reportROC包可以通过一行代码绘制ROC曲线及计算敏感性、特异性、准确率、阳性预测值,阴性预测值,AUC值及...

  • AUC计算

    思路 为最终比较划分好测试集和不存在边集【全集1-train-test-对角元】,根据集合中非零元【即边的数目】构...

  • 2 SVM(支持向量机法)vs 线性回归+ROC曲线

    step1 线性回归ROC与AUC的实现 这是计算affair的一个数据集 step2 绘图强大的一个包——pRO...

  • auc原理与实现

    auc AUC(Area under curve)是机器学习常用的二分类评测手段。AUC:一个正例,一个负例,预测...

  • 数据分析师笔试题1-常见聚类算法

    来源:小红书笔试-牛客网 一、算法基础 1 auc与 roc AUC:分类中一个正例,一个负例。预测为正的概率值比...

  • 逻辑回归模型的评估方法

    方法一:计算准确率 方法二:ROC/AUC

网友评论

      本文标题:AUC值计算与实现

      本文链接:https://www.haomeiwen.com/subject/jdjvthtx.html