对于 tensorflow.keras.models.Sequential.predict 中的多类多标签问题,是不是可能只得到 0 和 1?

Posted

技术标签:

【中文标题】对于 tensorflow.keras.models.Sequential.predict 中的多类多标签问题,是不是可能只得到 0 和 1?【英文标题】:Is that possible to get only 0 and 1 For multiclass multilabel problem in tensorflow.keras.models.Sequential.predict?对于 tensorflow.keras.models.Sequential.predict 中的多类多标签问题,是否可能只得到 0 和 1? 【发布时间】:2019-09-03 17:21:25 【问题描述】:

假设我有 3 个类,每个样本都可以属于这些类中的任何一个。标签看起来像这样。

[
    [1 0 0]
    [0 1 0]
    [0 0 1]
    [1 1 0]
    [1 0 1]
    [0 1 1]
    [1 1 1]
]

我将输出设置为 Dense(3, activation="sigmoid"),并使用 optimizer="adam", loss="binary_crossentropy" 进行编译。 根据 Keras 的输出,我猜测损失为 0.05,准确度为 0.98。

我认为如果我使用 sigmoid 和 binary_crossentropy,我只会得到 1 或 0 的预测值。然而,model.predict(training-features) 给了我 1 到 0 之间的值,比如 0.0026。我已经尝试了 categorical_crossentropy 和 binary_crossentropy 与 sigmoid 和 softmax 之间的所有 4 种组合。 Model.predict 总是返回一个介于 0 和 1 之间的值,形状为 n_samples by n_classes。在上面的示例中,它将是 7x3。

然后我将值剪裁为 0.5,如下所示并检查了 accuracy_score(training_labels, preds)。分数下降到 0.1。

preds[preds>=0.5] = 1
preds[preds<0.5] = 0

如果有人能给我一些关于如何解决这个问题的指导,我将不胜感激。

谢谢!

【问题讨论】:

【参考方案1】:

根据您的描述,这是一个多标签分类问题,因此您应该使用sigmoid 作为最后一层的激活函数,使用binary_crossentropy 作为损失函数。那是因为我们认为每个标签的分类独立于所有其他标签。因此,在这种情况下使用softmaxcategorical_crossentropy 是错误的。

Keras 报告的准确度与使用sklearn.metrics.accuracy_score() 函数计算的准确度之间的差异不是由于四舍五入造成的;实际上,Keras 进行了与计算精度相同的舍入(或裁剪)。相反,差异是由于多标签分类模式下的accuracy_score 函数仅在该样本的所有真实标签和预测标签相互匹配时才认为该样本被正确分类。这在documentation中已经明确说明:

在多标签分类中,此函数计算子集准确度:为样本预测的标签集必须完全匹配 y_true 中对应的标签集。

然而,在 Keras 中,binary_accuracy 函数报告正确分类标签的平均分数(即部分匹配是可以接受的)。为了更好地理解这一点,请考虑以下示例:

True labels  | Predictions | Keras binary acc | accuracy_score
-----------------------------------------------------------------
  [1 0 0]    |   [1 0 1]   | 2 correct = 0.66 | not match = 0.00
  [0 1 1]    |   [0 1 1]   | 3 correct = 1.00 | match     = 1.00
  [1 0 1]    |   [0 0 1]   | 2 correct = 0.66 | not match = 0.00
=================================================================
      average reported acc |             0.77 |             0.33

【讨论】:

感谢您的解释。如果我使用 sigmoid 和 binary_crossentropy,我是否仍然需要手动裁剪 (preds>=0.5 = 1, preds @jl303 如果您想将预测结果设为 0 或 1,则必须这样做(即无法在模型中进行舍入)。不过,在获得预测后,一种更简洁的方法是使用 np.around 函数:preds = np.around(preds) 感谢@today!圆形函数绝对更干净!通过挖掘您指出的文档,我发现了 label_ranking_loss 和 label_ranking_average_precision_score,但分数仍然远低于 Keras 的 loss 和 acc。 Keras 的分数让我兴奋了一秒,但 SciKit-learn 的分数让我的模型看起来很糟糕! :( 一般来说,对于多标签多类问题,我应该重点改进哪些指标? @jl303 您可以从 sklearn 文档中的 relevant section 获得一些见解。汉明损失似乎是一个不错的选择。不过,我认为用于多标签分类的指标不如用于多类分类或二元分类的指标建立起来。您必须搜索相关的多标签分类数据集及其相关论文,并查看使用哪些指标来比较不同的方法。

以上是关于对于 tensorflow.keras.models.Sequential.predict 中的多类多标签问题,是不是可能只得到 0 和 1?的主要内容,如果未能解决你的问题,请参考以下文章

对于独立应用程序(对于 Spring JMS),Java main 方法应该是啥?

对于软件工程的期望

为啥会提示“我们计算的请求签名与您提供的签名不匹配”。对于 GET 但不是 PUT 对于 OpenSearch?

对于Passenger,控制台日志(从puts的输出)去哪里......对于Nodejs

对于Oracle analyze table的使用总结 . 对于Oracle analyze table的使用总结 .

对于基于基本数据类型的变量创建的数组