PR曲线,也就是精确率召回率曲线(PrecisionRecall Curve),是评估二分类模型性能的重要工具。它描绘了在不同分类阈值下,模型的精确率(Precision)和召回率(Recall)之间的权衡关系。
很多人在看到PR曲线的绘制方式时,可能会产生一个疑问:PR曲线一定会过(1, 0)这个点吗?答案是:不一定,但通常情况下会非常接近或者说其“理论上”的端点会触及这个区域。 要理解这一点,我们需要深入剖析PR曲线的绘制原理和这两个关键指标的含义。
PR曲线的绘制原理
PR曲线的横轴是召回率(Recall),纵轴是精确率(Precision)。
召回率(Recall): 也称为True Positive Rate (TPR) 或 Sensitivity,衡量的是在所有实际为正例的样本中,有多少被模型正确地识别出来了。
$$ ext{Recall} = frac{ ext{True Positives (TP)}}{ ext{True Positives (TP)} + ext{False Negatives (FN)}} $$
精确率(Precision): 衡量的是在所有被模型预测为正例的样本中,有多少实际上是真正的正例。
$$ ext{Precision} = frac{ ext{True Positives (TP)}}{ ext{True Positives (TP)} + ext{False Positives (FP)}} $$
PR曲线是通过改变模型的分类阈值(Threshold)来绘制的。模型通常会输出一个概率值(比如样本属于正例的概率)。我们设定一个阈值,如果样本的概率大于或等于这个阈值,就将其预测为正例;否则,预测为负例。
当我们逐渐降低分类阈值时:
更多的样本会被预测为正例。
TP (True Positives) 的数量通常会增加或保持不变(因为原本被正确预测为正例的样本依然会被预测为正例)。
FP (False Positives) 的数量会增加(因为原本被错误预测为负例的样本,现在可能因为阈值降低而被预测为正例)。
FN (False Negatives) 的数量会减少或保持不变(因为原本被错误预测为负例的样本,现在可能因为阈值降低而被预测为正例)。
基于这些变化,我们可以看到精确率和召回率如何随阈值变化而变化:
Recall = TP / (TP + FN):随着FN减少(或TP不变),召回率会上升。
Precision = TP / (TP + FP):随着FP增加(或TP不变),精确率会下降。
因此,PR曲线呈现出一种“此消彼长”的趋势:随着召回率的提高,精确率往往会下降。
为什么(1, 0)会成为一个特殊的点?
现在我们来看看PR曲线的两个极点:
1. 召回率为 1 (Recall = 1):
要让召回率达到 1,意味着模型必须将所有实际为正例的样本都预测为正例。
$$ ext{Recall} = frac{ ext{TP}}{ ext{TP} + ext{FN}} = 1 $$
这只有在TP + FN = TP 时才能实现,也就是说,FN 必须为 0。模型没有遗漏任何一个真实的正例。
此时,模型的精确率是:
$$ ext{Precision} = frac{ ext{TP}}{ ext{TP} + ext{FP}} $$
为了让 FN=0,模型需要非常宽松地预测正例。换句话说,它可能会将所有样本(无论实际是正例还是负例)都预测为正例。
在这种极端情况下,如果数据集中有 N_p 个正例样本,N_n 个负例样本,那么:
TP = N_p (所有真实正例都被预测为正例)
FP = N_n (所有真实负例也被预测为正例)
FN = 0
TN = 0
此时,精确率 = TP / (TP + FP) = N_p / (N_p + N_n)。
这个值是数据集中的正例比例(也称为先验概率或基线精确率)。
因此,当召回率为 1 时,精确率会是数据集正例比例,这个值可能大于 0,也可能小于 1。
2. 精确率为 1 (Precision = 1):
要让精确率达到 1,意味着模型预测为正例的样本全部都是真实的正例。
$$ ext{Precision} = frac{ ext{TP}}{ ext{TP} + ext{FP}} = 1 $$
这只有在 TP + FP = TP 时才能实现,也就是说,FP 必须为 0。模型没有将任何一个负例误判为正例。
此时,模型的召回率是:
$$ ext{Recall} = frac{ ext{TP}}{ ext{TP} + ext{FN}} $$
为了让 FP=0,模型需要非常严格地预测正例。换句话说,它只会在非常确信样本是正例的时候才将其预测为正例。
在这种极端情况下,模型可能一个样本都不预测为正例(如果它找不到任何一个它100%确信是正例的样本)。
如果模型一个样本都不预测为正例,那么 TP = 0, FP = 0。
此时,精确率 = 0/0,这是一个不确定值,通常在绘图时会特殊处理,或者说在这个极端阈值下,模型没有产生任何预测。
更常遇到的情况是,存在一些高置信度的正例,模型会预测。假设模型预测了 K 个样本为正例,且这 K 个样本都是真实正例。
TP = K
FP = 0
此时,精确率 = K / (K + 0) = 1。
如果数据集中总共有 N_p 个正例,那么 FN = N_p K。
召回率 = K / (K + N_p K) = K / N_p。
理论上,当模型将阈值设置得非常高,以至于只有那些模型认为极可能是正例的样本(比如概率接近 1)才会被预测为正例时,FP 会趋向于 0,精确率会趋向于 1。
如果模型能够找到至少一个真实的正例并且不误判任何负例,那么它就可以达到精确率 1。此时,召回率就是被正确预测的真实正例数量占总真实正例数量的比例,即 $TP / N_p$。
那么,要达到 Precision = 1 的同时 Recall 为 0 呢? 这意味着 FP = 0 且 TP = 0。
如果 TP = 0,并且模型确实做出了预测(即 TP + FP > 0),那么 Precision 就不可能是 1。
所以,要实现 Precision = 1,必须有 TP > 0(或者 TP=FP=0)。
如果 TP > 0,那么 Recall 也会 > 0(只要 FN 不是无穷大,但实际上 FN 是有限的)。
最接近“(1, 0)点”的情况是:模型不预测任何样本为正例。在这种情况下,TP=0, FP=0, FN=N_p, TN=N_n。
Precision = 0/0 (不确定,或者在实践中通常取0)
Recall = 0 / (0 + N_p) = 0
如果绘制PR曲线时,将“不预测任何样本为正例”的这个极端情况对应的点定义为 (Recall=0, Precision=0),那么PR曲线通常会从这个点开始,然后沿着一条下降的路径走向右上角。
为什么PR曲线“通常”会过(1, 0)的“区域”?
我们前面分析得出:
当 Recall = 1 时,Precision = 数据集中的正例比例(一个大于0的值)。所以PR曲线不会以 (1, 1) 为终点,而是以 (1, 实际正例比例) 为终点。
当 Precision = 1 时,Recall 的值是 $TP / N_p$,其中 TP 是模型正确预测为正例的样本数。为了使 FP = 0,模型预测的正例数 TP + FP = TP。如果 TP > 0,Recall 必然大于 0。
如果模型能够将所有真实正例都识别出来(TP = N_p),并且不误判任何负例(FP = 0),那么 Precision = N_p / (N_p + 0) = 1,Recall = N_p / (N_p + 0) = 1。这只是理论上的完美模型。
但是,我们讨论的是不同阈值下的点。当阈值非常高时,FP 趋于 0,Precision 趋于 1。此时,TP 也可能很小(甚至为 0),因此 Recall 也会很小。
如果我们把不进行任何预测(TP=0, FP=0)的情况也纳入考虑(虽然这时Precision是0/0,但Recall是0),那么PR曲线的起始点通常被认为是 (0, 0)(或有时是 (0, 某个基线精确率))。
让我们再回到Precision=1的情况。当模型的阈值设置得非常高,以至于它只预测那些它极度确信是正例的样本。
如果存在至少一个真实的正例,并且模型能够以极高的置信度识别它,同时不误判任何负例,那么 Precision = 1。此时,召回率是模型正确识别出的真实正例数占总真实正例数的比例。
如果模型能够识别出 所有 真实正例,并且不误判任何负例,那么我们得到一个点 (Recall=1, Precision=1)。但这是理想情况,极少出现。
而我们想要讨论的“过(1,0)点”指的是,是否存在一个阈值,使得 Precision=1 且 Recall=0。
要 Precision=1,需要 FP=0。
要 Recall=0,需要 TP=0。
结合这两点,意味着模型一个样本都不预测为正例。此时,TP=0, FP=0。
精确率 = 0/0,在某些约定下可以认为是 0 或未定义。
召回率 = 0 / (0 + N_p) = 0。
所以,当模型将所有样本都预测为负例时(或者根本不做出任何预测),我们可以得到一个点(0, 0)或者(0, 基线精确率)。
反过来想,要达到 Precision=1,模型的预测集必须是真实正例的子集。要达到 Recall=0,模型必须不预测任何真实正例(即 TP=0)。如果 TP=0,并且 Precision=1,那么 FP 也必须是 0。
所以,要过(1,0)这个点,意味着存在一个阈值,使得模型只预测极少数样本为正例,并且这极少数样本全部是真实正例(FP=0),同时这极少数样本中没有一个是真实的(TP=0)。这在直观上是矛盾的。如果模型预测了样本,且是正例,那 TP 就至少是 1 了。
唯一能严格“过”(1, 0)点的场景是,模型不预测任何样本为正例。 此时 TP=0, FP=0。精确率是 0/0,如果定义为0,那点就是(0,0)。如果要让一个点是(1,0),那就是 Precision=1 且 Recall=0。这意味着 FP=0, TP=0, 并且 N_p > 0。如果 TP=0, FP=0,那么模型没有做出任何预测。如果模型不预测任何样本,那么召回率是0。但是精确率呢?0/0 通常被认为是未定义或者在实践中赋为0。所以严格说来,PR曲线不一定会“过”(1,0)这个精确的坐标点。
关键点解析与“为什么常这么说”
我们更常说的是,PR曲线会趋近于 (1, 0) 这个区域的边界,或者说其“理论上的极限”会触及这个区域。这里的“过”更像是一种描述上的便利和理解上的约定俗成。
1. 模型性能的极值:
Recall=1 是指模型不漏过任何一个正例。此时 Precision 的值由你的数据集的正例比例决定。
Precision=1 是指模型预测为正例的样本全部都是正例。此时 Recall 的值取决于模型在这个严格要求下,能识别出多少真实正例。
2. 绘制习惯与解释:
在绘制PR曲线时,我们通常会从一个非常高的阈值开始,此时模型只会预测极少数非常确信是正例的样本(FP会很低,Precision会很高,但TP可能也很低,导致Recall也很低)。随着阈值降低,Recall 逐渐增加,Precision 下降。
极端情况一: 假设模型将所有样本都预测为负例。TP=0, FP=0, FN=N_p, TN=N_n。
Precision = 0/0 (通常定义为0)
Recall = 0 / (0 + N_p) = 0
这个点是 (0, 0)。PR曲线通常会从这里(或者从一个与数据集中正例比例相匹配的基线精确率点开始)开始绘制。
极端情况二: 假设模型将所有样本都预测为正例。TP=N_p, FP=N_n, FN=0, TN=0。
Precision = N_p / (N_p + N_n) (数据集中的正例比例)
Recall = N_p / (N_p + 0) = 1
这个点是 (1, N_p / (N_p + N_n))。PR曲线的终点是这里。
那么,为什么会提到(1,0)呢?
这可能是一种对“完美模型”的误读,或者是一种对“在什么情况下 Precision=1 和 Recall=0 会发生”的思考。
为了使 Precision=1,需要 FP=0。
为了使 Recall=0,需要 TP=0。
所以,要同时达到 Precision=1 和 Recall=0,必须是 FP=0 且 TP=0。 这意味着模型一个样本都不预测为正例。在这种情况下,Recall 是 0。而 Precision 是 0/0。如果我们将 0/0 定义为 0,那么这个点就是 (0, 0)。
然而,人们可能在想:是否存在一个阈值,使得模型预测的正例都是正例(Precision=1),并且不预测任何真实正例(Recall=0)?
如果模型不预测任何样本为正例,那么 TP=0, FP=0。Recall=0。Precision=0/0。
如果模型预测了某些样本为正例(TP+FP > 0),那么:
若要 Recall=0,必须 TP=0。
如果 TP=0,那么 Precision = 0 / (0 + FP)。为了使 Precision=1,则必须 FP=0。
所以,TP=0, FP=0, Recall=0, Precision=0/0。
结论: 从严格的数学定义和极端情况来看,PR曲线的起点是 (0,0)(当所有样本预测为负例时,Precision取0)或 (0, N_p/(N_p+N_n))(当所有样本预测为正例时,Recall为1,但这里讨论的是低召回率的极端),而终点是 (1, N_p/(N_p+N_n))(当所有样本预测为正例时)。
为什么会出现“过(1,0)”的说法?
一种可能是混淆了Precision和Recall的“值”与“坐标点”。 有些时候,人们可能将Precision=1与Recall=0看作是PR曲线上的某个“端点”或“边界条件”,然后错误地认为它会经过(1,0)。
另一种可能是对“不预测”的处理。 当模型不预测任何样本为正例时,Recall=0。如果这时我们将Precision定义为0(而不是0/0),那么这个点就是(0,0)。
更可能的原因是,人们在思考一个完美的分类器。 一个完美的分类器,在任何阈值下,预测的正例都是真正的正例(Precision=1),并且识别了所有的真实正例(Recall=1)。但这样的分类器在PR图上会是右上角的点(1,1)。而(1,0)则代表了非常糟糕的分类器,它能识别所有真实正例(Recall=1),但所有预测都是错误的(Precision=0)。
最符合实际的解释是,PR曲线会从(0, 基线精确率)附近开始,然后逐渐下降,最后到达(1, 数据集正例比例)。
当阈值非常高时,FP 趋于 0,Precision 趋于 1。但此时 TP 可能也非常低,导致 Recall 趋于 0。所以PR曲线的起始部分会非常靠近纵轴(Recall=0),并且可能在很高的精确率值附近。
例如,如果模型可以识别出一个极度确信是正例的样本,且这个样本确实是正例,那么在非常高的阈值下,TP=1, FP=0,Recall = 1/N_p,Precision = 1。此时的点是 $(1/N_p, 1)$。
如果模型在某个阈值下不预测任何样本(TP=0, FP=0),Recall=0。Precision=0/0。通常在绘图时,会从 (0, 0) 开始,或者从 (0, 某个基线值) 开始。
总结来说:
PR曲线描绘了在不同阈值下,精确率(纵轴)随召回率(横轴)的变化。
召回率(Recall)= 1 意味着模型预测了所有真实的正例。此时的精确率取决于模型错误预测了多少负例。如果模型将所有样本都预测为正例,那么 Recall=1,但精确率会降低到数据集中正例的比例(N_p / (N_p + N_n))。所以,PR曲线的最高召回率点是 (1, N_p / (N_p + N_n))。
精确率(Precision)= 1 意味着模型预测为正例的样本全部都是真实的。此时的召回率取决于模型在这种严格条件下,识别出了多少真实正例。如果模型不预测任何样本为正例(TP=0, FP=0),那么 Recall=0,Precision=0/0。如果模型预测了少量样本(TP>0, FP=0),那么 Recall > 0。
因此,PR曲线的端点是 (1, 数据集中正例的比例)。而要达到 Precision=1 的情况,Recall 至少会是 $frac{TP}{N_p}$,其中 TP 是被模型正确识别的真实正例数。如果 TP=0 且 FP=0(不预测任何样本),那么 Recall=0,Precision=0/0。
所以,PR曲线不会严格地“过”(1, 0)这个点。 它会从接近 (0, 0) 或 (0, 基线精确率) 的地方开始,然后逐渐下降,最终到达 (1, 数据集中正例的比例)。在某些实际情况或绘图惯例中,由于处理 0/0 的方式或者考虑不预测样本的情况,可能会出现一些接近 (1, 0) 的行为,但这并非必然经过该点。
更准确的说法是,在阈值非常高时,模型可能只会输出极少数(甚至零个)正例预测,导致 Recall 非常低,但 Precision 非常高。当模型变得非常宽松时,Recall 会趋于 1,但 Precision 会下降到数据集中的正例比例。