【问题标题】:What is the expected result of top_k_categorical_accuracy in multi-label classification?top_k_categorical_accuracy 在多标签分类中的预期结果是什么?
【发布时间】:2021-05-02 23:30:39
【问题描述】:

我有一个多标签分类问题,其中每个数据点恰好有 3 个标签(在许多标签中,比如 1000 个)。在我的模型中,我选择了前 5 个预测标签。

这是一个模型代码的sn-p:

def top_labels(true_label, pred_label):
    return tf.keras.metrics.top_k_categorical_accuracy(true_label, pred_label, k=5))

model = Sequential()
model.add(Embedding(10000, 128, input_length=250))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(len(classes), activation='sigmoid'))    
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy', top_labels])

我的问题是:预期的 top_k_categorical_accuracy 结果是什么?

如果我的训练数据如下:

data_idx   features      true_labels 
1           blabla          2,3,4      
2           blabla          1,2,3    

而预测结果是

data_idx   top_5 predicted_labels
1           1,4,5,8,9
2           4,5,6,7,8

我有两个猜测:

  1. 0.5:因为对于第一个数据点,有一个标签匹配(标签4),对于第二个数据点,没有标签匹配。

  2. 1/6:因为对于第一个数据点,3个真实标签中只有一个标签匹配,而对于第二个数据点,3个标签中没有一个标签匹配。

我觉得答案是 1),但是在测试了以下代码后我很困惑:

y_true = [[1, 1, 0, 0]] # assume 2 labels for a data point

y_pred = [[0, 0.9, 0.05, 0.95]]

m = tf.keras.metrics.top_k_categorical_accuracy(y_true, y_pred, k=3)

m.numpy() # result: array([0.], dtype=float32)

所以看起来 top_k_categorical_accuracy 只能处理 一个 真正的标签而不是多个真正的标签(它只接受第一个真正的标签而忽略其余的标签)。

但是,我不确定将最后一层的激活设置为sigmoid 是否会改变评估行为。

有人可以澄清一下吗?谢谢。

【问题讨论】:

    标签: tensorflow machine-learning keras multilabel-classification


    【解决方案1】:

    据我所知,多标签分类没有正式的top_k_categorical_accuracy 定义。您对度量丢弃 y_true 的所有值的观察结果表明,将其用于多标签分类可能会导致未定义的行为。

    多标签的“准确度”通常被解释为每个单独标签的二进制准确度。由于标签输出通常是稀疏的,由于真阴性的普遍存在,仅准确率就会返回很高的值。

    多标签的典型指标是用于不平衡二元预测的指标(例如micro/macro F1 score)和Hamming distance

    【讨论】:

    • 嗯,我不确定您对top_k_categorical_accuracy 的解释是否正确。这是一个反例:y_true = [[1, 0, 0, 1]]y_pred=[[0.95, 0.9, 0.05, 0]]k=3。根据您的定义,结果应该是错误的,因为它在y_true 的第三个位置是 1,而不是在y_pred 中的 1。但是结果是 1。我也相信 top_k_categorical_accuracy 是合理的,正如 theailearner.com/2019/07/15/multi-label-classification 等一些帖子所建议的那样?
    • 你是对的,你对只取第一个真实标签的解释是正确的。我会修改答案。关于您的博客文章,我想您应该检查有关使用 top_k 进行多标签的额外参考。这只是一个例子(不是“几个”),也是我见过的第一个。考虑到函数的行为,它很可能是错误的。
    • 感谢您的更新。这是 top_k_category 指标的另一篇文章:stackoverflow.com/questions/50686217/…(第二个答案,想将其包含在上面,但受评论长度限制:))
    • 是的,答案中的第二条评论似乎触及了您面临的相同问题。我在 TF github 问题中发现了一个有趣的线程,如果您想深入兔子洞,请检查所有链接:github.com/tensorflow/tensorflow/issues/28074
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2019-05-20
    • 2019-09-09
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多