2016-02-12 10 views
20

Ich mag würde wissen, ob es einen Weg gibt, die unterschiedliche Score-Funktion aus dem scikit lernen Paket wie diese umzusetzen:Tensorflow Precision/Recall/F1 Partitur und Verwirrung Matrix

from sklearn.metrics import confusion_matrix 
confusion_matrix(y_true, y_pred) 

in ein tensorflow Modell Holen Sie sich die unterschiedliche Punktzahl.

with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess: 
init = tf.initialize_all_variables() 
sess.run(init) 
for epoch in xrange(1): 
     avg_cost = 0. 
     total_batch = len(train_arrays)/batch_size 
     for batch in range(total_batch): 
       train_step.run(feed_dict = {x: train_arrays, y: train_labels}) 
       avg_cost += sess.run(cost, feed_dict={x: train_arrays, y: train_labels})/total_batch 
     if epoch % display_step == 0: 
       print "Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost) 

print "Optimization Finished!" 
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1)) 
# Calculate accuracy 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) 
print "Accuracy:", batch, accuracy.eval({x: test_arrays, y: test_labels}) 

Muss ich die Sitzung erneut ausführen, um die Vorhersage zu erhalten?

+1

anstelle von "accuracy.eval" können Sie "session.run ([Genauigkeit, Vorhersage], feed_dict = ...) ausführen, die beide Tensoren gleichzeitig erhalten. Siehe http://stackoverflow.com/questions/33610685/intensorflow-was-ist-der-unterschied-zwischen-sitzungslauf-und-tensor-eval –

+0

Ich verstehe deinen Kommentar, aber wie kann ich dies mit sklearn implementieren? Weil in der Verwirrung Matrix Fall, ich Ich will nicht die Genauigkeit! – nicolasdavid

+0

Aber wie können wir eine Verwirrung Matrix aus Tensorflow (correct_prediction und y_Test (Wahrheit Etiketten)), wie ich habe schon gefragt, es hier, .. http: //stackoverflow.com/questions/35792969/how -zur-Berechnung-Präzision-und-Rückruf-von-einer-unvollständigen-Verwirrung-Matrix .. Bitte helfen –

Antwort

25

Vielleicht wird dieses Beispiel zu dir sprechen:

pred = multilayer_perceptron(x, weights, biases) 
    correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1)) 
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) 

    with tf.Session() as sess: 
    init = tf.initialize_all_variables() 
    sess.run(init) 
    for epoch in xrange(150): 
      for i in xrange(total_batch): 
        train_step.run(feed_dict = {x: train_arrays, y: train_labels}) 
        avg_cost += sess.run(cost, feed_dict={x: train_arrays, y: train_labels})/total_batch   
      if epoch % display_step == 0: 
        print "Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost) 

    #metrics 
    y_p = tf.argmax(pred, 1) 
    val_accuracy, y_pred = sess.run([accuracy, y_p], feed_dict={x:test_arrays, y:test_label}) 

    print "validation accuracy:", val_accuracy 
    y_true = np.argmax(test_label,1) 
    print "Precision", sk.metrics.precision_score(y_true, y_pred) 
    print "Recall", sk.metrics.recall_score(y_true, y_pred) 
    print "f1_score", sk.metrics.f1_score(y_true, y_pred) 
    print "confusion_matrix" 
    print sk.metrics.confusion_matrix(y_true, y_pred) 
    fpr, tpr, tresholds = sk.metrics.roc_curve(y_true, y_pred) 
+1

können Sie aktualisieren und erklären, was 'test_arrays' und' train_arrays' sind? Da es so aussieht, als ob Sie entweder die Ergebnisse für alle Stapel in einer bestimmten Epoche akkumulieren, oder Sie nur die Verwirrung für die Ergebnisse eines einzelnen Stapels berechnen, in diesem Fall müssten Sie noch die Ergebnisse von allen akkumulieren Chargen für eine Verwirrung wrt die gesamte Testzeit in einem Array außerhalb des Tensorflusses. – bordeo

+0

@nicolasdavid Ich habe Ihre Lösung versucht, aber ich bekomme diesen Fehler 'ValueError: Target ist Multiklasse, aber Durchschnitt = 'binär'. Bitte wählen Sie eine andere durchschnittliche Einstellung. meine 'y_pred' und' y_true' sind beide 1d array-like wie die spacification der Methode erfordern. Irgendwelche Vorschläge? – Kyrol

+0

Ich denke, es ist besser, die in "tf.contrib.metrics" bereitgestellten Metrik-APIs zu verwenden, anstatt die von scikit-learn mit Tensorflow bereitgestellten Metrikfunktionen zu mischen. – Nandeesh

18

Sie nicht wirklich brauchen sklearn Präzision/Rückruf/f1-Score zu berechnen. Sie können sie in der TF-ish Art und Weise leicht ausdrücken

enter image description here

nun bei den Formeln suchen, wenn Sie Ihre actual und predicted Werte als Vektoren von 0/1 haben, können Sie berechnen, TP, TN, FP, FN tf.count_nonzero mit:

TP = tf.count_nonzero(predicted * actual) 
TN = tf.count_nonzero((predicted - 1) * (actual - 1)) 
FP = tf.count_nonzero(predicted * (actual - 1)) 
FN = tf.count_nonzero((predicted - 1) * actual 

Jetzt ist Ihre Metriken einfach zu caclulate:

precision = TP/(TP + FP) 
recall = TP/(TP + FN) 
f1 = 2 * precision * recall/(precision + recall) 
+3

Beachte den Fehler in (10.3), recall = tp/(tp + fn), – Bastiaan

+0

Wenn ich Präzision mit 'Präzision = TP/(TP + FP)' berechne, finde ich, dass Präzision immer zu 0 führt, wie es scheint ganzzahlige Division. Die Verwendung von 'precision = tf.divide (TP, TP + FP)' funktionierte jedoch für mich. Ähnlich für den Rückruf. –

1

verwenden Sie die Metriken API s in tf.contrib.metrics, zum Beispiel zur Verfügung gestellt:

labels = ... 
predictions = ... 

accuracy, update_op_acc = tf.contrib.metrics.streaming_accuracy(labels, predictions) 
error, update_op_error = tf.contrib.metrics.streaming_mean_absolute_error(labels, predictions) 

sess.run(tf.local_variables_initializer()) 
for batch in range(num_batches): 
    sess.run([update_op_acc, update_op_error]) 
accuracy, mean_absolute_error = sess.run([accuracy, mean_absolute_error]) 
+0

Beachten Sie, dass dies kumulative Ergebnisse sind, die möglicherweise verwirrend sind. –

2

Da ich nicht genug Ruf um einen Kommentar hinzufügen zu Salvador Dalis beantwortet dies der Weg zu gehen:

tf.count_nonzero wirft Ihre Werte in eine tf.int64, sofern nicht anders angegeben. Verwendung:

argmax_prediction = tf.argmax(prediction, 1) 
argmax_y = tf.argmax(y, 1) 

TP = tf.count_nonzero(argmax_prediction * argmax_y, dtype=tf.float32) 
TN = tf.count_nonzero((argmax_prediction - 1) * (argmax_y - 1), dtype=tf.float32) 
FP = tf.count_nonzero(argmax_prediction * (argmax_y - 1), dtype=tf.float32) 
FN = tf.count_nonzero((argmax_prediction - 1) * argmax_y, dtype=tf.float32) 

ist eine wirklich gute Idee.

+0

argmax gibt Indizes zurück, so dass es scheint, dass diese nicht funktionieren? –