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 自定义层(推理错误)
Keras:model.evaluate vs model.predict 多类 NLP 任务中的准确率差异