2016-04-29 28 views
5

Sto provando a tracciare la curva ROC da una versione modificata dell'esempio CIFAR-10 fornita da tensorflow. È ora 2 classi anziché 10.Come tracciare una curva ROC con Tensorflow e scikit-learn?

L'uscita della rete sono chiamati logit e assume la forma:

[[-2,57313061 2,57,966399 millions] [,04,221377 millions -,04033273] [-1,42880082 1,43,337202 millions] [ -2,7692945 2,78,173304 millions] [-2,48195744 2,49,331546 millions] [2,0941,515 mila -2,10268974] [-3,51670194 3,53,267646 millions] [-2,74760485 2,75,617766 millions] ...]

Prima di tutto, che cosa questi logit in realtà rappresentano? Il livello finale nella rete è un "softmax lineare" del modulo WX + b.

Il modello è in grado di calcolare la precisione chiamando

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

Poi una volta che il grafico è stato inizializzato:

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

Questo funziona bene.

Ma ora come posso tracciare una curva ROC da questo?

Ho provato la funzione "sklearn.metrics.roc_curve()" (http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html#sklearn.metrics.roc_curve) ma non so cosa usare come parametro "y_score".

Qualsiasi aiuto sarebbe apprezzato!

+0

vedere qui [collegamento] (http://stackoverflow.com/questions/35811446/classification-accuracy-after-recall-and-precision/37275638#37275638) per un codice che calcola e traccia la curva ROC. –

risposta

1

'y_score' qui dovrebbe essere un array corrispondente alla probabilità di ciascun campione viene classificato come positivo (se positivo è stato etichettato come 1 nella propria matrice y_true)

In realtà, se l'uso della rete Softmax come l'ultimo livello, quindi il modello dovrebbe fornire la probabilità di ciascuna categoria per questa istanza. Ma i dati che hai fornito qui non sono conformi a questo formato. E ho controllato il codice di esempio: https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10.py sembra usare lo strato chiamato softmax_linear, so poco per questo esempio, ma suppongo che dovresti elaborare l'output con qualcosa come la funzione logistica per trasformarlo in probabilità.

Poi basta dargli da mangiare insieme con la vostra etichetta vera 'y_true' alla funzione scikit-learn:

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() 

quindi avviare una tensorboard:

tensorboard --logdir=/tmp/tensorboard_roc 

tensorboard_roc

per dettagli e codice, puoi visitare il mio blog: http://blog.csdn.net/mao_feng/article/details/54731098

+0

Ho usato questo codice nel mio modello, ma sul tensore vedo solo una linea retta da (0,0). – Kyrol