计算 R 中准确率和召回率的 F1 分数

机器算法验证 r 精确召回 f-统计量
2022-03-18 16:58:03

好的,所以我想计算 Precision P 和 Recall R 的四对值的 F1 分数。这些对是:

Precision = (54.54, 60.0, 91.3, 95.23)
Recall = (0.02, 2.10, 0.18, 5.3)

以上是这些值的百分比

Precision1 = ( 0.5454 0.6000 0.9130 0.9523)
Recall1 = ( 0.0002 0.0210 0.0018 0.0530)

以下公式计算 F1 分数

在此处输入图像描述

换句话说

Fscore = (2*Precision*Recall) / sum(Precision, Recall)

对于精度和召回值对,结果是:

Fscore = (0.03998534  4.05797101  0.35929165 10.04116184) #using the Precision/Recall
Fscore1 = (7.067742e-05 8.164059e-03 1.064827e-03 3.270282e-02) #Precision1/Recall1

但是我不确定这些数字。我应该使用这两个中的哪一个?我错过了什么吗?我虽然 Fscore 值的范围从 1 到 0。我是否必须对这些数字中的任何一个进行归一化?

3个回答

F1Score 的范围是 0-1,你是对的。

请记住如何计算精度和召回率

precision = TP / (TP + FP)
recall = TP / (TP + FN)

with TP= 真阳性,FP= 假阳性和FN= 假阴性。因此,精度是检索到的相关实例的比例,而召回率是检索到的相关实例的比例(就像维基百科所说的那样)。

鉴于该定义,精度和召回率都是百分比值(范围从 0%-100% = 0-1)。因此,您应该使用您的XXX1版本,因为您的Precsion(没有 1)不满足该标准。但请注意,您的召回率低于 0,02 的值极低

您需要取 0 到 1 之间的数字,而不是百分比值。请检查语法,但是,我认为隐藏了一个错误。Precision 和 Recall 是两个向量。你正在计算sum(Precision, Recall)我认为你应该计算的地方Precision + Recall请注意,这些在 R 中是不一样的。该sum函数会将两个向量中的所有值添加到一个大数中,同时+将添加元素:

> a <- c(1, 1, 1, 1)
> b <- c(1, 1, 1, 1)
> sum(a,b)
[1] 8
> a+b
[1] 2 2 2 2

您拥有的 Precision/Recall 对越多,您的函数(使用sum)的结果就越小,因为它们都有一个不断增长的分母。

回到您的示例数据,这将是:

Precision1 <- c(0.5454, 0.6000, 0.9130, 0.9523)
Recall1 <- c(0.0002, 0.0210, 0.0018, 0.0530)
Fscore_rev <- 2 * Precision1 * Recall1 / (Precision1 + Recall1)

和产量

> round(Fscore_rev, 4)
[1] 0.0004 0.0406 0.0036 0.1004

根据定义,Precision 和 Recall 的范围应为 0 到 1。使用 Precision 和 Recall 的十进制表示:

Precision <- c( 0.5454 0.6000 0.9130 0.9523 )
Recall <- c( 0.0002 0.0210 0.0018 0.0530 )
numerator <- 2*Precision*Recall
print(numerator)
[1] 0.00021816 0.02520000 0.00328680 0.10094380

denominator <- (Precision + Recall)
print(denominator)
[1] 0.5456 0.6210 0.9148 1.0053

Fscore <- numerator/denominator

答案是:

print( Fscore)
[1] 0.0003998534 0.0405797101 0.0035929165 0.1004116184