在R语言中:如何计算精度/召回率曲线下面积(AUPR)?

4
假设我有两个矩阵:标签矩阵A和相应的预测概率矩阵B。现在我想根据矩阵A和B计算AUPR(精度/召回曲线下面积)。对于常见的ROC曲线下面积(AUC),在R语言中有很多包,如ROCR、pROC等可以直接计算AUC值,但目前有哪些R语言包可以计算AUPR呢?或者您能否帮助提供计算AUPR的方法?
以下是两个示例矩阵:
> pp
        [,1]    [,2]     [,3]    [,4]    [,5]     [,6]    [,7]
[1,] 0.01792 0.00155 -0.00140 0.00522 0.01320  0.22506 0.00454
[2,] 0.05883 0.11256  0.82862 0.12406 0.08298 -0.00392 0.30724
[3,] 0.00743 0.06357  0.14500 0.00213 0.00545  0.03452 0.11189
[4,] 0.02571 0.01460  0.01108 0.00494 0.01246  0.11880 0.05504
[5,] 0.02407 0.00961  0.00720 0.00382 0.01039  0.10974 0.04512

> ll
        D00040 D00066 D00067 D00075 D00088 D00094 D00105
hsa190       0      0      0      0      0      1      0
hsa2099      0      1      1      0      0      0      1
hsa2100      0      0      0      0      0      0      1
hsa2101      0      0      0      0      0      0      0
hsa2103      0      0      0      0      0      0      0
pp 是真实标签矩阵的预测概率矩阵,而ll则是标签矩阵。感谢您的提前预先安排。
1个回答

5
我会先将预测分数和类别从矩阵转换成向量。
存在一个名为“PRROC”的软件包,它提供了与“ROCR”相似的函数以生成ROC和PRC,并且还给出了PRC的AUC值。
具体来说,我使用“ROCR”软件包中的数据ROCR.simple作为示例。
library(PRROC)
library(ROCR)
data("ROCR.simple")
scores <- data.frame(ROCR.simple$predictions, ROCR.simple$labels)
pr <- pr.curve(scores.class0=scores[scores$ROCR.simple.labels=="1",]$ROCR.simple.predictions,
             scores.class1=scores[scores$ROCR.simple.labels=="0",]$ROCR.simple.predictions,
             curve=T)

请注意,这个函数中的"scores.class0"需要是正类的分数(这有点令人困惑,因为我个人认为0表示负类,1表示正类)。所以我将0和1的顺序调换了一下。
这样,PR曲线和AUC都保存在pr变量中。
pr

Precision-recall curve

Area under curve (Integral):
 0.7815038 

Area under curve (Davis & Goadrich):
 0.7814246 

Curve for scores from  0.005422562  to  0.9910964 
( can be plotted with plot(x) )

接下来,您可以使用 plot(pr) 或 ggplot 绘制 PRC:

y <- as.data.frame(pr$curve)
ggplot(y, aes(y$V1, y$V2))+geom_path()+ylim(0,1)

得到的曲线与ROCR软件包生成的曲线相同。

enter image description here enter image description here


你能帮我解决这个问题吗? - Newbie
@新手 抱歉,我认为对于那个问题,这是因为数据太大了,你必须等待函数获取结果。 - Yan
PRROC可用于数值预测吗? - silk_route11
@silk_route11 是的,我认为可以。 - Yan
在这个例子中,ROCR.simple.labels是指真实的结果值还是预测的结果值。例如,如果你有一个不断变化的阈值,那么预测的结果可能会改变,但测试集中的真实结果值始终保持不变。 - PleaseHelp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接