大量的 Sigmoid 输出是 1 和 0

数据挖掘 深度学习 分类 喀拉斯
2022-02-23 16:26:05

我有用于二进制分类的 Keras 神经网络,最后一层有一个带有 Sigmoid 激活的输出。我注意到大量输出数字严格来说是一或零(而不是预期的介于 0 和 1 之间)。这可能是什么原因?

起初我以为网络可能 100% 确定这些数字的准确性,但注意到其中一些预测实际上是不正确的。

编辑:

模型:

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Dense(32, activation = tf.nn.relu, input_shape=(X_train.shape[1],)))

model.add(tf.keras.layers.Dense(64, activation = tf.nn.relu))

model.add(tf.keras.layers.Dense(32, activation = tf.nn.relu))

model.add(tf.keras.layers.Dense(1, activation = tf.nn.sigmoid))

model.compile(optimizer = tf.keras.optimizers.Adam(), loss = 'binary_crossentropy', metrics = ['accuracy', roc_auc])

model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))

y_pred = model.predict(X_test)

yhat = []

for pred in y_pred:
    if pred >= 0.7:
        yhat.append(1)
    else:
        yhat.append(0)

数据由 8 列(特征)和 270 000 行(第 9 列是“y”列)组成。在这 270,000 行中,只有 9% 包含类别 1 的标签(其余为 0),所以我对数据进行了下采样(只是删除了带有标签 0 的一堆数据),训练了模型,然后对完整数据进行了预测。我修改了 Sigmoid 确定 1 和 0 的方式,我将阈值从 0.5 更改为 0.7(这是我在下采样数据上获得的 ROC 分数)

1个回答

显然问题是我忘了规范化数据。正如我发现的那样,sigmoid 将任何大于 10 的输入变为 1,将小于 -10 的输入变为 0。归一化解决了这个问题(因为归一化值介于 0 和 1 之间)