PR曲线图中的“基线曲线”是一条水平线,其高度等于训练数据总数上阳性样本的数量。正样本在我们数据()中的比例。ñ PPñPñ
好,为什么会这样呢?假设我们有一个“垃圾分类器”。将第个样本实例的随机概率返回到类。为了方便起见,请说。这种随机类别分配的直接含义是(预期)精度等于我们数据中正例的比例。这是自然的;我们数据的任何完全随机子样本将具有正确分类的示例。对于任何概率阈值都是如此Ç Ĵ p 我我ÿ 我甲p 我〜ü [ 0 ,1 ] Ç Ĵ ë { PCĴCĴp一世一世ÿ一世一种p一世〜ü[ 0 ,1 ]CĴqÇĴq[0,1]q甲ÇĴqp我〜ü[0,1]q(100(1-q))%(100(1-q))%甲XÿPË{ Pñ}q我们可以将返回的类成员资格的概率用作决策边界。(表示中的值,其中大于或等于概率值归为类。)另一方面,如果,则的召回性能(预期)等于。在任何给定的阈值我们将选择(大约)的总数据,随后将包含(大约)的实例总数CĴq[ 0 ,1 ]q一种CJqpi∼U[0,1]q(100(1−q))%(100(1−q))%A在样本中。因此,我们一开始就提到了水平线!对于每个召回值(PR图中的值),相应的精度值(PR图中的值)等于。xyPN
简要说明一下:阈值通常不等于1减去预期召回率。在上述情况下,仅由于结果的随机均匀分布,发生这种情况。对于不同的分布(例如),和召回之间的这种近似身份关系不成立;是因为它最容易理解和直观显示。对于不同的随机分布,的PR轮廓不会改变。对于给定的值,仅PR值的位置将发生变化。Ç Ĵ Ç Ĵ p 我〜乙(2 ,5 )q ü [ 0 ,1 ] [ 0 ,1 ] Ç Ĵ qqCJCJpi∼B(2,5)qU[0,1][0,1]CJq
现在关于一个完美的分类器,这将意味着一个分类器,如果确实在类中则将概率返回到样本实例属于类,另外,如果不是类的成员,则返回概率。这意味着对于任何阈值我们将具有精度(即,在图项中,我们得到一条以精度开头的线)。我们没有获得精度的唯一一点是。对于 1 y i A y i A C P 0 y i A q 100 %100 %100 %q = 0 q = 0 PCP1yiAyiACP0yiAq100%100%100%q=0q=0,精度下降到正例在我们的数据的比例(),为(疯狂?),我们用分类甚至点的是类的概率作为类是。的PR图的只有两个可能的值:和。 0AACP1PPN0AACP1PN
单击确定,然后用一些R代码首先看到一个示例,其中正值对应于我们样本的。请注意,从与每个点关联的概率值量化到我们确信该点属于类的意义上来说,我们对类类别进行了“软分配” 。A40%A
rm(list= ls())
library(PRROC)
N = 40000
set.seed(444)
propOfPos = 0.40
trueLabels = rbinom(N,1,propOfPos)
randomProbsB = rbeta(n = N, 2, 5)
randomProbsU = runif(n = N)
# Junk classifier with beta distribution random results
pr1B <- pr.curve(scores.class0 = randomProbsB[trueLabels == 1],
scores.class1 = randomProbsB[trueLabels == 0], curve = TRUE)
# Junk classifier with uniformly distribution random results
pr1U <- pr.curve(scores.class0 = randomProbsU[trueLabels == 1],
scores.class1 = randomProbsU[trueLabels == 0], curve = TRUE)
# Perfect classifier with prob. 1 for positives and prob. 0 for negatives.
pr2 <- pr.curve(scores.class0 = rep(1, times= N*propOfPos),
scores.class1 = rep(0, times = N*(1-propOfPos)), curve = TRUE)
par(mfrow=c(1,3))
plot(pr1U, main ='"Junk" classifier (Unif(0,1))', auc.main= FALSE,
legend=FALSE, col='red', panel.first= grid(), cex.main = 1.5);
pcord = pr1U$curve[ which.min( abs(pr1U$curve[,3]- 0.50)),c(1,2)];
points( pcord[1], pcord[2], col='black', cex= 2, pch = 1)
pcord = pr1U$curve[ which.min( abs(pr1U$curve[,3]- 0.20)),c(1,2)];
points( pcord[1], pcord[2], col='black', cex= 2, pch = 17)
plot(pr1B, main ='"Junk" classifier (Beta(2,5))', auc.main= FALSE,
legend=FALSE, col='red', panel.first= grid(), cex.main = 1.5);
pcord = pr1B$curve[ which.min( abs(pr1B$curve[,3]- 0.50)),c(1,2)];
points( pcord[1], pcord[2], col='black', cex= 2, pch = 1)
pcord = pr1B$curve[ which.min( abs(pr1B$curve[,3]- 0.20)),c(1,2)];
points( pcord[1], pcord[2], col='black', cex= 2, pch = 17)
plot(pr2, main = '"Perfect" classifier', auc.main= FALSE,
legend=FALSE, col='red', panel.first= grid(), cex.main = 1.5);
在前两个图中,黑色圆圈和三角形分别表示和。我们立即看到“垃圾”分类器迅速达到等于精度;同样,完美分类器在所有召回变量中的精度为。毫不奇怪,“垃圾”分类器的AUCPR等于样本中正例的比例(),“完美分类器”的AUCPR大约等于。q = 0.20 Pq=0.50q=0.20 1≈0.401PN1≈0.401
实际上,完美分类器的PR图有点用处,因为永远不会有召回(我们永远不会只预测否定类)。按照惯例,我们只是从左上角开始绘制线条。严格来说,它应该只显示两个点,但这会造成可怕的曲线。:D0
根据记录,关于PR曲线的效用,CV中已经有一些很好的答案:here,here和here。只需仔细阅读它们,就可以对PR曲线有一个很好的总体了解。