2016-04-29 8 views
5

Ich versuche, die ROC-Kurve aus einer modifizierten Version des CIFAR-10-Beispiels von Tensorflow plotten. Es ist jetzt zwei Klassen statt 10.Wie zeichne ich eine ROC-Kurve mit Tensorflow und scikit-learn?

Der Ausgang des Netzes Logits und die Form genannt:

[[-2,57313061 2,57966399] [0,04221377 -,04033273] [-1,42880082 1,43337202] [ -2,7692945 2,78173304] [-2,48195744 2,49331546] [2,0941515 -2,10268974] [-3,51670194 3,53267646] [-2,74760485 2,75617766] ...]

Vor allem was stellen diese Logits eigentlich? Die letzte Schicht im Netzwerk ist ein "softmax linear" der Form WX + b.

Das Modell ist in der Lage genau zu berechnen durch

top_k_op = tf.nn.in_top_k(logits, labels, 1) 

Dann ruft, sobald der Graph initialisiert wurde:

predictions = sess.run([top_k_op]) 
predictions_int = np.array(predictions).astype(int) 
true_count += np.sum(predictions) 
... 
precision = true_count/total_sample_count 

Dies funktioniert gut.

Aber wie kann ich jetzt eine ROC-Kurve plotten?

Ich habe die Funktion "sklearn.metrics.roc_curve()" (http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html#sklearn.metrics.roc_curve) versucht, aber ich weiß nicht, was ich als meinen "y_score" -Parameter verwenden soll.

Jede Hilfe wäre willkommen!

+0

siehe hier [link] (http://stackoverflow.com/questions/35811446/classification-accuracy-after-recall-and-precision/37275638#37275638) für einen Code, der die ROC-Kurve berechnet und plottet. –

Antwort

1

‚y_score‘ hier sollte ein Array entsprechend der Wahrscheinlichkeit jeder Probe, die als positiv eingestuft werden (falls positiv als 1 in Ihrem y_true Array markiert wurde)

Eigentlich, wenn Ihr Netzwerk Verwendung Softmax als die letzte Schicht, dann sollte das Modell die Wahrscheinlichkeit jeder Kategorie für diese Instanz ausgeben. Aber die Daten, die Sie hier angeben, stimmen nicht mit diesem Format überein. Und ich überprüfte den Beispielcode: https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10.py es scheint, verwenden Sie die Schicht namens softmax_linear, ich weiß wenig für dieses Beispiel, aber ich denke, Sie sollten die Ausgabe mit etwas wie Logistische Funktion verarbeiten, um es in die Wahrscheinlichkeit zu verwandeln.

Dann füttern sie nur mit Ihrem wahren Label 'y_true' zusammen mit der Scikit-Learn-Funktion:

y_score = np.array(output)[:,1] 
roc_curve(y_true, y_score) 
0
import tensorflow as tf 
tp = [] # the true positive rate list 
fp = [] # the false positive rate list 
total = len(fp) 
writer = tf.train.SummaryWriter("/tmp/tensorboard_roc") 
for idx in range(total): 
    summt = tf.Summary() 
    summt.value.add(tag="roc", simple_value = tp[idx]) 
    writer.add_summary (summt, tp[idx] * 100) #act as global_step 
    writer.flush() 

dann eine tensorboard starten:

tensorboard --logdir=/tmp/tensorboard_roc 

tensorboard_roc

Für Details und Code können Sie meinen Blog besuchen: http://blog.csdn.net/mao_feng/article/details/54731098

+0

Ich habe diesen Code in meinem Modell verwendet, aber auf Tensorboard sehe ich nur eine gerade Linie von (0,0). – Kyrol