0

我想知道是否有一个简单的解决方案来获得我的分类器类的召回和精度值?使用Tensorflow CNN分类器获取精度和召回值

为了说明一些情况,我使用Tensorflow在Denny Britz代码的帮助下实现了20类CNN分类器:https://github.com/dennybritz/cnn-text-classification-tf

正如你可以在text_cnn.py年底看到他实现了一个简单的函数来计算全局精度:

# Accuracy 
     with tf.name_scope("accuracy"): 
      correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1)) 
      self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy") 

我如何能做到类似拿到召回和精度值的东西,任何想法不同类别?

也许我的问题听起来很愚蠢,但我有点失落,说实话。谢谢您的帮助。

+0

精度和召回率未针对多类分类器定义,仅针对二元分类器。 –

+0

我不确定我是否同意,因为精度是在算法声明为“i”的所有实例中正确声明类“i”的元素的分数。相反,召回是我们在世界状态的真实性为“我”的所有情况中正确地声明“我”的事件的一小部分。因此,对于每个班级的召回率和精确度的计算,您有2班或更多班级没有太大变化。但是,也许你的意思是他们没有为tensorflow中的多类分类器定义?那么这是我的不好:p – LoulouChameau

+0

哦,是的,你是对的,它仍然是二元的,但它可以应用于多类,我想你可以使用tf.contrib.metrics.confusion_matrix得到混淆矩阵,然后计算精度/回忆。 –

回答

0

使用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。

+0

这是如何工作DNNClassifier是一个类不是一个实例,因此没有自我,如:TypeError:predict_classes()缺少1所需的位置参数:'自'你如何初始化DNNClassifier? – AndyM

+0

按照此示例: https://www.tensorflow.org/api_docs/python/tf/contrib/learn/DNNClassifier – jpdoiron