为什么在多类分类问题中,二元准确度高而分类准确度低?

8

我正在使用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)

但是这个值要比二元准确性给出的值低得多。在多类问题中使用二元准确性指标是否合适?如果是,有人知道我错在哪里吗?


4
对于多类问题,不应使用二元准确性,否则结果将没有意义。 - Dr. Snoopy
1个回答

21

因此,您需要了解在将binary_crossentropy应用于多类预测时会发生什么。

  1. 假设您从softmax得到的输出是(0.1, 0.2, 0.3, 0.4),one-hot编码的实际情况是(1, 0, 0, 0)
  2. binary_crossentropy掩盖所有高于0.5的输出,因此您的网络输出向量变为(0, 0, 0, 0)
  3. (0, 0, 0, 0)与实际情况(1, 0, 0, 0)在4个索引中匹配3个-这使得结果准确度达到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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接