详解 F1 Score,P-R,ROC,AUC

本文深入解析了机器学习中常用的评估指标,包括混淆矩阵、查准率、查全率、F1分数、ROC曲线、AUC值等,通过实例演示了如何在Python环境下使用sklearn库进行计算。

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

一、混淆矩阵(confusion matrix)

对于二分类问题来说,可将样例根据其真实类别与模型预测类别的组合划分为真正例(true positive)、假正例(false positive)、真反例(true negative)、假反例(false negative)四种情况,其混淆矩阵(confusion matrix)如下:

预测值(正例)预测值(反例)
真实值(正例)TP(真正例)FN(假反例)
真实值(反例)FP(假正例)TN(真反例)
  • TP(True Positives,真正例):预测为正,真实为正, 预测对了
  • FN (False Negatives,假反例):预测为反,真实为正,预测错了
  • FP(False Positives,假正例):预测为正,真实为反,预测错了
  • TN(True Negatives,真反例):预测为反,真实为反,预测对了

显然有,TP + FN + FP + TN = 样例总数。

定义查准率(Precision)和查全率(Recall)分别为:

P = T P T P + F P P = \frac{TP}{TP+FP} P=TP+FPTP

R = T P T P + F N R = \frac{TP}{TP+FN} R=TP+FNTP

正如他们的汉语意思,

  • 查准率(Precison):所有预测值为正例的样本里,真实值为正例的样本所占的比例
  • 查全率(Recall):所有真实值为正例的样本里,预测值为正例的样本所占的比例

查准率和查全率是一对矛盾的度量,一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。

二、PR

从上面可以看出,不同的情况下我们希望对查准率和查全率有个权衡选择,在某些情况下希望查准率更高,在另一些情况下希望查全率更高。

这里就引出了阈值的概念,对于同一个样本数据,设置不同的阈值,查准率和查全率会随之改变。因为我们的二分类器输出的是预测为正样本的概率,是一个范围在 [0, 1] 之间的数值,选择一个阈值,当预测的概率超过这个阈值时,我们就认为预测为正例。

比如在判别是否为垃圾邮件的时候,设置阈值为 0.6,在模型的输出概率大于 0.6 时,就认为预测是正例。

理解了阈值的概念,在对查准率和查全率进行权衡选择时,就可以选择不同的阈值,根据 P-R 曲线来判断。

以查准率为纵轴,查全率为横轴作图,得到的查准率-查全率曲线,就叫P-R 曲线
P-R曲线与平衡点示意图

在进行比较时,如果一个曲线被另一个曲线完全包住,则可断言后者的性能优于前者。如图所示模型 A 的性能优于模型 C;如果两个模型的 P-R 曲线发生了交叉,如图中的 A 和 B,则难以断言两者孰优孰劣,这时就需要其他方法来综合考虑查准率、查全率的性能度量。

F1 Score 就是这样一种性能度量方法,公式为:

F 1 = 2 ∗ P ∗ R P + R F1=\frac{2*P*R}{P+R} F1=P+R2PR

在实际生活中,在某些情况下我们会更加关注查准率(Precision),也就是希望查准率高一些,在另一些情况下会更加希望查全率(Recall)能够高一些。

比如,在医学模型判断癌症病人中,我们希望能够在所有真实患病的人里,尽可能多的检查出患病者,也就是希望查全率(Recall)高一点,因为无病诊断为有病去治疗总比漏掉癌症病人好;

而我是非常爱吃西瓜的人,在我每次去买西瓜的时候,我总是希望买到的瓜是甜瓜的概率大一点,即在有限的买瓜次数(所有预测值为正例的样本里),真实值为甜瓜(样本值为正例)的概率大,也就是希望查准率(Precision)高一点。

这时就需要F1 度量的一般形式 F β F_{\beta} Fβ,让我们表达出对查准率/查全率的不同偏好,定义为:

F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R F_{\beta}=\frac{\left(1+\beta^{2}\right) \times P \times R}{\left(\beta^{2} \times P\right)+R} Fβ=(β2×P)+R(1+β2)×P×R

其中, β > 0 {\beta}>0 β>0 度量了查准率对查全率的相对重要性, β = 1 {\beta}=1 β=1 时为 F1 Score, β > 1 {\beta}>1 β>1 时查准率有更大影响, β < 1 {\beta}<1 β<1 时查全率有更大影响。

注:

F1 是基于查准率和查全率的调和平均定义的:

1 F 1 = 1 2 ( 1 P + 1 R ) \frac{1}{F1}=\frac{1}{2}(\frac{1}{P}+\frac{1}{R}) F11=21(P1+R1)

F β F_{\beta} Fβ 为加权调和平均:

1 F β = 1 1 + β 2 ( 1 P + β 2 R ) \frac{1}{F_{\beta}}=\frac{1}{1+{\beta}^{2}}(\frac{1}{P}+\frac{{\beta}^{2}}{R}) Fβ1=1+β21(P1+Rβ2)

与算术平均和几何平均相比,调和平均更重视较小值。

上述 F1 值只是在二分类中,我们可以轻易扩展到多分类中。多分类中我们可以使用 OneVsRest 的策略,判断第 i 类的分类时,把不属于第 i 类的看做另一类,就能对每一类都算出一个 F1 值了。使用宏平均(macro)或者微平均(micro)来考量多分类的效果。宏平均是多个分类 F1 值相加,而微平均是多个 F1 分子分母分别相加。

macro-F1 ⁡ = 1 N ∑ i N F i micro-F1 ⁡ = 2 ∑ i N P i R i ∑ i N P i + R i \begin{aligned} \operatorname{macro-F1} &=\frac{1}{N} \sum_{i}^{N} F_{i} \\\operatorname{micro-F1} &=\frac{2 \sum_{i}^{N} P_{i} R_{i}}{\sum_{i}^{N} P_{i}+R_{i}} \end{aligned} macro-F1micro-F1=N1iNFi=iNPi+Ri2iNPiRi

三、ROC

ROC 全称是「受试者工作特征」(Receiver Operating Characteristic)曲线,纵轴是「真正例率」(True Positive Rate,简称 TPR),横轴是「假正例率」(False Positive Rate,简称 FPR),定义为:

T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP

F P R = F P F P + T N FPR=\frac{FP}{FP+TN} FPR=FP+TNFP

TPR 的定义是和 Recall 是一样的。TPR 和 FPR 分别描述了在正负样本里(正样本=TP+FN,负样本=FP+TN),TP和 FP 样本所占的比例。与 PR 曲线一样,我们可以通过调整阈值,来改变 TPR 和 FPR,如图所示:

ROC曲线与AUC示意图

实际中利用有限个测试样例来绘制 ROC 曲线时,仅能获得有限个(真正例率,假正例率)坐标对,无法产生图(a)中的光滑 ROC 曲线,只能绘制出图(b)所示的近似 ROC 曲线,与 P-R 图类似,如果一个曲线被另一个曲线完全包住,则可断言后者的性能优于前者;如果两个模型的 ROC 曲线发生交叉,则难以断言两者孰优孰劣,此时需要比较 ROC 曲线下的面积,即 AUC 曲线。

四、AUC

AUC(Area Under ROC Curve)是 ROC 曲线与横轴构成的面积。

如何计算 AUC 呢?

这里给出西瓜书中的一种近似计算 AUC 的方法,即把 AUC 近似为 ROC 曲线下的每个矩形的面积之和,公式为:

A U C = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ( y i + y i + 1 ) AUC=\frac{1}{2} \sum_{i=1}^{m-1}\left(x_{i+1}-x_{i}\right)\left(y_{i}+y_{i+1}\right) AUC=21i=1m1(xi+1xi)(yi+yi+1)

其他实现方法,如 Mann-Witney U statistic 这里不再叙述。

五、P-R 与 ROC 的比较

  • P-R 曲线以查准率(Precision)为纵轴,查全率(Recall)为横轴;

    ROC 曲线以真正例率(TPR)为纵轴,假正例率(FPR)为横轴;
    在这里插入图片描述

  • 随着正负样本分布的变化,ROC 曲线的形状不会发生很大的变化,而 P-R 曲线会发生很大的变化。

img

​ 如上图测试集负样本数量增加 10 倍以后 P-R 曲线发生了明显的变化,而 ROC 曲线形状基本不变。在实际环境中,正负样本的数量往往是不平衡的,所以这也解释了为什么 ROC 曲线使用更为广泛。

五、代码实现

sklearn 库中的手写数字数据集为例:

from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
from sklearn.metrics import precision_recall_curve
import matplotlib.pyplot as plt
# 导入数据集
digits = datasets.load_digits()
print(digits.DESCR)
X = digits.data
y = digits.target.copy()
# 构造偏斜数据,将数字9的对应索引的元素设置为1,0~8设置为0
y[digits.target == 9] = 1
y[digits.target != 9] = 0
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
# 使用逻辑回归做分类
lr = LogisticRegression()
lr.fit(X_train, y_train)
y_predict = lr.predict(X_test)
matrix = confusion_matrix(y_test, y_predict)
decision_scores = lr.decision_function(X_test)
# P-R曲线
precision, recall, thresholds1 = precision_recall_curve(y_test, decision_scores)
plt.plot(precision, recall)
plt.show()
print(thresholds1)
# ROC曲线
fprs, tprs, thresholds2 = roc_curve(y_test, decision_scores)
plt.plot(fprs, tprs)
plt.show()
# AUC
print(roc_auc_score(y_test, decision_scores))

参考资料:

本系列为参加自公众号「数据科学家联盟」的机器学习小组的系列笔记

【数据科学家学习小组】之机器学习(第一期)第二周

03-12
<think>好的,我现在要详细解答用户关于AUC-ROC曲线的问题。首先,我需要回顾一下自己对这些概念的理解,并确保信息的准确性。用户提到了几个引用资料,我需要结合这些内容来组织回答,同时遵循系统级指令中的格式要求。 首先,AUC-ROC是机器学习中用于评估二分类模型性能的重要指标。ROC曲线全称是受试者工作特征曲线,而AUC则是ROC曲线下的面积,用来量化模型的整体性能。用户可能想知道这两者的具体定义、如何解读,以及它们在模型评估中的实际应用。 接下来,我需要分步骤解释这些概念。首先定义ROC曲线,说明其横轴(FPR)和纵轴(TPR)的含义,以及它们如何随着分类阈值的变化而变化。然后,解释AUC值的意义,比如AUC为1表示完美分类,0.5相当于随机猜测,这时需要强调AUC如何反映模型的区分能力。 然后,结合用户提供的引用资料,特别是引用[2]和[3],其中提到ROC曲线接近左上角表示模型准确率高,AUC值高则性能更好。这部分需要自然地融入回答中,并正确添加引用标识。例如,在解释ROC曲线的位置时,引用[2]的内容。 此外,用户可能对如何绘制ROC曲线以及计算AUC的方法感兴趣。我需要简要说明绘制步骤,比如需要不同阈值下的TPR和FPR,然后连接这些点形成曲线。AUC的计算方法可以通过梯形法则或积分,这部分可能需要提及,但不需要太深入数学细节,以保持回答的实用性。 还要注意用户的应用场景,可能想知道AUC-ROC在模型选择、调参或比较中的作用。例如,引用[3]提到AUC不受类别不平衡的影响,这一点很重要,需要在回答中突出,说明为什么在处理不平衡数据时AUC比准确率更有优势。 同时,需要确保回答中的数学公式使用正确的LaTeX格式,如FPR公式写成$FPR = \frac{FP}{FP + TN}$,TPR写成$TPR = \frac{TP}{TP + FN}$,并用$$包围独立公式。此外,所有行内公式如$AUC$需要用$符号包裹。 可能还需要比较AUC与其他指标(如准确率、F1-score)的不同,指出AUC的综合性和对类别不平衡的鲁棒性,这部分可以引用资料中的内容来支持观点。 最后,生成的相关问题需要围绕AUC-ROC的延伸话题,比如如何解读不同AUC值、与其他指标的比较、应用场景、计算方法及类别不平衡的影响。这些问题应帮助用户进一步探索该主题。 在整理回答时,要确保结构清晰,分点解释,每个部分自然过渡,并在适当的位置添加引用标记。同时,检查LaTeX语法是否正确,避免格式错误。例如,独立公式是否使用$$,行内公式是否正确使用$符号。 现在,综合以上思考,组织成一个逻辑连贯的回答,满足用户的需求,并符合给定的格式要求。</think>### AUC-ROC曲线详解及在分类模型评估中的作用 #### 1. **基本概念** - **ROC曲线**(Receiver Operating Characteristic Curve)是用于评估二分类模型性能的工具,横轴为**假正率**(False Positive Rate, FPR),纵轴为**真正率**(True Positive Rate, TPR),其计算公式为: $$ FPR = \frac{FP}{FP + TN}, \quad TPR = \frac{TP}{TP + FN} $$ 其中,$TP$(真正例)、$FP$(假正例)、$TN$(真负例)、$FN$(假负例)构成混淆矩阵[^1][^3]。 - **AUC**(Area Under the Curve)是ROC曲线下的面积,取值范围为$[0,1]$,用于量化模型区分正负类的能力。AUC值越接近1,模型性能越好;若AUC=0.5,则等同于随机猜测[^2]。 #### 2. **ROC曲线的绘制与解读** - **绘制方法**:通过调整分类阈值(如逻辑回归中的概率截断值),计算不同阈值下的TPR和FPR,将各点连接成曲线。 - **关键形态**: - **靠近左上角**:模型准确率高(高TPR、低FPR)[^2]。 - **接近对角线**:模型性能与随机猜测相当(AUC=0.5)。 - **低于对角线**:可能因模型预测反向导致,需重新检查数据或模型。 #### 3. **AUC值的意义** - **AUC=1**:完美分类器,所有正负样本均被正确区分。 - **AUC>0.9**:模型具有优秀的区分能力。 - **AUC<0.7**:模型性能较差,需优化特征或算法。 #### 4. **在模型评估中的应用** - **模型比较**:AUC提供单一数值指标,便于横向对比不同模型的性能。 - **类别不平衡鲁棒性**:AUC不受正负样本比例影响,适用于评估信用卡欺诈检测、疾病诊断等不平衡场景[^3]。 - **调参指导**:通过观察不同参数下AUC的变化,选择最佳超参数组合。 #### 5. **与其他指标的关系** - **对比准确率**:AUC更关注模型对正负类的整体区分能力,而非单纯分类正确率。 - **对比F1-score**:F1-score依赖于特定阈值,而AUC综合所有阈值下的表现,更全面[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值