ROC曲线及其绘制

 真正类率(true positive rate)                        计算公式 TPR = TP/( TP+FN) 

 TP : 正确肯定的数目                                   FN:漏报,没有正确找到的匹配的数目。

指的是分类器所识别的,正实例占所有正实例的比例。

负正类率(false positive rate)                        计算公式 FPR = FP/(FP+TN)

计算的是分类器错认为正类的负实例所占实例的比例。

ROC曲线的横纵坐标分别为负正类率,真正类率。

ROC曲线用于评价一个分类器,如果说已确定了一个阈值,那么大于这个阈值的实例就归为正类,小于这个值就归为负类。

ROC曲线指受试者工作特征曲线 / 接收器操作特性曲线(receiver operating characteristic curve), 是反映敏感性和特异性连续变量的综合指标,是用构图法揭示敏感性和特异性的相互关系,它通过将连续变量设定出多个不同的临界值,从而计算出一系列敏感性和特异性,再以敏感性为纵坐标、(1-特异性)为横坐标绘制成曲线,曲线下面积越大,诊断准确性越高。在ROC曲线上,最靠近坐标图左上方的点为敏感性和特异性均较高的临界值。

在理想情况下,TPR应接近1,FPR应接近0,ROC曲线上的每一个点对应一个阈值,对于一个分类器,每个临界值下会有一个TPR和FPR。当threshold最大时,TP=FP=0 对应于原点,threshold最小时,TN = FN =0,对应于右上角的点(1,1)。随着阈值的增加TP和FP都减小,ROC曲线向右下移动。

AUC值为ROC曲线所覆盖的区域面积AUC越大,分类器分类效果越好。

当AUC = 1,是完美分类器

0.5< AUC<1,优于随机猜测,是有预测价值的。

AUC = 0.5,那么说明这个模型是没有价值的。

AUC< 0.5,那么比随机预测还要差。

ROC曲线及AUC面积计算代码(python)

import pylab as pl
from math import log,exp,sqrt

evaluate_result = "D:/huatu.txt" # 文本文档的路径
db = [] #创建一个data base
pos ,neg = 0, 0
with open(evaluate_result , 'r') as fs:
    for line in fs:
        nonclk, clk, score = line.strip().split('\t')#负样本,正样本,预测的分数
        nonclk = int( nonclk)
        clk = int(clk)
        score = float(score)#转换数据类型
        db.append([score,nonclk,clk])
        pos += clk
        neg += nonclk
db = sorted(db, key = lambda x:x[0], reverse = True)#降序

#计算ROC坐标点
xy_arr = []
tp, fp = 0. ,0.
for i in range(len(db)):
    tp += db[i][2]
    fp += db[i][1]
    xy_arr.append([tp/neg , fp/pos])

#计算曲线面积AUC
auc = 0.
prev_x = 0
for x,y in xy_arr:
    if x! = prev_x:
         auc += (x-prec_x)*y
         prev_x = x
print "the auc is %s." %auc
x = [_v[0] for _v in xy_arr]
y = [_v[1] for _v in xy_arr]
pl.title("Roc curve of %s (AUC = %.4f)" ('svm',auc))
pl.xlabel("False Positive Rate")
pl.ylabel("True Positive Rate")
pl.plot(x,y)
pl.show()
        

 

   

你可能感兴趣的:(ROC曲线及其绘制)