2015-10-12 5 views
8

Comment puis-je calculer précision, précision et rappel pour chaque classe d'un modèle Naive Bayes? J'utilise l'ensemble de données intégré: iris et le paquet l'arbre et le paquet e1071 pour Naive Bayes. La matrice de confusion est comme ci-dessous:exactitude, la précision et le rappel pour le modèle multi-classe

prediction setosa versicolor virginica 
setosa   29   0   0 
versicolor  0   20   2 
virginica  0   3  21 

PS: Notez que j'utilise 75 entrées comme l'ensemble de la formation et d'autres pour les tests:

iris.train <- c(sample(1:150, 75)) # have selected 75 randomly 

Répondre

13

Tout au long de cette réponse, mat est la matrice de confusion que vous décrire.

Vous pouvez calculer et la précision de magasin avec:

(accuracy <- sum(diag(mat))/sum(mat)) 
# [1] 0.9333333 

de précision pour chaque classe (en supposant que les prédictions sont sur les lignes et les vrais résultats sont sur les colonnes) peuvent être calculées avec:

(precision <- diag(mat)/rowSums(mat)) 
#  setosa versicolor virginica 
# 1.0000000 0.9090909 0.8750000 

Si vous voulez saisir la précision pour une classe particulière, vous pouvez faire:

(precision.versicolor <- precision["versicolor"]) 
# versicolor 
# 0.9090909 

Recall pour chaque classe (en supposant à nouveau les prédictions sont sur les lignes et les vrais résultats sont sur les colonnes) peut être calculé avec:

recall <- (diag(mat)/colSums(mat)) 
#  setosa versicolor virginica 
# 1.0000000 0.8695652 0.9130435 

Si vous voulez un rappel pour une classe particulière, vous pourriez faire quelque chose comme:

(recall.virginica <- recall["virginica"]) 
# virginica 
# 0.9130435 

Si au contraire vous avez eu les résultats réels que les lignes et les résultats prévus comme les colonnes, alors vous retournez la précision et le rappel des définitions.

données:

(mat = as.matrix(read.table(text=" setosa versicolor virginica 
setosa   29   0   0 
versicolor  0   20   2 
virginica  0   3  21", header=T))) 
#   setosa versicolor virginica 
# setosa   29   0   0 
# versicolor  0   20   2 
# virginica  0   3  21 
+1

Est-il possible de donner une note globale de F pour ces données en appliquant des moyennes? –

+1

@mlee_jordan Oui, vous pouvez. Le manuel scikit-learn est une ressource qui mérite d'être approfondie: http://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics. Cependant, il peut y avoir de meilleures ressources plus générales. En fait, si vous calculez le score F sur un cas multiclass, il calculera automatiquement le score par classe et la moyenne. Dans d'autres cas, comme le rappel, vous avez la possibilité de calculer des moyennes micro (compter tous les TP, FN, FP et calculer le score) ou des moyennes macro (calculer le score par classe et moyenne) lors du calcul du score. – Cerno