आर

2011-12-14 9 views
12

में परिशुद्धता, याद और एफ 1-स्कोर की गणना करने का आसान तरीका मैं आर में rpart क्लासिफायर का उपयोग कर रहा हूं। सवाल यह है कि - मैं एक परीक्षण डेटा पर प्रशिक्षित क्लासिफायर का परीक्षण करना चाहता हूं। यह ठीक है - मैं predict.rpart फ़ंक्शन का उपयोग कर सकता हूं।आर

लेकिन मैं परिशुद्धता, याद और एफ 1 स्कोर की गणना भी करना चाहता हूं।

मेरा सवाल है - क्या मुझे अपने लिए कार्यों को लिखना है, या इसके लिए आर या किसी भी सीआरएएन पुस्तकालयों में कोई फ़ंक्शन है?

उत्तर

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

यह वास्तव में है कि एफ 1 से मूल्य प्राप्त कर सकते हैं! धन्यवाद। –

+5

... और एफ 1-स्कोर 'प्रदर्शन (पूर्व, "एफ") के लिए' एफ 1-स्कोर – 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
  • बहुल वर्ग की समस्याओं के लिए
  • , स्थूल औसतन एफ 1
  • तो predicted और expected था विभिन्न स्तरों में की जाती है, predicted जाएगा में इस्तेमाल किया जाता है प्राप्त expected स्तरों
+1

हाय धन्यवाद। मैंने देखा कि एक चेतावनी है जब उदाहरण के लिए कक्षा में से कोई भी भविष्यवाणी नहीं करता है। क्या आपको लगता है कि गणना अभी भी मान्य है? – agenis

+1

धन्यवाद, आप सही हैं। मैंने इस समस्या को ठीक करने में थोड़ा सुधार किया है। अब यह ऐसे मामलों में सही काम कर रहा है। –

1

तुम भी confusionMatrix()caret पैकेज द्वारा प्रदान का उपयोग कर सकते हैं। आउटपुट में, दूसरों के बीच, संवेदनशीलता (जिसे याद के रूप में भी जाना जाता है) और पॉज़ पेड वैल्यू (जिसे परिशुद्धता भी कहा जाता है) के बीच शामिल है। तब एफ 1 को आसानी से की जा सकती है के रूप में ऊपर कहा गया है, के रूप में: F1 <- (2 * precision * recall)/(precision + recall)

0

कैरट पैकेज से confusionMatrix() एक उचित वैकल्पिक फ़ील्ड "सकारात्मक" निर्दिष्ट जो कारक सकारात्मक कारक के रूप में लिया जाना चाहिए के साथ इस्तेमाल किया जा सकता है।

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

इस कोड को भी इस तरह के एफ आँकड़ों, शुद्धता, आदि के रूप में अतिरिक्त मूल्यों दे देंगे

1

हम बस कैरट के confusionMatrix समारोह

result <- confusionMatrix(Prediction, Lable) 

# View confusion matrix overall 
result 

# F1 value 
result$byClass[7]