Простой способ подсчета точности, отзыва и F1-счета в R - PullRequest
15 голосов
/ 14 декабря 2011

Я использую классификатор rpart в R. Вопрос в том, что я бы хотел проверить обученный классификатор на тестовых данных. Это нормально - я могу использовать функцию predict.rpart.

Но я также хочу вычислить точность, отзыв и оценку Ф1.

У меня вопрос: должен ли я сам писать функции для них, или для этого есть какая-то функция в R или какой-либо из библиотек CRAN?

Ответы [ 6 ]

18 голосов
/ 14 декабря 2011

Библиотека 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)

...
17 голосов
/ 25 апреля 2016

с использованием пакета caret :

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
  • Если predicted и expected имели разные уровни, predicted получит expected уровни
4 голосов
/ 17 июня 2015

Я заметил комментарий о том, что оценка 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)))))
3 голосов
/ 24 августа 2017

confusionMatrix () из пакета каретки может использоваться вместе с соответствующим необязательным полем «Позитивный», определяющим, какой фактор следует принимать как положительный фактор.

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

Этот код также даст дополнительные значения, такие как F-статистика, Точность и т. Д.

2 голосов
/ 24 августа 2017

Мы можем просто получить значение F1 из функции confetMatrix кареты

result <- confusionMatrix(Prediction, Lable)

# View confusion matrix overall
result 

# F1 value
result$byClass[7] 
1 голос
/ 29 января 2017

Вы также можете использовать confusionMatrix(), предоставляемый пакетом caret. Выходные данные включают в себя, между прочим, чувствительность (также известную как отзыв) и Pos Pred Value (также известную как точность). Тогда F1 можно легко вычислить, как указано выше, как: F1 <- (2 * precision * recall) / (precision + recall)

...