2017-08-10 1564 views

回答

1

您可以使用内置的tensorflow功能precisionrecall

recall = tf.metrics.recall(labels, predictions, **kwargs) 
precision = tf.metrics.precision(labels, predcitions, **kwargs) 
+0

正如问题所要求的那样,这些函数不会为每个类分别计算度量标准。 – Avi

1

我相信TF不提供这样的功能呢。根据文档(https://www.tensorflow.org/api_docs/python/tf/metrics/precision),它表示标签和预测都将转换为bool,因此它只涉及二进制分类。也许有可能对这些例子进行热门编码,它会起作用吗?但不确定这一点。

+0

同样,这些函数不会为每个类别单独计算度量,正如问题所要求的那样。如果某些类比其他类更频繁地出现在数据中,则这些度量将由那些频繁的类所支配。通常需要的是为每个类别计算单独的召回率和精度,然后通过类别平均它们以获得总体值(类似于tf.metrics.mean_per_class_accuracy)。这些值可能与使用tf.metrics.recall和tf.metrics.precision获得的不平衡数据不同。 – Avi

+0

其实我错了; 'tf.metrics.mean_per_class_accuracy'做了一些不同的事情,对这个问题不是很好的参考。 – Avi

2

我相信你不能用tf.metrics.precision/recall函数做多类精度,回忆,f1。您可以使用sklearn像这样一类三方案:

from sklearn.metrics import precision_recall_fscore_support as score 

prediction = [1,2,3,2] 
y_original = [1,2,3,3] 

precision, recall, f1 = score(y_original, prediction) 

print('precision: {}'.format(precision)) 
print('recall: {}'.format(recall)) 
print('fscore: {}'.format(fscore)) 

这将打印的精度数组,召回值,但只要你喜欢格式化。

1

下面是一个解决方案,为我工作的n = 6类的问题。如果你有更多的类,这个解决方案可能很慢,你应该使用某种映射而不是循环。

假设您在张量labels和张量labels中的logits(或posters)行中有一个热编码类标签。然后,如果n是类的数量,尝试:

y_true = tf.argmax(labels, 1) 
y_pred = tf.argmax(logits, 1) 

recall = [0] * n 
update_op_rec = [[]] * n 

for k in range(n): 
    recall[k], update_op_rec[k] = tf.metrics.recall(
     labels=tf.equal(y_true, k), 
     predictions=tf.equal(y_pred, k) 
    ) 

注意,内部tf.metrics.recall,变量labelspredictions被设定为布尔矢量像在2变量的情况下,其允许使用的功能。