0

내 분류 자의 클래스에 대해 리콜과 정밀도 값을 얻는 간단한 해결책이 있는지 궁금합니다.Tensorflow CNN 분류자를 사용하여 정밀도와 리콜 값 가져 오기

일부 컨텍스트를 넣기 위해 Denny Britz 코드를 사용하여 Tensorflow를 사용하여 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") 

난에 대한 리콜 및 정밀 값을 얻을 비슷한 일을 할 수있는 방법에 대한 아이디어 differents 카테고리?

어쩌면 내 질문에 바보가 들리 겠지만 솔직히 말해서 조금 잃어 버렸습니다. 도와 주셔서 감사합니다.

+0

다중 클래스 분류기에는 정밀도와 회수율이 정의되어 있지 않으며, 이진수에 대해서만 정밀도와 회수율이 정의되어 있지 않습니다. –

+0

정밀도는 알고리즘이 "i"를 선언 한 모든 인스턴스 중에서 클래스 "i"로 올바르게 선언 된 요소의 일부이므로 동의 할 수 없습니다. 역으로, 리콜은 우리가 세계의 진실이 "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() missing 1 필수 위치 인수 : 'self'어떻게 DNNClassifier를 초기화합니까? – AndyM

+0

다음 예를 따르십시오. https://www.tensorflow.org/api_docs/python/tf/contrib/learn/DNNClassifier – jpdoiron