Comment écrire une matrice de confusion en Python?
J'ai écrit une confusion matrice de calcul de code en Python:
def conf_mat(prob_arr, input_arr):
# confusion matrix
conf_arr = [[0, 0], [0, 0]]
for i in range(len(prob_arr)):
if int(input_arr[i]) == 1:
if float(prob_arr[i]) < 0.5:
conf_arr[0][1] = conf_arr[0][1] + 1
else:
conf_arr[0][0] = conf_arr[0][0] + 1
elif int(input_arr[i]) == 2:
if float(prob_arr[i]) >= 0.5:
conf_arr[1][0] = conf_arr[1][0] +1
else:
conf_arr[1][1] = conf_arr[1][1] +1
accuracy = float(conf_arr[0][0] + conf_arr[1][1])/(len(input_arr))
prob_arr est un tableau que mon code de classification retourné et un exemple de tableau est comme ceci:
[1.0, 1.0, 1.0, 0.41592955657342651, 1.0, 0.0053405015805891975, 4.5321494433440449e-299, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.70943426182688163, 1.0, 1.0, 1.0, 1.0]
input_arr est à l'origine d'étiquettes de classe pour un jeu de données et c'est comme ça:
[2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1]
Ce que mon code est en train de faire est: - je obtenir prob_arr et input_arr et pour chaque classe (1 et 2) je vérifie si ils sont mal classés ou non.
Mais mon code ne fonctionne que pour les deux classes. Si j'exécute ce code pour plusieurs classé de données, il ne fonctionne pas. Comment puis-je faire cela pour de multiples classes?
Par exemple, pour un ensemble de données avec trois classes, il doit retourner: [[21,7,3],[3,38,6],[5,4,19]]
Vous devez vous connecter pour publier un commentaire.
Scikit-Learn offre un
confusion_matrix
fonctionde sortie d'un tableau Numpy
Mais vous pouvez également créer une matrice de confusion en utilisant les Pandas:
Vous obtiendrez une (bien marqués) les Pandas DataFrame:
Si vous ajoutez
margins=True
commevous aurez également la somme de chaque ligne et colonne:
Vous pouvez également obtenir un normalisée de la confusion de la matrice à l'aide de:
Vous pouvez tracer cette confusion_matrix à l'aide de
Ou un terrain normalisé de la confusion de la matrice à l'aide de:
Vous pourriez également être intéressé par ce projet https://github.com/pandas-ml/pandas-ml et son Pip paquet https://pypi.python.org/pypi/pandas_ml
Avec ce forfait, la confusion de la matrice peut être joli imprimé, de l'intrigue.
Vous pouvez binariser une matrice de confusion, obtenir des statistiques de catégories telles que les TP, TN, FP, FN, ACC, TPR, FPR, FNR, TNR (SPC), LR+, LR-, DOR, de TVC, RAD, POUR la VAN et quelques statistiques globales
J'ai remarqué qu'une nouvelle bibliothèque Python sur la Confusion de la Matrice nommé PyCM est: peut-être vous pouvez avoir un coup d'oeil.
df_conf_norm = df_confusion / df_confusion.sum(axis=1)
n'est pas la création d'un normalisée de la confusion de la matrice: les lignes doivent somme de 1. Vous avez réellement besoin:df_confusion.values / df_confusion.sum(axis=1)[:,None]
Si cela crée un tableau numpy comme les pandas va se plaindre sans.values
. Voir: stackoverflow.com/questions/19602187/...Scikit-learn (que je recommande d'utiliser de toute façon), elle a inclus dans le
metrics
module:Près d'une décennie s'est écoulée, mais les solutions (sans sklearn) à ce poste sont alambiquées et inutilement long. Le calcul d'une matrice de confusion peut être fait proprement en Python en quelques lignes. Par exemple:
@numba.jit
: numpy : 83 ms par boucle, numba: 2.4 ms par boucle (à l'exception du premier appel )Si vous ne voulez pas scikit-apprendre à faire le travail pour vous...
Ou de prendre un coup d'oeil à une implémentation plus complète ici dans NLTK.
Cette fonction crée de la confusion des matrices pour n'importe quel nombre de classes.
Contrairement à votre fonction ci-dessus, vous devez extraire le prédit de classes avant l'appel de la fonction, basée sur vos résultats de la classification, c'est à dire qqch. comme
[
:m = [[[0] * ...
Vous pouvez rendre votre code plus concis et (parfois) à courir plus vite à l'aide de
numpy
. Par exemple, dans deux classes de cas votre fonction peut être réécrit de la manière (voirmply.acc()
):où:
Voici une confusion de la matrice de classe qui prend en charge d'impression, etc:
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.metrics.confusionmatrix-pysrc.html
Un numpy seule solution pour n'importe quel nombre de classes qui ne nécessite pas de boucle:
classes = np.unique(pred).size
Mise à jour
Depuis la rédaction de ce post, j'ai mis à jour ma bibliothèque de la mise en œuvre d'inclure quelques autres fonctionnalités intéressantes. Comme avec le code ci-dessous, pas de tiers dépendances sont nécessaires. La classe peut également sortie une belle tabulation tableau, semblable à beaucoup d'couramment utilisé des logiciels statistiques. Voir ce Gist.
Exemple d'utilisation de la ci-dessus Gist
Voici un exemple de sortie:
En plus de comptages bruts, nous pouvons sortie normalisée de la confusion de la matrice (c'est à dire avec des proportions)
Un Simple Multiclass Mise En Œuvre
Un multi-classe de la confusion de la matrice peut être calculée incroyablement simplement avec de la vanille Python dans environ O(N) fois. Tout ce que nous devons faire est de jumeler les classes uniques trouvés dans la
actual
vecteur dans un 2-dimensions de la liste. À partir de là, il nous suffit de parcourir la zippéeactual
etpredicted
de vecteurs et de remplir les comtes.Utilisation
Remarque: la
actual
classes sont le long des colonnes et lapredicted
classes sont le long de la lignes de.Les Noms de classe Peuvent être des Chaînes de caractères ou des nombres Entiers
Vous Pouvez Également Retourner La Matrice Avec Les Proportions (Normalisation)
L'extraction de Statistiques à Partir d'une Classification Multiple de la Confusion de la Matrice
Une fois que vous avez la matrice, vous pouvez calculer un tas de statistiques pour évaluer votre classificateur. Cela dit, l'extraction de la valeur d'une confusion configuration de la matrice de classement multiple peut être un peu mal à la tête. Voici une fonction qui renvoie la matrice de confusion et de statistiques par classe:
Calculée De La Statistique
Ci-dessus, la matrice de confusion est utilisé pour calculer les statistiques pour chaque classe, qui sont retournés dans un
OrderedDict
avec la structure suivante:Vous devriez carte de classes à une ligne dans la matrice de confusion.
Ici la cartographie est trivial:
Dans votre boucle, de calculer, de
expected_row
,correct_row
, et l'incrément deconf_arr[expected_row][correct_row]
. Vous aurez même moins de code que ce que vous avez commencé avec.Dans un sens général, vous allez avoir besoin de changer votre probabilité de tableau. Au lieu d'avoir un seul numéro pour chaque instance et de la classification basée sur si oui ou non il est de plus de 0,5, vous allez avoir besoin d'une liste de scores (un pour chaque classe), puis prendre le plus grand des notes de la classe qui a été choisie (un.k.un. argmax).
Vous pouvez utiliser un dictionnaire pour tenir les probabilités pour chaque classification:
Le choix d'une classification serait quelque chose comme:
Cette traite le cas où les deux classes ont les mêmes scores. Vous pouvez obtenir un score, en choisissant la première dans cette liste, mais la façon dont vous gérer cela dépend de ce que vous êtes le classement.
Une fois que vous avez votre liste de prédit de classes et d'une liste de prévu de classes, vous pouvez utiliser le code Torsten Marek's pour créer la confusion tableau et calculer l'exactitude.
J'ai écrit une classe simple de construire une matrice de confusion, sans la nécessité de dépendre d'une machine d'apprentissage de la bibliothèque.
La classe peut être utilisée comme:
La classe ConfusionMatrix:
Seulement avec numpy, nous pouvons le faire comme suit compte tenu de l'efficacité:
Pour d'autres fonctionnalités comme l'intrigue, le moyen-reconnaissance de dette, voir mes dépôts.
Ici est une simple application qui gère un nombre inégal de classes dans les réels et les étiquettes (voir les exemples 3 et 4). J'espère que cela aide!
Pour les gens qui viennent d'apprendre cela, voici un rapide examen. Les étiquettes pour les colonnes indiquent les prévisions de la classe, et les étiquettes pour les lignes indiquent la classe correcte. Dans l'exemple 1, nous avons [3 1] sur la ligne du haut. Encore une fois, les lignes indiquent la vérité, alors cela signifie que la bonne étiquette est "0" et il y a 4 exemples avec la vérité terrain étiquette de "0". Les colonnes indiquent les prédictions, nous avons donc les 3/4 des échantillons correctement étiquetés comme "0", mais 1/4 a été mal étiqueté comme un "1".
Exemple 1:
Exemple 2:
Exemple 3:
Exemple 4: