2011-12-14 35 views
12

Tôi đang sử dụng trình phân loại rpart trong R. Câu hỏi là - Tôi muốn kiểm tra trình phân loại được đào tạo trên dữ liệu thử nghiệm. Điều này là tốt - Tôi có thể sử dụng chức năng predict.rpart.Cách dễ dàng để đếm chính xác, gọi lại và điểm F1 trong R

Nhưng tôi cũng muốn tính toán độ chính xác, số lần truy cập và điểm F1.

Câu hỏi của tôi là - tôi có phải tự viết các chức năng cho chính mình hay không hoặc có bất kỳ chức năng nào trong R hoặc bất kỳ thư viện CRAN nào không?

Trả lời

15

Thư viện ROCR tính toán tất cả những điều này và nhiều hơn nữa (xem thêm 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

Đó là nó chính xác! Cảm ơn. –

+5

... và cho hiệu suất F1 điểm số (pred, "f") 'cho một vectơ của F1-score – smci

+2

đây là cho các lớp nhị phân, phải không? – marbel

2

tôi nhận thấy những nhận xét về điểm số F1 bị cần thiết cho các lớp nhị phân. Tôi nghi ngờ rằng nó thường là. Nhưng một thời gian trước, tôi đã viết điều này, trong đó tôi đã phân loại thành nhiều nhóm được biểu thị bằng số. Điều này có thể sử dụng cho bạn ...

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

sử dụng caret gói:

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) 

Một chức năng chung mà làm việc cho phân loại nhị phân và đa lớp mà không sử dụng không có gói là:

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

Một số nhận xét về hàm:

  • Nó giả định rằng một F1 = NA là zero
  • positive.class chỉ được sử dụng trong f1 nhị phân
  • cho các vấn đề đa lớp, F1 vĩ mô trung bình được tính
  • Nếu predictedexpected có mức độ khác nhau, predicted sẽ nhận được các mức expected
+1

hi cảm ơn. Tôi nhận thấy rằng có một cảnh báo khi một ví dụ của lớp không bao giờ được dự đoán. Bạn có nghĩ tính toán vẫn hợp lệ không? – agenis

+1

Cảm ơn bạn, bạn đã đúng. Tôi đã thực hiện một chút cải tiến để khắc phục sự cố này. Bây giờ nó hoạt động ngay trong những trường hợp như vậy. –

1

Bạn cũng có thể sử dụng confusionMatrix() được cung cấp bởi gói caret. Đầu ra bao gồm, giữa những người khác, Sensitivity (còn được gọi là recall) và Pos Pred Value (còn được gọi là độ chính xác). Sau đó F1 có thể dễ dàng tính toán, như đã nêu ở trên, như: F1 <- (2 * precision * recall)/(precision + recall)

0

confusionMatrix() từ gói caret có thể được sử dụng cùng với một lĩnh vực tùy chọn thích hợp "tích cực" đó nêu rõ yếu tố cần được thực hiện như yếu tố tích cực.

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

Mã này cũng sẽ cung cấp các giá trị bổ sung như F-thống kê, chính xác, vv

1

Chúng tôi chỉ có thể nhận được giá trị F1 từ confusionMatrix chức năng caret của

result <- confusionMatrix(Prediction, Lable) 

# View confusion matrix overall 
result 

# F1 value 
result$byClass[7] 
Các vấn đề liên quan