一、什么是AUC?
- 机器学习中的AUC(Area Under the Curve)是一个重要的评估指标,特别是在二分类问题中。
- AUC特指ROC曲线(Receiver Operating Characteristic Curve)下的面积,用于衡量分类器区分正负类的能力。
-
在机器学习和统计分类中,正负类(Positive Class 和 Negative Class)是二分类问题中的两个类别标签。这两个标签是相对的,并没有固定的含义,而是根据具体问题的上下文来定义的。
- 正类(Positive Class):通常用于表示我们感兴趣或希望模型能够正确识别出来的类别。在不同的应用场景中,正类的具体含义可能会有所不同。例如,在医疗诊断中,正类可能代表“患病”;在欺诈检测中,正类可能代表“欺诈行为”;在电子邮件分类中,正类可能代表“垃圾邮件”。
- 负类(Negative Class):则是与正类相对的类别,表示我们不特别感兴趣或希望模型能够识别出来以避免的类别。同样地,负类的具体含义也取决于问题的上下文。继续上面的例子,在医疗诊断中,负类可能代表“健康”;在欺诈检测中,负类可能代表“正常交易”;在电子邮件分类中,负类可能代表“非垃圾邮件”。
-
- AUC值越大,表示模型的性能越好,即模型能够更好地区分正负样本。
1、什么是ROC曲线?
-
ROC曲线(Receiver Operating Characteristic Curve,受试者工作特征曲线)是一种用于评估分类模型性能的图形化方法,特别是在二分类问题中。ROC曲线通过绘制真正例率(True Positive Rate, TPR)与假正例率(False Positive Rate, FPR)的关系来展示模型在不同阈值下的性能。
-
在说明 TPR 和 FPR 是什么意思之前,先来了解一下混淆矩阵
-
混淆矩阵的基本结构如下:
_ 预测为正类别 预测为负类别 实际为正类别 True Positive (TP) False Negative (FN) 实际为负类别 False Positive (FP) True Negative (TN) -
True Positive (TP): 模型将实际为正类别的样本正确预测为正类别。
-
False Negative (FN): 模型将实际为正类别的样本错误预测为负类别。
-
False Positive (FP): 模型将实际为负类别的样本错误预测为正类别。
-
True Negative (TN): 模型将实际为负类别的样本正确预测为负类别。
-
-
真正例率(True Positive Rate, TPR):也称为灵敏度(Sensitivity)或召回率(Recall),是正确预测的正例占所有实际正例的比例。
- TPR= (TP+FN) / TP
其中,TP是真正例的数量,FN是假负例的数量。
- TPR= (TP+FN) / TP
-
假正例率(False Positive Rate, FPR):是错误预测为正例的负例占所有实际负例的比例。
- FPR= (FP+TN) / FP
其中,FP是假正例的数量,TN是真负例的数量。
- FPR= (FP+TN) / FP
-
阈值(Threshold):在分类问题中,模型通常会输出一个介于0和1之间的概率值,表示属于某个类别的概率。通过设置不同的阈值(比如0.5),可以将概率值转换为类别标签(0或1)。
2、ROC曲线的绘制
- ROC曲线是通过在不同阈值下计算TPR和FPR的值,并将这些点绘制在二维坐标图上得到的。横轴是FPR,纵轴是TPR。理想情况下,我们希望模型的ROC曲线尽可能接近左上角(FPR=0, TPR=1),这表示模型具有高灵敏度和高特异性。
- 正常训练模型所画出的ROC曲线如下图所示:
- 绿色曲线便是ROC曲线
- 阴影部分的面积便是AUC的值
- 理想状态下的ROC曲线
- 实际训练模型很难达到
- 实际训练模型很难达到
二、如何计算AUC的值
-
AUC有两种计算方法,这里我们介绍用公式求解的方法
-
下面是一个经过很多复杂的推到得到的求解公式
- M——>正样本的个数
- N——>负样本的个数
- 表示将为正样本的序列值相加
-
例子:
-
假设有4个样本,对应的真实标签有 1 和 0 , 并经过一个二分类模型训练后,所得到为正样本的概率,这里我们规定标签为1的是正样本(其实就是结果为标签1的概率)
样本 真实标签 模型预测的概率 A 0 0.1 B 0 0.4 C 1 0.35 D 1 0.8 -
按概率升序排列后得到:
样本 真实标签 模型预测的概率 rank A 0 0.1 1 C 1 0.35 2 B 0 0.4 3 D 1 0.8 4 -
按照上面的公式,只把正样本的序号加起来也就是只把样本C,D的rank值加起来后减去一个常数项:M(M+1)/2 ,再除以正负样本数量的乘积
-
AUC的计算为:
- AUC = [ (4+2) -2*(2+1)/2]/2*2=0.75
-
-
如果出现概率相等的情况又该如何计算呢?
-
下面的例子中有4个样本测试后的概率为0.5,而且既有正样本也有负样本的情况
-
计算的时候,其实原则就是相等概率的rank取平均值
样本 真实标签 模型预测的概率 A 1 0.8 B 1 0.7 C 0 0.5 D 0 0.5 E 1 0.5 F 1 0.5 G 0 0.3 -
排序:
样本 真实标签 模型预测的概率 rank G 0 0.3 1 F 1 0.5 2 E 1 0.5 3 D 0 0.5 4 C 0 0.5 5 B 1 0.7 6 A 1 0.8 7 -
这里需要注意的是:相等概率的样本,无论正负,谁在前,谁在后无所谓。
-
由于只考虑正样本的rank值:
- 对于正样本A,其rank值为7
- 对于正样本B,其rank值为6
- 对于正样本E,其rank值为(5+4+3+2)/4
- 对于正样本F,其rank值为(5+4+3+2)/4
-
AUC的计算为:
- AUC = [ 7 + 6 +(5+4+3+2)/4 + (5+4+3+2)/4 - 4*(4+1)/2] / 4*3 = 10/12=5/6
-
三、代码实现AUC值的计算
-
可以直接调用Python中 sklearn.metrics 类中 roc_auc_score() 方法
-
只需要将数据的真实标签和模型预测为正例的概率传入即可计算出结果
-
我们将上面示例中的数据传入,得出结果
import numpy as np from sklearn.metrics import roc_auc_score y_label_1 = np.array([0, 0, 1, 1]) x_scores_1 = np.array([0.1, 0.4, 0.35, 0.8]) AUC_1 = roc_auc_score(y_label_1, x_scores_1) print(AUC_1) # 结果为:0.75 y_label_2 = np.array([1, 1, 0, 0, 1, 1, 0]) x_scores_2 = np.array([0.8, 0.7, 0.5, 0.5, 0.5, 0.5, 0.3]) AUC_2 = roc_auc_score(y_label_2, x_scores_2) print(AUC_2) # 结果为:0.8333333333333334
-
对比可以看出,代码计算出的结果与例子中计算的结果一致
四、AUC的优缺点
- 优点
- 衡量排序能力:AUC主要关注模型对样本的排序能力,即能否将正样本排在负样本之前,适合排序类任务。
- 对正负样本均衡不敏感:在样本不均衡的情况下,AUC仍然能够提供有效的评估,不会像准确率等指标那样受到样本比例的影响。
无阈值依赖:AUC是一种无阈值依赖的评估指标,它不需要设定一个具体的分类阈值来判断样本的类别。这使得AUC在评估模型性能时更加灵活和稳定。
- 缺点
- 忽略预测概率值:AUC主要关注排序能力,而忽略了预测的具体概率值。这可能导致在某些情况下无法准确反映模型的拟合程度。例如,当模型对所有样本的预测概率都接近时,即使AUC值较高,模型的预测能力也可能较差。
- 信息笼统:AUC反应的信息较为笼统,无法直接反映召回率、精确率等实际业务关心的指标。因此,在评估模型性能时,还需要结合其他评估指标进行综合考量。
- 无法衡量样本内部排序:AUC只关心正负样本之间的排序,而不关心正负样本内部的排序。这可能导致在某些个性化推荐等场景中无法准确评估模型的性能。