2011-12-14 5 views
12

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

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

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

ответ

15

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([email protected]) 

... 
+0

Вот это точно! Благодарю. –

+5

... и для F1-score 'performance (pred," f ")' дает вектор F1-баллов – smci

+2

это для двоичных классов, не так ли? – marbel

2

Я заметил комментарий о 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))))) 
14

используя 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 вычисляется
  • If predicted и expected имели различные уровни, predicted будет получить expected уровни
+1

привет спасибо. Я заметил, что есть предупреждение, когда, например, один из классов никогда не прогнозируется. Считаете ли вы, что расчет по-прежнему действителен? – agenis

+1

Спасибо, ты прав. Я сделал небольшое улучшение, чтобы исправить эту проблему. Теперь он работает правильно в таких случаях. –

1

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

0

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

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

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

1

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

result <- confusionMatrix(Prediction, Lable) 

# View confusion matrix overall 
result 

# F1 value 
result$byClass[7]