使用 model.predict() 输出创建手动混淆矩阵

Creating a manual confusion matrix by using model.predict() output

我有一个模型已经在工作,并且有一个训练循环。你可以在这里看到循环:

for idx, (x, y) in enumerate(train_dataset):
  pred = model.predict_on_batch(x)
  print(model.test_on_batch(x, pred, reset_metrics=False, return_dict=True))
  print(model.train_on_batch(x, y, reset_metrics=False))
  print(f"After {idx} entries")

我想创建一个自定义混淆矩阵,并且也能够从该矩阵计算模型的准确性。当运行这段代码:

for x, y in train_dataset.take(10):
  print(model.predict(x))

我得到这个作为输出:

[[-0.00407019]]
[[-0.01000004]]
[[-0.00080154]]
[[-0.0159038]]
[[-0.00301645]]
[[-0.0147643]]
[[-0.00481013]]
[[-0.00032348]]
[[-0.00791026]]
[[-0.00795541]]

我如何比较 model.predict()01 的解决方案输出,以确定我应该添加到混淆矩阵的内容。

如果我能够从 model.predict()

输出 01,我想我必须创建类似的东西
if model.predict(x) == 0:
    foo()
if model.predict(x) == 1:
    foo1()

You can see the model here:

```python
model = tf.keras.Sequential([
    encoder,
    tf.keras.layers.Embedding(
        input_dim=len(encoder.get_vocabulary()),
        output_dim=64,
        # Use masking to handle the variable sequence lengths
        mask_zero=True),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1)
])

提前致谢!

你模型的(主要)问题是最后一层的激活函数。有none,所以输出是线性传递的

修改最后一层为

tf.keras.layers.Dense(1, activation='sigmoid')

然后

for x, y in train_dataset.take(10):
  print(model.predict(x))

您将得到一个 10 维数组,对应于每个示例是否具有攻击性的概率(始终介于 0 和 1 之间)。

然后为每个示例分配一个“class”C,您设置一个阈值 a,这样如果 model.predict(x) > a => assign x to C.

如果您的门槛是 0.5(通常如此),您可以通过

实现您想要的目标
if round(model.predict(x)) == 0:
    foo()
if round(model.predict(x)) == 1:
    foo1()

注意:您正在对训练示例进行预测,从计算的角度来看这是有意义的(这些是合法的输入,因此可以正确计算预测),但是,您可能想预测新数据,因此在测试集上。