2016-02-12 6 views
20

मैं अगर वहाँ scikit से अलग स्कोर समारोह को लागू करने के इस तरह के पैकेज जानने के लिए एक रास्ता है पता करने के लिए करना चाहते हैं: करने के लिए एक tensorflow मॉडल मेंTensorflow प्रेसिजन/याद/एफ 1 स्कोर और भ्रम मैट्रिक्स

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

अलग स्कोर प्राप्त करें।

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

क्या मुझे पूर्वानुमान प्राप्त करने के लिए सत्र फिर से चलाया जाएगा?

+1

"सटीकता.एवल" के बजाय, आप "session.run ([सटीकता, भविष्यवाणी], feed_dict = ...) कर सकते हैं, जो एक ही समय में दोनों टेंसर प्राप्त करेगा। Http://stackoverflow.com देखें/प्रश्न/33610685/इन-टेंसफोर्लो-क्या-अंतर-अंतर-सत्र-रन-एंड-टेंसर-eval –

+0

मैं आपकी टिप्पणी को समझता हूं लेकिन मैं इसे स्केलर के साथ कैसे कार्यान्वित कर सकता हूं? क्योंकि भ्रम मैट्रिक्स मामले में, मैं सटीकता नहीं चाहते हैं! – nicolasdavid

+0

लेकिन हम tensorflow (correct_prediction और y_Test (सत्य लेबल)) से भ्रम मैट्रिक्स कैसे बना सकते हैं क्योंकि मैंने इसे यहां से पूछा है, .. http: //stackoverflow.com/questions/35792969/how ---गणना-सटीक-और-याद-से-एक-अपूर्ण-भ्रम-मैट्रिक्स .. कृपया –

उत्तर

25

हो सकता है कि इस उदाहरण आप से बात करेंगे:

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

क्या आप अपडेट कर सकते हैं और समझा सकते हैं कि 'test_arrays' और' train_arrays' क्या हैं? क्योंकि ऐसा लगता है कि आप या तो किसी दिए गए युग में सभी बैचों के परिणामों को जमा कर रहे हैं, या आप केवल एक बैच के परिणामों के लिए भ्रम की गणना कर रहे हैं, इस मामले में आपको अभी भी सभी परिणामों के परिणाम जमा करना होगा एक भ्रम wrt के लिए बैच tensorflow के बाहर एक सरणी में पूरा परीक्षण युग। – bordeo

+0

@nicolasdavid मैंने आपके समाधान की कोशिश की, लेकिन मुझे यह त्रुटि मिली 'ValueError: लक्ष्य multiclass लेकिन औसत =' बाइनरी 'है। कृपया एक और औसत सेटिंग चुनें। मेरी 'y_pred' और' y_true' दोनों 1 डी सरणी हैं जैसे कि विधि की स्पासिफिकेशन की आवश्यकता होती है। कोई सुझाव? – Kyrol

+0

मुझे लगता है कि tensorflow के साथ scikit-learn द्वारा प्रदान किए गए मीट्रिक फ़ंक्शंस को मिश्रित करने के बजाय 'tf.contrib.metrics' में प्रदान किए गए मीट्रिक API का उपयोग करना बेहतर है। – Nandeesh

18

आप वास्तव में नहीं है sklearn जरूरत परिशुद्धता/याद/f1 स्कोर की गणना करने के लिए। आप आसानी से सूत्रों

enter image description here

अब अगर आप 0/1 की वैक्टर के रूप में अपने actual और predicted मान को देखकर TF-ish तरीके से व्यक्त कर सकते हैं, तो आप टी.पी., तमिलनाडु, एफपी, एफ एन गणना कर सकते हैं tf.count_nonzero का उपयोग कर: आपके तालिका

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 

अब caclulate आसान है:

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

त्रुटि (10.3) में त्रुटि, याद रखें = टीपी/(टीपी + एफएन), – Bastiaan

+0

'सटीक = टीपी/(टीपी + एफपी)' द्वारा परिशुद्धता की गणना करते समय, मुझे लगता है कि परिशुद्धता हमेशा 0 में परिणाम देती है, जैसा कि ऐसा लगता है पूर्णांक विभाजन। हालांकि, 'सटीक = tf.divide (टीपी, टीपी + एफपी)' का उपयोग करना मेरे लिए काम करता है। याद करने के लिए इसी तरह। –

1

उपयोग मैट्रिक्स एपीआई tf.contrib.metrics में प्रदान की जाती है, उदाहरण के लिए:

tf.count_nonzero एक में अपने मूल्यों डाले:

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

ध्यान दें कि ये संचयी परिणाम हैं जो भ्रमित हो सकते हैं। –

2

के बाद से मैं करने के लिए साल्वाडोर Dalis का जवाब इस जाने का रास्ता है कोई टिप्पणी जोड़ने के लिए पर्याप्त नहीं प्रतिष्ठा है tf.int64 जब तक अन्यथा निर्दिष्ट नहीं किया जाता है। का उपयोग:

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) 

एक वास्तविक विचार है।

+0

Argmax सूचकांक देता है, तो ऐसा लगता है कि ये काम नहीं करेंगे? –

संबंधित मुद्दे