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]])
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)
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)
où y_test
et y_predict
sont des variables catégoriques telles que les vecteurs one-hot.
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:
Enfin, effectuez un comptage naïf, vous pouvez produire toute métrique de confusion.