使用tf.metrics的伎俩对我来说:
#define the method
x = tf.placeholder(tf.int32,)
y = tf.placeholder(tf.int32,)
acc, acc_op = tf.metrics.accuracy(labels=x, predictions=y)
rec, rec_op = tf.metrics.recall(labels=x, predictions=y)
pre, pre_op = tf.metrics.precision(labels=x, predictions=y)
#predict the class using your classifier
scorednn = list(DNNClassifier.predict_classes(input_fn=lambda: input_fn(testing_set)))
scoreArr = np.array(scorednn).astype(int)
#run the session to compare the label with the prediction
sess=tf.Session()
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
v = sess.run(acc_op, feed_dict={x: testing_set["target"],y: scoreArr}) #accuracy
r = sess.run(rec_op, feed_dict={x: testing_set["target"],y: scoreArr}) #recall
p = sess.run(pre_op, feed_dict={x: testing_set["target"],y: scoreArr}) #precision
print("accuracy %f", v)
print("recall %f", r)
print("precision %f", p)
结果:
accuracy %f 0.686667
recall %f 0.978723
precision %f 0.824373
注:准确度,我会用:
accuracy_score = DNNClassifier.evaluate(input_fn=lambda:input_fn(testing_set),steps=1)["accuracy"]
因为它更简单,已经在评估中计算了。
如果您不想要累计结果,还需要调用variables_initializer。
精度和召回率未针对多类分类器定义,仅针对二元分类器。 –
我不确定我是否同意,因为精度是在算法声明为“i”的所有实例中正确声明类“i”的元素的分数。相反,召回是我们在世界状态的真实性为“我”的所有情况中正确地声明“我”的事件的一小部分。因此,对于每个班级的召回率和精确度的计算,您有2班或更多班级没有太大变化。但是,也许你的意思是他们没有为tensorflow中的多类分类器定义?那么这是我的不好:p – LoulouChameau
哦,是的,你是对的,它仍然是二元的,但它可以应用于多类,我想你可以使用tf.contrib.metrics.confusion_matrix得到混淆矩阵,然后计算精度/回忆。 –