你所拥有的是预测的类概率。由于您正在进行二进制分类,因此每个输出都是该测试示例的第一类的概率。
要将这些转换为类标签,您可以设置一个阈值:
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] 之类的合适范围。