AUC理解与实现

AUC(Area under Curve)是衡量二分类模型性能的指标,表示ROC曲线下的面积。通过理解ROC曲线及其生成过程,可以知道AUC反映了模型区分正负样本的能力,不受类别不平衡影响。文章介绍了AUC的直观解释、计算方法(包括暴力方法、优化方法和近似方法)以及优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文仅用于自我学习,理清思路,并作为笔记保留下来。这是我的第一篇博客,如有不妥,请多多指教。

AUC理解

AUC(Area under curve)是机器学习常用的二分类评测手段,直接含义是ROC曲线下的面积,如下图:
这里写图片描述

要理解这张图的含义,得先理解下面这个表:
这里写图片描述
表中列代表预测分类,行代表实际分类:
实际1,预测1:真正类(tp)
实际1,预测0:假负类(fn)
实际0,预测1:假正类(fp)
实际0,预测0:真负类(tn)
真实负样本总数=n=fp+tn
真实正样本总数=p=tp+fn

在第一张图中,
横坐标false positive rate 代表假正类率,由fp/n计算得到,
意为 在实际负样本中出现预测正样本的概率。
纵坐标true positive rate 代表真正类率,由tp/p计算得到,
意为 在实际正样本中出现预测正样本的概率。


为什么这样一个指标可以衡量分类效果?

先来看看如何得到这条曲线:
1. 通过分类器得到每个样本的预测概率,对其从高到低进行排序
2. 从高到低,分别以每一个预测概率作为阈值,大于该阈值的认定其为1,小于的为0,计算fp rate和tp rate。

对于一个有分类效果(效果比随机要好)的分类器,刚开始将高概率作为阈值时,阈值以上的真正样本占全部正样本的比例(tp rate)>阈值以上的假正样本占全部负样本的比例(fp rate)。

这里说起来有点绕,直观理解起来就是,对于一个有作用的分类器,预测概率越大,样本预测正确的概率就越大,因此在对概率进行排序后,实际正样本会集中在排序靠前的位置,排序越前,实际正样本就越集中。对于一个完全没有作

### AUC计算方法的Python实现对比 AUC(Area Under Curve)是一种用于衡量二分类模型性能的重要指标,其核心思想是通过ROC曲线下的面积来反映模型区分正负样本的能力。以下是几种常见的AUC计算方法及其Python实现。 #### 方法一:基于定义手动实现 根据AUC的核心定义——即随机抽取一个正样本和一个负样本时,正样本预测得分高于负样本的概率,可以手动编写代码实现这一逻辑: ```python def auc(y_true, y_pred): n_pos = sum([1 for y in y_true if y == 1]) # 正样本数量 n_neg = sum([1 for y in y_true if y == 0]) # 负样本数量 rank_sum = 0 for i in range(len(y_true)): if y_true[i] == 1: for j in range(len(y_true)): if y_true[j] == 0 and y_pred[i] > y_pred[j]: rank_sum += 1 elif y_true[j] == 0 and y_pred[i] == y_pred[j]: rank_sum += 0.5 return rank_sum / (n_pos * n_neg) y_true = [1]*5 + [0]*5 y_pred = [0.9]*3 + [0.2]*7 auc_manual = auc(y_true, y_pred) print(f"AUC Manual Implementation: {auc_manual:.4f}") ``` 这种方法虽然直观,但在大规模数据集上效率较低[^1]。 --- #### 方法二:基于排序法实现 另一种常见的方式是通过对预测值进行排序后统计正负样本之间的相对位置关系: ```python def auc_sort(y_true, y_pred): combined = list(zip(y_pred, y_true)) combined.sort(key=lambda x: x[0], reverse=True) # 按预测值降序排列 pos_rank_sum = 0 count_pos = 0 for idx, (_, label) in enumerate(combined): if label == 1: pos_rank_sum += (idx + 1) count_pos += 1 expected_rank_sum = count_pos * (len(y_true) + 1) / 2 auc_value = (pos_rank_sum - count_pos * (count_pos + 1) / 2) / (count_pos * (len(y_true) - count_pos)) return auc_value y_true = [1]*5 + [0]*5 y_pred = [0.9]*3 + [0.2]*7 auc_sort_implementation = auc_sort(y_true, y_pred) print(f"AUC Sort Implementation: {auc_sort_implementation:.4f}") ``` 此方法的时间复杂度优于逐对比较的方法,在实际应用中更为高效[^2]。 --- #### 方法三:使用`sklearn.metrics.roc_auc_score` 作为最常用的标准库之一,`scikit-learn`提供了内置函数`roc_auc_score`,可以直接调用来快速获得AUC值: ```python from sklearn.metrics import roc_auc_score y_true = [1]*5 + [0]*5 y_pred = [0.9]*3 + [0.2]*7 auc_sklearn = roc_auc_score(y_true, y_pred) print(f"AUC Sklearn Implementation: {auc_sklearn:.4f}") ``` 该方法不仅简单易用,而且经过优化后的运行速度非常快,适合处理大型数据集[^2]。 --- #### 对比分析 为了验证不同方法的一致性,可以通过相同的输入数据分别计算三种方式的结果,并打印出来以便观察差异: ```python if __name__ == "__main__": y_true = [1]*5 + [0]*5 y_pred = [0.9]*3 + [0.2]*7 auc_manual_result = auc(y_true, y_pred) auc_sort_result = auc_sort(y_true, y_pred) auc_sklearn_result = roc_auc_score(y_true, y_pred) print(f"AUC Manual Result: {auc_manual_result:.4f}") print(f"AUC Sort Result: {auc_sort_result:.4f}") print(f"AUC Sklearn Result: {auc_sklearn_result:.4f}") ``` 理论上,如果实现无误,则以上三个结果应完全一致[^3]。 --- #### 总结 尽管手动实现有助于深入理解AUC的本质含义,但对于日常开发工作而言,推荐优先采用成熟的第三方库如`scikit-learn`中的现成工具,这样既能节省时间又能保证准确性[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值