【问题标题】:TensorFlow multi-label accuracy metricsTensorFlow 多标签准确度指标
【发布时间】:2021-12-19 12:07:06
【问题描述】:

我目前正在使用 TensorFlow 解决多标签分类问题(总共 9 个标签),这是模型编译行:

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

y_true 我的模型的标签由 2 个 1 和 7 个 0 组成(例如,[0,1,0,0,0,1,0,0 ,0])。

我用TensorFlow尝试了几个模型,但无论模型多么复杂,准确率一直很差,准确率在0.3左右。

我想知道 Keras 准确度指标是否也适用于多标签分类。例如,如果 y_pred 的概率值为 [0.1, 0.9, 0.3, 0.4, 0.5, 0.4, 0.3, 0.2, 0.1],Keras 是否会选择顶部y_pred中的2个概率,将它们转换为[0, 1, 0, 0, 1, 0, 0, 0, 0]的二进制标签,然后将准确率与y_true 标签的那些?

如果没有,我是否必须实现自己的指标功能?

提前致谢!

【问题讨论】:

  • 不要使用 Keras,但我认为预测的编码是这样的,如果单个标签概率超过 0.5,那么它被编码为 1,否则为零。例如,如果使用多元线性回归,您可以将代码欺骗为 y=(-1,1,-1,-1,-1,1,-1,-1,-1) 的真值标签,然后任何正预测被编码为 1,负预测被编码为零,例如 y=(-0.3,0.6,-0.4,-0.2,-0.3,0.4,-0.2,-0.5,-0.4)。点是,零是阈值。在您的情况下,0.5 可能是阈值。
  • 另一点是对于长度为 9 的二进制字符串,有 2^9=512 个可能的 1 和 0 组合。因此,您需要确保广泛覆盖结果空间(类标签)来训练您的模型。性能不佳可能是由于数据和所选模型造成的。也许尝试使用 MSE 来解决错误而不是交叉熵。 MSE 将等于 0.5 * [(0-0.1)^2 + (1-0.9)^2 + ... + (0-0.1)^2]。我很少将交叉熵用于 ANN,而是经常使用 MSE 进行分类和函数逼近。
  • 也许您应该尝试将损失函数更改为“categorical_crossentropy”,因为您有一个多类问题。

标签: tensorflow keras


【解决方案1】:

一般来说,准确率显示预测标签的哪一部分与原始标签匹配。

official documentation中所述:

该指标创建两个局部变量,total 和 count,用于计算 y_pred 匹配 y_true 的频率。这个频率最终以二进制精度返回:一个幂等运算,只需将总数除以计数。

此指标显示概率预测等于与真实标签的部分。

tf.keras.metrics.BinaryAccuracy 按给定阈值(默认为 0.5)对预测概率进行四舍五入。因此,如果模型输出为 [0.9, 0.3, 0.6],则在与真实标签进行比较之前,将四舍五入为 [1, 0, 1]。

但是,准确度指标不仅会显示预测的 1 与真实标签的匹配位置,还会显示 0 与 0 的匹配位置。在大多数情况下,它对多标签问题不利,因为数据中 1 和 0 之间存在不平衡。在您的情况下,您的 0 比 1 多 3.5 倍。如果你的模型只输出零,那它确实是一个糟糕的模型,但由于 7/9 的原始标签也是零,它马上就会有 7/9 或几乎 78% 的准确度。

我建议使用其他指标进行多标签分类:

  1. Precision,显示预测的 1 中有多少部分实际上是 1
  2. Recall,显示实际 1 的哪一部分被“找到”并预测为 1
  3. F1 和 F-beta,总结了准确率和召回率

单独而言,这些指标不会为您提供有关模型性能的太多信息,因此最好将它们结合使用。您可以在sklearn documentationin this article 中阅读有关它们的更多信息。

在实现方面,Tensorflow 中有PrecisionRecall 的官方实现,Tensorflow Addons 有F1ScoreFBetaScore

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多