召回率和精度无法正常工作(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
,如下例所示):
我必须在 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
,如下例所示):