如何在卷积神经网络中获得预测的类标签?

数据挖掘 机器学习 深度学习 神经网络 美国有线电视新闻网 卷积神经网络
2021-09-26 08:13:03

我已经构建了一个卷积神经网络,需要将测试数据分类为 0 或 1。我正在使用标签 0 或 1 训练 CNN,但在运行以下代码时,我得到以下结果。

predictions = classifier.predict(x_test)

print(predictions)

[0.0128037 ]
 [0.01182843]
 [0.01042355]
 [0.00906552]
 [0.00820154]
 [0.00726516]......

logloss_score = log_loss(y_test, predictions)
print(logloss_score)
0.047878393431377855

如何获得 0 和 1 之间的结果?我需要在上面的代码中修改什么?

4个回答

你所拥有的是预测的类概率。由于您正在进行二进制分类,因此每个输出都是该测试示例的第一类的概率。

要将这些转换为类标签,您可以设置一个阈值:

import numpy as np

probas = np.array([[0.4],[0.7],[0.2]])
labels = (probas < 0.5).astype(np.int)
print(labels)
[[1]
 [0]
 [1]]

对于要从​​多种可能性中分配一个类的多类分类,您可以使用argmax

probas = np.array([[0.4, 0.1, 0.5],[0.7, 0.2, 0.1],[0.3, 0.4, 0.3]])
labels = np.argmax(probas, axis=-1)    
print(labels)
[2 0 1]

要将这些作为一次性编码数组,您可以使用LabelBinarizer

from sklearn import preprocessing

lb = preprocessing.LabelBinarizer()
lb.fit_transform(labels)
array([[0, 0, 1],
       [1, 0, 0],
       [0, 1, 0]])

对于每个示例可以有多个输出类的多标签分类,您可以再次使用阈值:

probas = np.array([[0.6, 0.1, 0.7],[0.7, 0.2, 0.1],[0.8, 0.9, 0.6]])
labels = (probas > 0.5).astype(np.int)
print(labels)
[[1 0 1]
 [1 0 0]
 [1 1 1]]

一些包提供了单独的方法来获取概率和标签,因此不需要手动执行此操作,但看起来您使用的是仅提供概率的 Keras。

作为旁注,这不称为神经网络的“标准化”。规范化通常描述缩放输入数据以适合 [-1,1] 之类的合适范围。

预测 = 分类器.预测(x_test)

您尚未提供 x_test 的形状,但根据您应该提供类似数组的项目的预测函数的文档,您正在输入类似数组的输入。每个输出已经显示了每个相应输入的概率。似乎由于预测值较低,它们小于0.5,因此您的测试数据的预测标签全部为零。

你得到的预测是 logits,这意味着所有类别的总和是 1。所以最大的数字应该是你正在寻找的类别。要获取类别,可以使用 argmax 查找最大数量的索引。交叉熵损失是预测值和标签之间差异的度量。在这种情况下,您的准确率为 95%。

要将您的类概率转换为类标签,只需让它通过 argmax,它将最高概率编码为 1

prob_ = np.array([[0.12, 0.18, 0.2, 0.6],[0.7, 0.08,0.12, 0.1],[0.15, 0.4, 
0.3, 0.15]])
labels = np.argmax(prob_, axis=-1)    
print(labels)
[3 0 1]