【问题标题】:Why does binary accuracy give high accuracy while categorical accuracy give low accuracy, in a multi-class classification problem?在多类分类问题中,为什么二进制精度会给出高准确率,而分类精度会给出低准确率?
【发布时间】:2018-03-03 09:52:16
【问题描述】:

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

但这给出的值比二进制精度给出的值低得多。二进制精度甚至是用于多类问题的适当指标吗?如果是这样,有人知道我哪里出错了吗?

【问题讨论】:

  • 你不应该对多类问题使用二进制精度,结果没有意义。

标签: machine-learning tensorflow keras classification multiclass-classification


【解决方案1】:

因此,您需要了解将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) 在 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

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 2020-05-13
    • 2016-01-09
    • 1970-01-01
    • 2019-09-06
    • 2014-12-05
    • 2019-02-14
    • 2020-06-29
    • 2014-02-28
    相关资源
    最近更新 更多