web-dev-qa-db-fra.com

Comment calculer la matrice de confusion pour la classification multiclass dans Scikit?

J'ai une tâche de classification multiclass. Quand je lance mon script basé sur exemple de scikit comme suit:

classifier = OneVsRestClassifier(GradientBoostingClassifier(n_estimators=70, max_depth=3, learning_rate=.02))

y_pred = classifier.fit(X_train, y_train).predict(X_test)
cnf_matrix = confusion_matrix(y_test, y_pred)

Je reçois cette erreur:

File "C:\ProgramData\Anaconda2\lib\site-packages\sklearn\metrics\classification.py", line 242, in confusion_matrix
    raise ValueError("%s is not supported" % y_type)
ValueError: multilabel-indicator is not supported

J'ai essayé de passer le labels=classifier.classes_ à confusion_matrix(), mais ça n'aide pas.

y_test et y_pred sont comme suit:

y_test =
array([[0, 0, 0, 1, 0, 0],
   [0, 0, 0, 0, 1, 0],
   [0, 1, 0, 0, 0, 0],
   ..., 
   [0, 0, 0, 0, 0, 1],
   [0, 0, 0, 1, 0, 0],
   [0, 0, 0, 0, 1, 0]])


y_pred = 
array([[0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0],
   ..., 
   [0, 0, 0, 0, 0, 1],
   [0, 0, 0, 0, 0, 1],
   [0, 0, 0, 0, 0, 0]])
7
YNr

Vous devez d’abord créer le tableau de sortie des étiquettes . Disons que vous avez 3 classes: 'cat', 'chien', 'maison' indexées: 0,1,2 . Et la prédiction pour 2 échantillons est: 'niche à chien'. Votre sortie sera: 

y_pred = [[0, 1, 0],[0, 0, 1]]

exécutez y_pred.argmax (1) pour obtenir: [1,2] Ce tableau représente les index des étiquettes originales, ce qui signifie: ['niche à chien']

num_classes = 3

# from lable to categorial
y_prediction = np.array([1,2]) 
y_categorial = np_utils.to_categorical(y_prediction, num_classes)

# from categorial to lable indexing
y_pred = y_categorial.argmax(1)
6
Naomi Fridman

Cela a fonctionné pour moi:

y_test_non_category = [ np.argmax(t) for t in y_test ]
y_predict_non_category = [ np.argmax(t) for t in y_predict ]

from sklearn.metrics import confusion_matrix
conf_mat = confusion_matrix(y_test_non_category, y_predict_non_category)

y_test et y_predict sont des variables catégoriques telles que les vecteurs one-hot.

4
ak2205

Je viens de soustraire la matrice de sortie y_test de la matrice de prédiction y_pred tout en conservant le format catégorique. Dans le cas de -1, j'ai supposé un faux négatif alors que dans le cas de 1, un faux positif. 

Suivant: 

if output_matrix[i,j] == 1 and predictions_matrix[i,j] == 1:  
    produced_matrix[i,j] = 2 

Terminer avec la notation suivante:

  • -1: faux négatif 
  • 1: faux positif 
  • 0: vrai négatif 
  • 2: vrai positif

Enfin, effectuez un comptage naïf, vous pouvez produire toute métrique de confusion.

0
mcchran