AUC与ROC

ROC(Receiver Operating Characteristic)

主要分析工具是一个画在二维平面上的曲线——ROC curve。

平面的横坐标是 false positive rate(FPR),纵坐标是 true positive rate(TPR)。

相关概念

True Positive Rate(真正率 , TPR)或灵敏度(sensitivity)

T P R = 正 样 本 预 测 结 果 数 正 样 本 实 际 数 TPR=\frac{正样本预测结果数 }{正样本实际数} TPR=
T P R = T P T P + F N TPR = \frac{TP} {TP + FN} TPR=TP+FNTP

False Positive Rate (假正率, FPR)

F P R = 被 预 测 为 正 的 负 样 本 结 果 数 负 样 本 实 际 数 FPR = \frac{被预测为正的负样本结果数 }{负样本实际数 } FPR=

F P R = F P F P + T N FPR = \frac{FP} {FP + TN} FPR=FP+TNFP

False Negative Rate(假负率 , FNR)

F N R = 被 预 测 为 负 的 正 样 本 结 果 数 正 样 本 实 际 数 FNR = \frac{被预测为负的正样本结果数}{正样本实际数} FNR=
F N R = F N T P + F N FNR = \frac{FN} {TP + FN} FNR=TP+FNFN

True Negative Rate(真负率 , TNR)或特指度(specificity)

T N R = 负 样 本 预 测 结 果 数 负 样 本 实 际 数 TNR = \frac{负样本预测结果数 }{ 负样本实际数 } TNR=
T N R = T N T N + F P TNR = \frac{TN} {TN + FP} TNR=TN+FPTN

提出 R O C ROC ROC的原因

这里写图片描述
由分类器决定的统计的图像是固定的,但是由于阈值不同,我们可以得到不同的, T P R , F P R , T N R , F N R TPR,FPR,TNR,FNR TPR,FPR,TNR,FNR值。因此我们需要找到一个独立于阈值,只和分类器有关的衡量分类器的标准。还有是在样本正负样本不平衡的情况下更好的评估分类器的性能。

AUC (Area Under roc Curve)

AUC是一种用来度量分类模型好坏的一个标准,Auc作为数值可以直观的评价分类器的好坏,值越大越好。
几何意义:
$ROC $ 图像下方的面积
物理意义:
取出一个正样本与一个负样本,正样本的Score大于负样本的Score的概率,Score表示置信度

计算AUC

方法一:直接计算下方的面积,比较麻烦,需要计算若干个梯形的面积的和。
方法二:计算正样本score大于负样本的score的概率,时间复杂度为 O ( N ∗ M ) O(N*M) O(NM)
方法三:将所有的样本按照score升序排序,依次用rank表示他们,如最大score的样本,rank=n(n=N+M),其次为n-1。那么对于正样本中rank最大的样本,rank_max,有M-1个其他正样本比他score小,那么就有(rank_max-1)-(M-1)个负样本比他score小。其次为(rank_second-1)-(M-2)。
A U C = Σ 正 样 本 r a n k − M ∗ ( M + 1 ) 2 N ∗ M AUC = \frac{\Sigma_{正样本} rank -\frac{M*(M+1)}{2}}{N*M} AUC=NMΣrank2M(M+1)

Code

#-*- coding:utf-8 -*-
import pandas as pd
import numpy as np
from sklearn.metrics import roc_auc_score

def calc_auc(df):
    Score = sorted(df.values, key=lambda a_entry: a_entry[1])
    N = 0;M = 0
    for item in Score:
        if item[0] == 0:
            N += 1
        else:
            M += 1
    Sigma = 0
    for i in range(N+M-1,-1,-1):
        if Score[i][0] == 1:
            Sigma += i+1
    return float((Sigma-M*(M+1)/2.0)/(N*M))

def main():
    df = pd.read_csv('./data.csv',header=None)
    Ports = list(enumerate(np.unique(df[0])))
    Ports_dict ={label : i for i,label in Ports}
    df[0]=df[0].map(lambda x : Ports_dict[x]).astype(int)
    print roc_auc_score(df[0].values,df[1].values)
    print calc_auc(df)

if __name__ == '__main__':
    main()

data

p,0.9
p,0.8
p,0.6
n,0.7
p,0.54
p,0.55
n,0.53
n,0.52
p,0.51
n,0.505
p,0.4
n,0.39
p,0.38
n,0.37
n,0.36
n,0.35
p,0.34
n,0.33
p,0.3
n,0.1

参考资料

更多信息/快速联系博主

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值