AUC是什么?代码这么实现?
Probabilistic interpretation of AUC
The Probabilistic Interpretation of AUC
AUC时ROC曲线下的面积。 ROC通过FP(假阳性)和TP(真阳性)计算。 对于二分类需要考虑混淆矩阵
ROC(receiver operating characteristic curve) 通过 TPR 和 FPR得到
通过FPR为横轴, TPR为纵轴,在不同分类置信度阈值下,可以绘制ROC曲线。如下图,ROC一定会经过(0, 0), (1, 1):
AUC是ROC曲线下的面积。ROC曲线有一个很好的性质,在测试集正负样本分布变化的时候,ROC曲线保持不变。AUC计算方式主要有两种:
- 从预测的置信度排序,按照排序后由高到低选择选择阈值,计算对应TPR和 FPR 绘制曲线
- AUC具有概率学上的意义:随机选取一个正样本和一个负样本,分类器给正样本打分大于分类器给负样本打分的概率。使用组合数学求解
公式中 M 和 N 分别为正负样本个数。rank是将样本按照置信度排序后,置信度最高的样本rank=M+N
python 代码如下, 来自AUC曲线计算方法及代码实现:
import numpy as np
from sklearn.metrics import roc_auc_score
def calc_auc(y_labels, y_scores):
f = list(zip(y_scores, y_labels))
rank = [values2 for values1, values2 in sorted(f, key=lambda x: x[0])]
rankList = [i + 1 for i in range(len(rank)) if rank[i] == 1]
pos_cnt = np.sum(y_labels == 1)
neg_cnt = np.sum(y_labels == 0)
auc = (np.sum(rankList) - pos_cnt * (pos_cnt + 1) / 2) / (pos_cnt * neg_cnt)
return auc
def get_score():
# 随机生成100组label和score
y_labels = np.zeros(100)
y_scores = np.zeros(100)
for i in range(100):
y_labels[i] = np.random.choice([0, 1])
y_scores[i] = np.random.random()
return y_labels, y_scores
if __name__ == '__main__':
y_labels, y_scores = get_score()
print('sklearn AUC:', roc_auc_score(y_labels, y_scores))
print(calc_auc(y_labels, y_scores))