使用 Keras 和后端 Tensorflow 和二进制输出的二进制分类器

数据挖掘 机器学习 分类 喀拉斯 张量流 激活函数
2022-03-14 07:18:48

我正在尝试使用 tensorflow.keras 构建二进制分类器,目前无法确定让模型仅生成 0 和 1 的解决方案。

用于编译我的 tensorflow 模型的代码。

from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

def build_model(train_dataset):
  model = keras.Sequential([
    layers.Dense(10, activation='relu', input_shape=[len(train_dataset.keys())]),
    layers.Dense(1, activation='sigmoid')
  ])
  optimizer = 'adam'

  model.compile(loss='binary_crossentropy',
                optimizer=optimizer,
                metrics=[tf.keras.metrics.Precision(), tf.keras.metrics.Recall(), tf.keras.metrics.Accuracy()])
  return model

model = build_model(X)

调用后model.fit(X,y)model.predict(X_test)将生成一个数字数组作为预测值:

array([[8.3726919e-01],
       [9.1233850e-04],
       [8.3726919e-01],
       ...,
       [4.6819448e-05],
       [1.5565268e-08],
       [0.0000000e+00]], dtype=float32)

我目前对该问题的解决方案是从 sigmoid 激活函数中获取输出为 (0,1) 范围内的数字;然后将值转换为 0 或 1

reset_predictions = []
for p in predictions:
    if p >= 0.5:
        reset_predictions.append(1)
    else:
        reset_predictions.append(0)

然而,这并不理想;我希望实现的是模型在没有外部功能的情况下为我分类 0 或 1。

1个回答

我不相信这是可能的,为了让模型返回 0 或 1,你在输出层上的激活函数必须返回 0 或 1,这意味着激活函数是不可微的,你不能这样做那。

您还可以将转换器功能简化为:

In [20]: predictions = np.array([[0.1], [0.9], [0.3], [0.6]])                              

In [21]: (predictions[:, 0] > 0.5).astype(np.int8)                                         
Out[21]: array([0, 1, 0, 1], dtype=int8)

因此,这只是很少的额外工作,如果您想查看模型对预测的信心程度,它会为您提供更大的灵活性,并且您可以根据需要更改阈值。