Easy way of counting precision, recall and F1-score in R

后端 未结 7 1282
不思量自难忘°
不思量自难忘° 2021-01-31 04:45

I am using an rpart classifier in R. The question is - I would want to test the trained classifier on a test data. This is fine - I can use the predict.rpart<

7条回答
  •  既然无缘
    2021-01-31 05:37

    using the caret package:

    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)
    

    A generic function that works for binary and multi-class classification without using any package is:

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

    Some comments about the function:

    • It's assumed that an F1 = NA is zero
    • positive.class is used only in binary f1
    • for multi-class problems, the macro-averaged F1 is computed
    • If predicted and expected had different levels, predicted will receive the expected levels

提交回复
热议问题