我正在使用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)
但这比二进制精度给出的值低得多。二进制精度甚至是在多类问题中使用的适当度量吗?若有,那么有谁知道我哪里出错了?
答案 0 :(得分:11)
因此,您需要了解将binary_crossentropy
应用于多类预测时会发生什么。
softmax
的输出为(0.1, 0.2, 0.3, 0.4)
,而单一编码的基础事实为(1, 0, 0, 0)
。binary_crossentropy
会屏蔽高于0.5
的所有输出,因此您的网络会转向(0, 0, 0, 0)
向量。 (0, 0, 0, 0)
在4个索引中的3个匹配基础事实(1, 0, 0, 0)
- 这使得完全错误的答案的结果准确度达到 75%的水平强> <!/ LI>
醇>
要解决此问题,您可以使用单一类别的准确度,例如:喜欢这个:
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