27

rpart在 R 中使用分类器。问题是 - 我想在测试数据上测试经过训练的分类器。这很好——我可以使用这个predict.rpart功能。

但我也想计算精度、召回率和 F1 分数。

我的问题是 - 我是否必须自己为这些函数编写函数,或者 R 或任何 CRAN 库中是否有任何函数?

4

7 回答 7

28

使用插入符号包:

library(caret)

y <- ... # factor of positive / negative cases
predictions <- ... # factor of predictions

precision <- posPredValue(predictions, y, positive="1")
recall <- sensitivity(predictions, y, positive="1")

F1 <- (2 * precision * recall) / (precision + recall)

适用于二进制和多类分类而不使用任何包的通用函数是:

f1_score <- function(predicted, expected, positive.class="1") {
    predicted <- factor(as.character(predicted), levels=unique(as.character(expected)))
    expected  <- as.factor(expected)
    cm = as.matrix(table(expected, predicted))

    precision <- diag(cm) / colSums(cm)
    recall <- diag(cm) / rowSums(cm)
    f1 <-  ifelse(precision + recall == 0, 0, 2 * precision * recall / (precision + recall))

    #Assuming that F1 is zero when it's not possible compute it
    f1[is.na(f1)] <- 0

    #Binary F1 or Multi-class macro-averaged F1
    ifelse(nlevels(expected) == 2, f1[positive.class], mean(f1))
}

关于函数的一些评论:

  • 假设 F1 = NA 为零
  • positive.class仅用于二进制 f1
  • 对于多类问题,计算宏观平均 F1
  • 如果predictedexpected有不同的关卡,predicted将收到expected关卡
于 2016-04-25T14:45:32.910 回答
24

ROCR库计算所有这些以及更多(请参见http://rocr.bioinf.mpi-sb.mpg.de):

library (ROCR);
...

y <- ... # logical array of positive / negative cases
predictions <- ... # array of predictions

pred <- prediction(predictions, y);

# Recall-Precision curve             
RP.perf <- performance(pred, "prec", "rec");

plot (RP.perf);

# ROC curve
ROC.perf <- performance(pred, "tpr", "fpr");
plot (ROC.perf);

# ROC area under the curve
auc.tmp <- performance(pred,"auc");
auc <- as.numeric(auc.tmp@y.values)

...
于 2011-12-14T09:22:57.243 回答
12

只是为了更新这一点,因为我现在遇到了这个线程,confusionMatrix函数中的函数caret会自动为你计算所有这些东西。

cm <- confusionMatrix(prediction, reference = test_set$label)

# extract F1 score for all classes
cm[["byClass"]][ , "F1"] #for multiclass classification problems

您也可以将以下任何内容替换为“F1”以提取相关值:

“灵敏度”、“特异性”、“Pos Pred 值”、“Neg Pred 值”、“Precision”、“Recall”、“F1”、“Prevalence”、“Detection”、“Rate”、“Detection Prevalence”、“平衡精度"

我认为当你只做一个二元分类问题时,它的行为略有不同,但在这两种情况下,当你查看confusionMatrix对象时,所有这些值都是为你计算的,在$byClass

于 2019-09-26T21:28:21.477 回答
7

caret 包中的confusionMatrix() 可以与适当的可选字段“Positive”一起使用,指定应将哪个因素视为正因素。

confusionMatrix(predicted, Funded, mode = "prec_recall", positive="1")

此代码还将提供其他值,例如 F 统计量、准确度等。

于 2017-08-24T15:19:33.727 回答
4

我注意到有关二进制类需要 F1 分数的评论。我怀疑它通常是。但是不久前,我写了这篇文章,其中我正在将其分类为用数字表示的几个组。这可能对你有用...

calcF1Scores=function(act,prd){
  #treats the vectors like classes
  #act and prd must be whole numbers
  df=data.frame(act=act,prd=prd);
  scores=list();
  for(i in seq(min(act),max(act))){
    tp=nrow(df[df$prd==i & df$act==i,]);        
    fp=nrow(df[df$prd==i & df$act!=i,]);
    fn=nrow(df[df$prd!=i & df$act==i,]);
    f1=(2*tp)/(2*tp+fp+fn)
    scores[[i]]=f1;
  }      
  print(scores)
  return(scores);
}

print(mean(unlist(calcF1Scores(c(1,1,3,4,5),c(1,2,3,4,5)))))
print(mean(unlist(calcF1Scores(c(1,2,3,4,5),c(1,2,3,4,5)))))
于 2015-06-17T15:51:27.800 回答
3

我们可以简单地从插入符号的混淆矩阵函数中获取 F1 值

result <- confusionMatrix(Prediction, Lable)

# View confusion matrix overall
result 

# F1 value
result$byClass[7] 
于 2017-08-24T15:41:30.953 回答
1

您也可以使用 confusionMatrix()提供的caret包。输出包括敏感度(也称为召回)和 Pos Pred 值(也称为精度)。如上所述,F1 可以很容易地计算为: F1 <- (2 * precision * recall) / (precision + recall)

于 2017-01-29T17:45:49.937 回答