auc介绍:AUC即ROC曲线下的面积,假设是一个二分类的问题,我们如果使用逻辑回归,需要设定一个阈值做分类,AUC的计算方法同时考虑了分类器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器作出合理的评价
roc曲线的横坐标和纵坐标分别是True Positive Rate(真阳率)、False Positive(伪阳率);
- TPRate的意义是所有真实类别为1的样本中,预测类别为1的比例。
- FPRate的意义是所有真实类别为0的样本中,预测类别为1的比例。
但是如果直接去计算,需要计算的是很多多边形的面积,这样肯定不方便计算;
AUC的理解:随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率的概率。AUC反应的是模型对样本的排序能力。它的统计意义是从所有正样本随机抽取一个正样本,从所有负样本随机抽取一个负样本,当前pred使得正样本排在负样本前面的概率。
第一种计算方式就是:根据定义,把正样本和负样本统计成两个列表,然后两个for循环去计算正样本大于负样本的个数,再除以所有的情况(正样本个数*负样本个数);
def auc(y_pred = [0.1,0.4,0.35,0.8], y_true = [0,0,1,1]):
pos_num, neg_num = [0, 0]
pos_list, neg_list = [], []
for idx,i in enumerate(y_true):
if i == 1:
pos_num += 1
pos_list.append(idx)
else:
neg_num += 1
neg_list.append(idx)
n = pos_num * neg_num
cnt = 0
for i in pos_list:
for j in neg_list:
if y_pred[i] > y_pred[j]:
cnt += 1
elif y_pred[i] == y_pred[j]:
cnt += 0.5
auc_val = cnt / n
return auc_val
#print(auc)
auc()
计算方法二:从统计意义来,例如:
首先按照pred升序
pred: [0.1 0.35 0.4 0.8]
true: [0 1 0 1 ]
然后在true == 1的情况下得到正样本排在负样本前面的个数,用rank表示就是
rank: [ 0 1 0 3],其实就是索引下标,但是包含了一些重复的情况,例如选择第4个,样本的时候,前面有个正样本的情况要除去;
如果有m个正样本和n个负样本,则第一个正样本需要减去m - 1个,第二个需要减去m - 2,依次类推,一共是1+2+...+m - 1 = m(m - 1) / 2;
所以,计算方式是:
def compute_auc(y_pred = [0.1,0.4,0.35,0.8], y_true = [0,0,1,1]):
f = list(zip(y_pred, y_true))
f = sorted(f,key = lambda x : x[0])
rank = [i for i in range(len(f)) if f[i][1] == 1]
pos_num, neg_num = [0, 0]
for i in range(len(y_true)):
if y_true[i] == 1:
pos_num += 1
else:
neg_num += 1
auc = (sum(rank) - pos_num*(pos_num-1)/2) / (pos_num*neg_num)
return auc
compute_auc()