3

저는 Keras를 사용하여 여러 클래스 분류 문제를 해결하기 위해 이진 정확도와 범주 적 정확도를 메트릭으로 사용하고 있습니다. 모델을 평가할 때 바이너리 정확도는 매우 높고 범주 정확도는 상당히 낮습니다. 나 자신의 코드에서 이진 정확도 메트릭을 다시 만들려고했지만 많은 행운이 없다. 여기Keras 이진 정확도 메트릭이 너무 높은 정확도를 제공합니다.

def binary_accuracy(y_true, y_pred): 
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1) 

내 코드입니다 :

from keras import backend as K 
preds = model.predict(X_test, batch_size = 128) 

print preds 
pos = 0.00 
neg = 0.00 

for i, val in enumerate(roundpreds): 

    if val.tolist() == y_test[i]: 
     pos += 1.0 

    else: 
     neg += 1.0 

print pos/(pos + neg) 

는하지만 이진 정밀도에 의해 주어진 것보다 훨씬 낮은 값을 제공 나의 이해는 이것이 내가 다시 작성해야하는 과정 인 것입니다. 바이너리 정확도가 멀티 클래스 문제에서 사용하기에 적합한 메트릭인가? 그렇다면 누군가 내가 잘못 가고있는 것을 알고 있습니까?

+3

다중 음영 문제에는 이진 정확도를 사용하지 않아야합니다. 결과는 이해가되지 않습니다. –

답변

2

따라서 다중 사례 예측에 binary_crossentropy을 적용 할 때 어떤 일이 발생하는지 이해해야합니다.

  1. 은의이 softmax로부터 출력 (0.1, 0.2, 0.3, 0.4) 하나의 뜨거운 인코딩 된 지상 진실 (1, 0, 0, 0)입니다 있다고 가정하자.
  2. binary_crossentropy0.5보다 높은 모든 출력을 마스크하므로 네트워크에서 (0, 0, 0, 0) 벡터로 바뀝니다.
  3. (0, 0, 0, 0) 경기는 4 개 인덱스 만점에 3 개에 진실 (1, 0, 0, 0) 접지 -이 완전히 잘못 대답에 대한 75 %의 수준에있을 정확성을 결과하게!

해결하려면 단일 클래스 정확도를 사용할 수 있습니다.

def single_class_accuracy(interesting_class_id): 
    def fn(y_true, y_pred): 
     class_id_preds = K.argmax(y_pred, axis=-1) 
     # Replace class_id_preds with class_id_true for recall here 
     positive_mask = K.cast(K.equal(class_id_preds, interesting_class_id), 'int32') 
     true_mask = K.cast(K.equal(y_true, interesting_class_id), 'int32') 
     acc_mask = K.cast(K.equal(positive_mask, true_mask), 'float32') 
     class_acc = K.mean(acc_mask) 
     return class_acc 

    return fn 
+0

내 대답이 도움이 되었습니까? 예 - 동의하고 upvote :) –