keras 如何计算多标签分类的准确率?

数据挖掘 神经网络 文本挖掘 喀拉斯 lstm
2022-02-15 06:53:06

我将此代码用于多标签问题分类。

from __future__ import print_function

from keras.preprocessing import sequence
from keras.models import Sequential
from keras.layers import Dense, Embedding
from keras.layers import LSTM
from keras.models import Model
from keras.datasets import imdb

max_features = len(vocabDic)
maxlen = 500  # cut texts after this number of words (among top max_features most common words)
batch_size = 32

train_set = sequence.pad_sequences(train_set, maxlen=maxlen)
test_set = sequence.pad_sequences(test_set, maxlen=maxlen)

print('train_set shape:', train_set.shape)
print('test_set shape:', test_set.shape)

print('Build model...')
model = Sequential()
model.add(Embedding(max_features, 128))
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(90, activation='sigmoid'))

# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

print('Train...')
model.fit(train_set, train_labels,
          batch_size=batch_size,
          epochs=15,
          validation_data=(test_set, test_labels))
score, acc = model.evaluate(test_set, test_labels,
                            batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)

我的问题是有 90 个类,并且从第二个 epoch 开始精度太高。我怀疑 keras 计算错误。有什么线索吗?

编辑:我计算了模型的总召回率。它只有 5%(比随机的好 5 倍)。对于此类问题,这是正常行为吗?

2个回答

为什么要使用 binary_crossentropy?您应该使用 categorical_crossentropy。但是,如果您坚持使用 binary_crossentropy,请将您的指标更改为 metrics=['binary_accuracy', 'categorical_accuracy'] (这将显示两个准确度)。

我在这里回答了一个类似的问题。

您的问题是准确性不是多标签任务的正确指标。尝试不同的方法,例如 AUC、precision、recall、accuracy@k、precision@recall。binary_crossentropy 的选择是正确的,因为您要独立预测每个标签。