使用 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()
和 0
或 1
的解决方案输出,以确定我应该添加到混淆矩阵的内容。
如果我能够从 model.predict()
输出 0
或 1
,我想我必须创建类似的东西
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()
注意:您正在对训练示例进行预测,从计算的角度来看这是有意义的(这些是合法的输入,因此可以正确计算预测),但是,您可能想预测新数据,因此在测试集上。
我有一个模型已经在工作,并且有一个训练循环。你可以在这里看到循环:
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()
和 0
或 1
的解决方案输出,以确定我应该添加到混淆矩阵的内容。
如果我能够从 model.predict()
0
或 1
,我想我必须创建类似的东西
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()
注意:您正在对训练示例进行预测,从计算的角度来看这是有意义的(这些是合法的输入,因此可以正确计算预测),但是,您可能想预测新数据,因此在测试集上。