2017-08-10 2 views

Antwort

1

können Sie integrierte Funktionen verwenden tensorflow precisionrecall

recall = tf.metrics.recall(labels, predictions, **kwargs) 
precision = tf.metrics.precision(labels, predcitions, **kwargs) 
+0

Diese Funktionen berechnen keine Metriken für jede Klasse separat, wie die Frage fragt. – Avi

1

ich TF glaube nicht eine solche Funktionalität noch bietet. Wie in der Dokumentation (https://www.tensorflow.org/api_docs/python/tf/metrics/precision) heißt es, dass sowohl die Beschriftungen als auch die Vorhersagen zu boolen sind und sich daher nur auf die binäre Klassifikation beziehen. Vielleicht ist es möglich, die Beispiele eins zu kodieren und es würde funktionieren? Aber ich bin mir nicht sicher.

+0

Auch diese Funktionen berechnen Metriken nicht für jede Klasse separat, wie die Frage fragt. Wenn bestimmte Klassen in den Daten häufiger vorkommen als andere, werden diese Metriken von diesen häufigen Klassen dominiert. Was allgemein erwünscht ist, besteht darin, für jede Klasse einen separaten Rückruf und eine eigene Genauigkeit zu berechnen und sie dann über Klassen hinweg zu mitteln, um Gesamtwerte zu erhalten (ähnlich wie "tf.metrics.mean_per_class_accuracy"). Die Werte werden sich wahrscheinlich von denen unterscheiden, die mit "tf.metrics.recall" und "tf.metrics.precision" mit unausgeglichenen Daten erzielt werden. – Avi

+0

Eigentlich habe ich mich geirrt; 'tf.metrics.mean_per_class_accuracy' macht etwas anderes und ist keine gute Referenz für diese Frage. – Avi

2

Ich glaube, dass Sie nicht können Multiklassenpräzision, Rückruf, f1 mit den tf.metrics.precision/recall Funktionen. Sie können sklearn wie dies für ein 3-Klasse Szenario verwenden:

from sklearn.metrics import precision_recall_fscore_support as score 

prediction = [1,2,3,2] 
y_original = [1,2,3,3] 

precision, recall, f1 = score(y_original, prediction) 

print('precision: {}'.format(precision)) 
print('recall: {}'.format(recall)) 
print('fscore: {}'.format(fscore)) 

Dies wird eine Reihe von Präzision, erinnern Werte drucken, aber es formatiert werden, wie Sie möchten.

1

Hier ist eine Lösung, die für mich für ein Problem mit n = 6 Klassen funktioniert. Wenn Sie viele weitere Klassen haben, ist diese Lösung wahrscheinlich langsam und Sie sollten eine Art Mapping anstelle einer Schleife verwenden.

Angenommen, Sie haben eine heiße codierte Klassenetiketten in Reihen von Tensor labels und logits (oder posteriors) in Tensor labels. Wenn dann n die Anzahl der Klassen ist, versuchen Sie dies:

y_true = tf.argmax(labels, 1) 
y_pred = tf.argmax(logits, 1) 

recall = [0] * n 
update_op_rec = [[]] * n 

for k in range(n): 
    recall[k], update_op_rec[k] = tf.metrics.recall(
     labels=tf.equal(y_true, k), 
     predictions=tf.equal(y_pred, k) 
    ) 

Beachten Sie, dass innerhalb tf.metrics.recall, die Variablen labels und predictions zu boolean Vektoren wie in der 2 variable Fall eingestellt werden, was die Verwendung der Funktion ermöglicht.

Verwandte Themen