web-dev-qa-db-fra.com

Exactitude, précision et rappel pour les modèles multi-classes

Comment calculer la précision , la précision et rappel pour chaque classe d'un modèle Naive Bayes? J'utilise l'ensemble de données intégré: iris et package arbre et package e1071 pour Naive Bayes. La matrice de confusion est la suivante:

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

P.S: notez que j'utilise 75 entrées comme kit de formation et autres pour les tests:

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

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

Vous pouvez calculer et stocker la précision avec:

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

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

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

Si vous vouliez saisir la précision d'une classe particulière, vous pourriez faire:

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

Le rappel pour chaque classe (en supposant à nouveau que les prédictions sont sur les lignes et que 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 vouliez rappeler pour une classe particulière, vous pourriez faire quelque chose comme:

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

Si, à la place, vous aviez les vrais résultats comme lignes et les résultats prévus comme colonnes, vous inverseriez les définitions de précision et de rappel.

Les 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
23
josliber