web-dev-qa-db-fra.com

Obtenir précision, rappel et score en F1 par classe à Keras

J'ai formé un réseau de neurones à l'aide du backend TensorFlow dans Keras (2.1.5) et de la bibliothèque keras-contrib (2.0.8) afin d'ajouter une couche CRF en sortie du réseau.

Je voudrais savoir comment obtenir la précision, le rappel et le score F1 pour chaque classe après avoir effectué les prédictions sur un ensemble de tests utilisant le NN. 

5
Haritz

Supposons que vous avez une fonction get_model() qui construit votre modèle identique à celui que vous avez formé et un chemin weights_path pointant vers votre fichier HDF5 contenant les poids de votre modèle:

model = get_model()
model.load_weights(weights_path)

Cela devrait charger votre modèle correctement. Ensuite, il vous suffit de définir une ImageDataGenerator de vos données de test et d’adapter le modèle pour obtenir des prédictions:

# Path to your folder testing data
testing_folder = ""
# Image size (set up the image size used for training)
img_size = 256
# Batch size (you should tune it based on your memory)
batch_size = 16

val_datagen = ImageDataGenerator(
    rescale=1. / 255)
validation_generator = val_datagen.flow_from_directory(
    testing_folder,
    target_size=(img_size, img_size),
    batch_size=batch_size,
    shuffle=False,
    class_mode='categorical')

Ensuite, vous pouvez faire en sorte que le modèle génère toutes les prédictions sur l'ensemble de votre jeu de données à l'aide de la méthode model.predict_generator():

# Number of steps corresponding to an Epoch
steps = 100
predictions = model.predict_generator(validation_generator, steps=steps)

Enfin, créez une matrice de confusion en utilisant la méthode metrics.confusion_matrix() du package sklearn:

val_preds = np.argmax(predictions, axis=-1)
val_trues = validation_generator.classes
cm = metrics.confusion_matrix(val_trues, val_preds)

Ou obtenez toutes les précisions, rappels et scores f1 pour toutes les classes en utilisant la méthode metrics.precision_recall_fscore_support() à partir de sklearn (l'argument average=None génère des métriques pour toutes les classes):

# label names
labels = validation_generator.class_indices.keys()
precisions, recall, f1_score, _ = metrics.precision_recall_fscore_support(val_trues, val_preds, labels=labels)

Je ne l'ai pas testé, mais je suppose que cela vous aidera.

2
Ferran Parés

Voir ma question où je me demande si je le fais bien. Si oui, alors cela pourrait être une réponse à votre question.

0
yannis

Regardez sklearn.metrics.classification_report :

from sklearn.metrics import classification_report

y_pred = model.predict(x_test)
print(classification_report(y_true, y_pred))

vous donne quelque chose comme

             precision    recall  f1-score   support

    class 0       0.50      1.00      0.67         1
    class 1       0.00      0.00      0.00         1
    class 2       1.00      0.67      0.80         3

avg / total       0.70      0.60      0.61         5
0
Martin Thoma