R中的精度、召回率和f-measure

Posted

技术标签:

【中文标题】R中的精度、召回率和f-measure【英文标题】:precision, recall and f-measure in R 【发布时间】:2012-09-16 08:17:09 【问题描述】:

我有一段时间没用过 R 了,所以也许我还没有习惯,但是.. 我在 R 中有一个表,有两个列,第一个有预测值(一个值可以是0 或 1),第二个具有实际值(也是 0 或 1)。我需要找到召回率、精度和 f 度量,但在 R 中找不到合适的函数。(我也读过 ROCR,但我所能做的就是创建一些图,但我真的不需要图,我需要数字)。

在 R 中找到精度、召回率和 f-measure 有什么好的函数吗? 有什么不同的方法吗?

【问题讨论】:

在我开始这个任务之前,我也没有。 (en.wikipedia.org/wiki/Precision_and_recall#F-measure) 我在***.com/a/36843900/6105797回答了类似的问题 【参考方案1】:

首先我创建一个数据集

> predict <- sample(c(0, 1), 20, replace=T)
> true <- sample(c(0, 1), 20, replace=T)

我想预测值中的那些 1 是检索到的。检索到的总数是

> retrieved <- sum(predict)

精度是检索到的相关实例的比例,是

> precision <- sum(predict & true) / retrieved

Recall 是检索到的相关实例的一部分,是

> recall <- sum(predict & true) / sum(true)

F-measure 是 2 * 精度 * 召回率 / (精度 + 召回率) 是

> Fmeasure <- 2 * precision * recall / (precision + recall)

【讨论】:

谢谢,效果很好! (而且比我想象的要简单,我想我又想多了) 当predict全为0时(分类器预测所有样本属于0类),然后retrieve = 0你除以0【参考方案2】:

只需将帕特里克的绝妙答案巧妙地包装到一个函数中......

measurePrecisionRecall <- function(predict, actual_labels)
  precision <- sum(predict & actual_labels) / sum(predict)
  recall <- sum(predict & actual_labels) / sum(actual_labels)
  fmeasure <- 2 * precision * recall / (precision + recall)

  cat('precision:  ')
  cat(precision * 100)
  cat('%')
  cat('\n')

  cat('recall:     ')
  cat(recall * 100)
  cat('%')
  cat('\n')

  cat('f-measure:  ')
  cat(fmeasure * 100)
  cat('%')
  cat('\n')

【讨论】:

【参考方案3】:

您可以使用来自caret 包的函数confusionMatrix() 获取所有这些指标。

# Create a sample
predicted <- as.factor(sample(c(0, 1), 100, replace=T))
realized  <- as.factor(sample(c(0, 1), 100, replace=T))

# Compute the confusion matrix and all the statistics
result <- confusionMatrix(predicted, realized, mode="prec_recall")

result
result$byClass["Precision"]
result$byClass["Recall"]
result$byClass["F1"]

【讨论】:

嗯.. 这些是我可以使用这些命令获得的指标:灵敏度、特异性、流行性、PPV、NPV、检测率、检测流行性、平衡准确度。我假设您使用的是不同版本的 Caret 包。也许其他人也有不同的版本。 我检查过,我有 Caret 2.1-2。我将旧软件包更新为 6.0-86,并且 F1 分数在那里。谢谢【参考方案4】:
measurePrecisionRecall <- function(actual_labels, predict)
  conMatrix = table(actual_labels, predict)
  precision <- conMatrix['0','0'] / ifelse(sum(conMatrix[,'0'])== 0, 1, sum(conMatrix[,'0']))
  recall <- conMatrix['0','0'] / ifelse(sum(conMatrix['0',])== 0, 1, sum(conMatrix['0',]))
  fmeasure <- 2 * precision * recall / ifelse(precision + recall == 0, 1, precision + recall)

  cat('precision:  ')
  cat(precision * 100)
  cat('%')
  cat('\n')

  cat('recall:     ')
  cat(recall * 100)
  cat('%')
  cat('\n')

  cat('f-measure:  ')
  cat(fmeasure * 100)
  cat('%')
  cat('\n')

【讨论】:

以上是关于R中的精度、召回率和f-measure的主要内容,如果未能解决你的问题,请参考以下文章

python实现计算精度召回率和F1值

召回率和精度

如何从 Python 中的混淆矩阵中获取精度、召回率和 f 度量 [重复]

你能解释一下提供的例子中的分类报告(召回率和精度)吗?

一次性计算精度、召回率和 F 分数 - python

计算召回率和精度以评估 CBIR 系统