model.predict() 没有产生预期的标签?

Posted

技术标签:

【中文标题】model.predict() 没有产生预期的标签?【英文标题】:model.predict() is not producing the expected labels? 【发布时间】:2021-01-16 11:16:24 【问题描述】:

我正在做一个简单的二进制文本分类。 步骤大致如下:

    使用 CountVectorizer() 预处理训练数据 构建一个 keras Sequential() 模型 model.fit(x_train, y_train) model.evaluate(x_val, y_val) model.predict(x_test)

我被困在第 5 步 - 当我打印预测值时,我得到一个 numpy 数组:

 [0.9434484 ]
 [0.3787447 ]
 ...
 [0.87870705]
 [0.7575223 ]
 [0.39714795]]

由于我正在进行二进制分类,并且我的标签是 0 和 1,我希望预测输出是相同的吗?现在它似乎预测了标签 0 和 1 之间的概率,这不是我想要的。我是否需要以某种方式对预测输出进行编码以便它返回正确的标签,还是我在之前的步骤中做错了什么??

【问题讨论】:

你用的是什么损失函数?这会有所作为。理想情况下,二分类应该是binary_crossentropy @AkankshaAtrey 我确实已经在使用 binary_crossentropy 返回值的范围为 0-1,表示 1 为标签的概率 @Ruli 我明白这一点。我的问题是,模型有什么方法可以直接预测标签?还是我必须按照其他用户使用 round() 的建议处理它们? @kluster 我已经提供了这样的答案 【参考方案1】:

一种解决方案是使用简单的统计解释,我们将使用 0.5 截止值。因此,高于 0.5 的所有值都将被视为 1,低于 0 的值将被视为 0。

import numpy as np

pred =  np.array([[0.9434484 ]
 ,[0.3787447 ]
 ,[0.87870705]
 ,[0.7575223 ]
 ,[0.39714795]])

np.round(pred)
Out[37]: 
array([[1.],
       [0.],
       [1.],
       [1.],
       [0.]])

如果结果不是概率,那么就像:

def sigmoid(x):
  return 1 / (1 + math.exp(-x))

必须用于将其缩放到 0-1 比例。

【讨论】:

【参考方案2】:

第5步model.predict(x_test)可以替换为:

model.predict_classes(x_test)

在顺序模型中预测类别。如果您将来在功能模型中需要它,这就是解决方案:

y_prob = model.predict(x_test) 
y_classes = y_prob.argmax(axis=-1)

【讨论】:

以上是关于model.predict() 没有产生预期的标签?的主要内容,如果未能解决你的问题,请参考以下文章

tf.model.predict() 在预测具有相同维度的数据时会产生值错误

model.predict 不适用于 Keras 自定义层(推理错误)

logits 和标签大小的问题。张量流

Keras:model.evaluate vs model.predict 多类 NLP 任务中的准确率差异

尝试使用 model.predict() 预测值导致的线性回归错误 [重复]

keras 中 model.predict() 和 model.predict_generator() 之间的预测差异