2016-02-12 11 views
20

Я хотел бы знать, если есть способ реализовать различные функции оценки от scikit узнать пакет как эта Путаница:Tensorflow Точность/Recall оценка/F1 и матрица

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

в модель tensorflow к получить разный балл.

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

вместо «precision.eval», вы можете сделать «session.run» ([точность, предсказание], feed_dict = ...), который одновременно получит оба тензора. См. Http://stackoverflow.com/questions/33610685/in-tensorflow-what-is-the-difference-between-session-run-and-tensor-eval –

+0

Я понимаю ваш комментарий, но как это реализовать с помощью sklearn? Потому что в случае матрицы confusion, i не хочу точности! – nicolasdavid

+0

Но как мы можем нарисовать матрицу путаницы из тензорного потока (correct_prediction и y_Test (метки истинности)), так как я попросил об этом alrady, 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'? Поскольку похоже, что вы либо накапливаете результаты для всех партий в заданную эпоху, либо просто вычисляете путаницу для результатов одной партии, и в этом случае вам все равно придется накапливать результаты всех партии для путаницы по всю тестовую эпоху в массиве вне тензорного потока. – bordeo

+0

@nicolasdavid Я попробовал ваше решение, но получаю эту ошибку 'ValueError: Target - это многоклассов, но average = 'binary'. Выберите другую среднюю настройку. Мои 'y_pred' и' y_true' являются 1-м массивом, как требует пространственная привязка метода. Любое предложение? – Kyrol

+0

Я думаю, что лучше использовать API-интерфейсы показателей, представленные в 'tf.contrib.metrics', вместо того, чтобы смешивать функции метрик, предоставляемые scikit-learn с помощью тензорного потока. – Nandeesh

18

Вы действительно не нужно sklearn для расчета точности/вызова/f1 счетов. Вы можете легко выразить их в пути TF-иш, глядя на формулы

enter image description here

Теперь, если у вас есть actual и predicted значения в качестве векторов 0/1, можно вычислить TP, TN, FP, FN используя 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 

Теперь ваши показатели легко Расчитайте:

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

Обратите внимание на ошибку в (10.3), напомнить = tp/(tp + fn), – Bastiaan

+0

При вычислении точности по 'precision = TP/(TP + FP)', я нахожу, что точность всегда равна 0, целочисленное деление. Использование 'precision = tf.divide (TP, TP + FP)' работало для меня. Аналогично для отзыва. –

1

Использование метрик API ы предоставляется в tf.contrib.metrics, например:

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

Поскольку я не достаточно репутацию, чтобы добавить комментарий к Salvador Dalis ответить на это путь:

tf.count_nonzero бросает свои ценности в 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 возвращает индексы, поэтому кажется, что они не работают? –

Смежные вопросы