【问题标题】:Keras: How is Accuracy Calculated for Multi-Label Classification?Keras:如何计算多标签分类的准确率?
【发布时间】:2018-11-14 02:55:15
【问题描述】:

我正在做有毒评论文本分类 Kaggle 挑战。有 6 个类:['threat', 'severe_toxic', 'obscene', 'insult', 'identity_hate', 'toxic']。一条评论可以是这些类中的多个,因此这是一个多标签分类问题。

我用 Keras 构建了一个基本的神经网络如下:

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'])

我运行这一行:

model.fit(X_train, train_y, validation_split=0.5, epochs=3)

并在 3 个 epoch 后获得 99.11% 的准确率。

但是,99.11% 的准确率比最好的 Kaggle 提交要高一点。这让我觉得我要么(可能两者兼有)a) 过度拟合,要么 b) 滥用 Keras 的准确性。

1) 当我使用 50% 的数据作为验证拆分并且只有 3 个 epoch 时,似乎有点难以过度拟合。

2) 这里的准确率是否只是模型获得每个类别正确的时间百分比?

所以如果我输出[0, 0, 0, 0, 0, 1],而正确的输出是[0, 0, 0, 0, 0, 0],那么我的准确率就是5/6

经过一番思考,我有点认为这里的 accuracy 指标只是查看我的模型以最高置信度预测的类别,并与基本事实进行比较。

因此,如果我的模型输出[0, 0, 0.9, 0, 0, 0],它会将索引 2('obscene')处的类与真实值进行比较。你认为这是正在发生的事情吗?

感谢您提供的任何帮助!

【问题讨论】:

    标签: python machine-learning keras


    【解决方案1】:

    对于多标签分类,我认为使用sigmoid作为激活,binary_crossentropy作为损失是正确的。

    如果输出是稀疏的多标签,这意味着少数正标签和大部分是负标签,Keras accuracy 指标将被正确预测的负标签夸大。如果我没记错的话,Keras 不会选择概率最高的标签。相反,对于二元分类,阈值为 50%。所以预测将是[0, 0, 0, 0, 0, 1]。如果实际标签为[0, 0, 0, 0, 0, 0],则准确度为5/6。您可以通过创建一个始终预测负标签并查看准确性的模型来测试此假设。

    如果确实如此,您可以尝试其他指标,例如 top_k_categorical_accuracy

    我能想到的另一种可能性是您的训练数据。标签 y 是否以某种方式“泄漏”到 x 中?只是一个疯狂的猜测。

    【讨论】:

    • 这里定义了一个weighted_binary_crossentropy 损失函数,用于存在大量负面预测的多标签问题:stats.stackexchange.com/a/313922/198729。不过我也在寻找weighted_binary_accuracy
    • 此外,top_k_categorical_accuracy 在这种情况下似乎不起作用,因为如果真相是多热编码的,那么 top_k 是什么?
    【解决方案2】:

    您可以参考 Keras Metrics documentation 以查看所有可用的指标(例如 binary_accuracy)。您还可以创建自己的自定义指标(并确保它完全符合您的预期)。我想确保neurite 对如何计算准确度是正确的,所以这就是我所做的(注意:activation="sigmoid"):

    from keras.metrics import binary_accuracy
    def custom_acc(y_true, y_pred):
        return binary_accuracy(y_true, y_pred)
    
    # ...
    
    model.compile(loss="binary_crossentropy", optimizer=optimizer, metrics=[
        "accuracy",
        "binary_accuracy",
        "categorical_accuracy",
        "sparse_categorical_accuracy",
        custom_acc
    ])
    

    运行训练,您将看到custom_acc 始终等于binary_accuracy(因此等于custom_acc)。

    现在你可以参考Keras code on Github 看看它是如何计算的:

    K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
    

    这证实了neurite 所说的内容(即,如果预测为[0, 0, 0, 0, 0, 1],实际标签为[0, 0, 0, 0, 0, 0],则准确度为5/6)。

    【讨论】:

    • 我添加了所有潜在指标以确定使用了哪一个并比较了结果。这只是实验性的。
    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 2019-03-23
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2020-06-11
    • 2019-08-06
    • 2020-08-13
    相关资源
    最近更新 更多