召回率和精度无法正常工作(keras)

Recall and precision not working correctly(keras)

我必须在 keras 中构建模型。我真的很难处理我的实际数据集,因此我只是想找出一个更简单的数据集的基础知识。

model = Sequential([
    Dense(32, input_dim=X_train.shape[1], activation="sigmoid"),
    Dense(2, activation="softmax"),
])
metrics=[ 
    tf.keras.metrics.TruePositives(name="tp"),
    tf.keras.metrics.TrueNegatives(name="tn"),
    tf.keras.metrics.FalseNegatives(name="fn"),
    tf.keras.metrics.FalsePositives(name="fp"),
    tf.keras.metrics.Recall(name="recall"),
    tf.keras.metrics.Precision(name="precision")
]

model.compile(loss="categorical_crossentropy", metrics=metrics, optimizer="sgd")
model.evaluate(X_test, y_test)
evaluation = model.evaluate(X_test, y_test)
for i, m in model.metrics_names:
    print(m, evaluation[i])

打印出来:

loss 0.4604386021425058
tp 2965.5
tn 2965.5
fn 531.25
fp 531.25
recall 0.8480753898620605
precision 0.8480753898620605

这个结果有些奇怪。我相信这是由于使用了带有两个节点的 softmax。

y_train 看起来像这样:

array([[1., 0.],
       [1., 0.],
       [1., 0.],

       [1., 0.]], dtype=float32)

我尝试了一个 sigmoid,但是整个模型都崩溃了,至少这里的拟合是有效的。

有没有一种方法可以配置召回率和准确率,以便他们将一个输出音符视为正数?

你的情况唯一的解决办法是将问题转化为一维问题,即

  • 使用Dense(1,activation='sigmoid')代替Dense(2,activation='softmax');例如,将 [0,1] 更改为 0,将 [1,0] 更改为 1
  • 使用 binary_crossentropy 代替 categorical_crossentropy

否则,您可以实施特殊回调来检索这些指标(使用 scikit-learn,如下例所示):