AUC(Area under curve)是机器学习常用的二分类评测手段,直接含义是ROC曲线下的面积。另一种解释是:随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率的概率。
在有M个正样本,N个负样本的数据集里,利用公式求解:
\[
AUC=\frac{\sum_{i \in positiveClass} rank_i-\frac{M(1+M)}{2}}{M*N}
\]
在python实现中,相当于使用了计数排序,因为概率是一个小数,我们同时乘以100取整数进行排序(也可以根据精度调整)。在排完序后,我们就可以得到正样本概率大于负样本概率的个数,再加上正样本概率等于负样本概率的个数的一半,除以总共的样本数(M*N),即可得到最终的AUC值。
def AUC(labels,preds,n_bins=100): m = sum(labels) n = len(labels) - m total_case = m * n pos = [0 for _ in range(n_bins)] neg = [0 for _ in range(n_bins)] bin_width = 1.0 / n_bins for i in range(len(labels)): nth_bin = int(preds[i]/bin_width) if labels[i]==1: pos[nth_bin] += 1 else: neg[nth_bin] += 1 accumulated_neg = 0 satisfied_pair = 0 for i in range(n_bins): satisfied_pair += (pos[i]*accumulated_neg + pos[i]*neg[i]*0.5) accumulated_neg += neg[i] return satisfied_pair / total_case y = [1,0,0,0,1,0,1,0,] pred = [0.9, 0.8, 0.3, 0.1,0.4,0.9,0.6,0.7] print(AUC(y, pred, n_bins=100))
作为机器学习中的经典评价准则,AUC的计算也作为面试笔试常考的算法题。