我有一段时间没有使用R语言了,也许我还不太习惯,但是...我在R中有一个表格,其中有两列,第一列是预测值(值为0或1),第二列是实际值(也为0或1)。我需要找到召回率、精确率和F1度量值,但是在R中找不到一个好的函数。(我也看到过ROCR,但我只能创建一些图表,而我真正需要的是数字。)
是否有任何好的函数可以在R中找到精确率、召回率和F1度量值?是否有其他方法可以实现?
我有一段时间没有使用R语言了,也许我还不太习惯,但是...我在R中有一个表格,其中有两列,第一列是预测值(值为0或1),第二列是实际值(也为0或1)。我需要找到召回率、精确率和F1度量值,但是在R中找不到一个好的函数。(我也看到过ROCR,但我只能创建一些图表,而我真正需要的是数字。)
是否有任何好的函数可以在R中找到精确率、召回率和F1度量值?是否有其他方法可以实现?
首先我创建一个数据集,如下:
> predict <- sample(c(0, 1), 20, replace=T)
> true <- sample(c(0, 1), 20, replace=T)
> retrieved <- sum(predict)
精度是指检索结果中相关实例的比例。
> precision <- sum(predict & true) / retrieved
回忆率是检索到的相关实例占所有相关实例的比例,即
> recall <- sum(predict & true) / sum(true)
F-measure是2 * 精确度 * 召回率 / (精确度 + 召回率)。
> Fmeasure <- 2 * precision * recall / (precision + recall)
将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')
}
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"]
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')
}