在R中的精确度、召回率和F-度量

9

我有一段时间没有使用R语言了,也许我还不太习惯,但是...我在R中有一个表格,其中有两列,第一列是预测值(值为0或1),第二列是实际值(也为0或1)。我需要找到召回率、精确率和F1度量值,但是在R中找不到一个好的函数。(我也看到过ROCR,但我只能创建一些图表,而我真正需要的是数字。)

是否有任何好的函数可以在R中找到精确率、召回率和F1度量值?是否有其他方法可以实现?


在我开始这项任务之前,我也没有。 (http://en.wikipedia.org/wiki/Precision_and_recall#F-measure) - Fanny
我在https://dev59.com/7Woy5IYBdhLWcg3wg-Um#36843900回答了一个类似的问题。 - Adriano Rivolli
4个回答

23

首先我创建一个数据集,如下:

> 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 <- sum(predict & true) / sum(true)

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

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

谢谢,它运行得非常好!(而且比我想象的简单得多,我想我又过度思考了) - Fanny
3
当预测值全部为0时(分类器将所有样本预测为属于类别0),则检索值为0,而你却除以0。 - Omri374

10

将Patrick的好答案整齐地打包成一个函数...

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')
}

6
您可以使用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"]

嗯..这些是我可以通过这些命令获得的指标:灵敏度、特异性、患病率、阳性预测值、阴性预测值、检出率、检出患病率、平衡准确度。我猜你正在使用不同版本的Caret包。也许其他人也有不同的版本。 - Ale
我检查了一下,发现我有Caret 2.1-2版本。我将我的旧软件包更新到6.0-86版本,F1分数就出现了。谢谢。 - Ale

1
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')
}

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