Tensorflow Précision / Rappel / F1 score et la Confusion de la matrice
Je voudrais savoir si il existe un moyen de mettre en œuvre les différentes fonction de score à partir de la scikit learn paquet comme celui-ci :
from sklearn.metrics import confusion_matrix
confusion_matrix(y_true, y_pred)
dans un tensorflow modèle pour obtenir la partition différente.
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})
Vais-je avoir à exécuter de nouveau la session pour obtenir la prédiction ?
- au lieu de "l'exactitude.eval", vous pouvez le faire "session.exécuter([exactitude, la prédiction], feed_dict=...), qui vous permettra d'obtenir les deux tenseurs en même temps. Voir stackoverflow.com/questions/33610685/...
- Je comprends votre commentaire, mais comment puis-je mettre en œuvre des ce avec sklearn ? Parce que dans la matrice de confusion cas, je ne veux pas l'exactitude !
- Mais comment pouvons-nous tirer d'une confusion de la matrice de tensorflow (correct_prediction et y_Test(la vérité étiquettes)) comme je l'ai alrady demandé ici,..stackoverflow.com/questions/35792969/.... s'il vous Plaît aider
- Cette Question s'est également semblable à celui-ci avec plus détaillée de la solution: stackoverflow.com/questions/35756710/...
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas vraiment besoin sklearn pour calculer la précision/rappel/f1 score. Vous pouvez facilement exprimer dans TF-ish sorte en regardant les formules:
Maintenant, si vous avez votre
actual
etpredicted
valeurs en tant que vecteurs de 0/1, vous pouvez calculer TP, TN, FP, FN à l'aide de tf.count_nonzero:Maintenant vos mesures sont faciles à calculer:
precision = TP / (TP + FP)
, je trouve que la précision est toujours 0, il semble qu'il n'division entière. À l'aide deprecision = tf.divide(TP, TP + FP)
a fonctionné pour moi, si. Similaire pour rappel.values as vectors of 0/1
, dites-vous que les valeurs sont onehot codages? par exemple,predicted = [0, 1] actual = [1, 0]
est un faux positif pour le cas binairePeut-être cet exemple va vous parler :
test_arrays
ettrain_arrays
sont? Parce qu'on dirait que vous êtes en accumulant les résultats de tous les lots dans une époque donnée, ou vous êtes juste un calcul de la confusion pour les résultats d'un seul lot, auquel cas vous souhaitez toujours avoir à accumuler les résultats de tous les lots pour une confusion w.r.t. l'ensemble du test de l'époque dans un tableau en dehors de tensorflow.ValueError: Target is multiclass but average='binary'. Please choose another average setting
. mony_pred
ety_true
sont à la fois 1d tableau-comme spacification de la méthode de besoin. Toute suggestion ?tf.contrib.metrics
au lieu de mélanger les métriques de fonctions fournies par scikit-learn avec tensorflow.Multi-étiquette
Des réponses précédentes ne précise pas comment gérer le multi-label cas jusqu'ici est une version de mise en œuvre trois types de multi-étiquette f1 score en tensorflow: micro, macro et pondéré (comme par scikit-learn)
Mise à jour (06/06/18): j'ai écrit un post de blog sur la façon de calculer le streaming multilabel f1 score dans le cas où il peut aider n'importe qui (c'est un processus de longue durée, qui ne veulent pas surcharger cette réponse)
Exactitude
sorties:
Puisque je n'ai pas assez de réputation pour ajouter un commentaire à Salvador Dalis répondre à cette question est le chemin à parcourir:
tf.count_nonzero
jette vos valeurs dans untf.int64
sauf indication contraire. Aide:est une très bonne idée.
Utiliser les paramètres Api fournies en tf.contrib.les métriques, par exemple: