AUC如何计算

AUC计算

AUC简言

AUC(Area Under Curve)是机器学习二分类模型中非常常用的评估指标,相比于F1-Score对项目的不平衡有更大的容忍性,目前常见的机器学习库中(比如scikit-learn)一般也都是集成该指标的计算,但是有时候模型是单独的或者自己编写的,此时想要评估训练模型的好坏就得自己搞一个AUC计算模块,本文在查询资料时发现libsvm-tools有一个非常通俗易懂的auc计算,因此抠出来用作日后之用。

步骤

AUC如何计算_第1张图片
AUC如何计算_第2张图片

参考:http://www.cnblogs.com/maybe2030/p/5375175.html

面积法

#! -*- coding=utf-8 -*-
import pylab as pl
from math import log,exp,sqrt
 
evaluate_result="you file path"
db = [] #[score,nonclk,clk]
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][3]
 xy_arr.append([fp/neg,tp/pos])
 
#计算曲线下面积
auc = 0. 
prev_x = 0
for x,y in xy_arr:
 if x != prev_x:
 auc += (x - prev_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)# use pylab to plot x and y
pl.show()# show the plot on the screen

sklearn接口

from sklearn.metrics import roc_auc_score
score = [1.1,0.2,3.4,5.1,2.1,0.4,2.4]
label = [0,0,1,0,1,0,0]
auc = roc_auc_score(label,score)
print 'AUC:',auc

Rnak评分法

def getAuc(labels, pred):
    '''将pred数组的索引值按照pred[i]的大小正序排序,返回的sorted_pred是一个新的数组,
       sorted_pred[0]就是pred[i]中值最小的i的值,对于这个例子,sorted_pred[0]=8
    '''
    sorted_pred = sorted(range(len(pred)), key=lambda i: pred[i])
    pos = 0.0  # 正样本个数
    neg = 0.0  # 负样本个数
    auc = 0.0
    last_pre = pred[sorted_pred[0]]
    count = 0.0
    pre_sum = 0.0  # 当前位置之前的预测值相等的rank之和,rank是从1开始的,所以在下面的代码中就是i+1
    pos_count = 0.0  # 记录预测值相等的样本中标签是正的样本的个数
    for i in range(len(sorted_pred)):
        if labels[sorted_pred[i]] > 0:
            pos += 1
        else:
            neg += 1
        if last_pre != pred[sorted_pred[i]]:  # 当前的预测概率值与前一个值不相同
            # 对于预测值相等的样本rank需要取平均值,并且对rank求和
            auc += pos_count * pre_sum / count
            count = 1
            pre_sum = i + 1  # 更新为当前的rank
            last_pre = pred[sorted_pred[i]]
            if labels[sorted_pred[i]] > 0:
                pos_count = 1  # 如果当前样本是正样本 ,则置为1
            else:
                pos_count = 0  # 反之置为0
        else:
            pre_sum += i + 1  # 记录rank的和
            count += 1  # 记录rank和对应的样本数,pre_sum / count就是平均值了
            if labels[sorted_pred[i]] > 0:  # 如果是正样本
                pos_count += 1  # 正样本数加1
    auc += pos_count * pre_sum / count  # 加上最后一个预测值相同的样本组
    auc -= pos * (pos + 1) / 2  # 减去正样本在正样本之前的情况
    auc = auc / (pos * neg)  # 除以总的组合数
    return auc

你可能感兴趣的:(机器学习)