model.evaluate() 和 model.predict() 的 F1 不同
Posted
技术标签:
【中文标题】model.evaluate() 和 model.predict() 的 F1 不同【英文标题】:F1 different for model.evaluate() and model.predict() 【发布时间】:2021-08-20 09:39:03 【问题描述】:比较model.evaluate()
和model.predict()
结果时,我得到了一个非常奇怪的行为。正如您在屏幕截图中看到的那样,我得到 ~0.926
f1 的精度和从 model.evaluate()
返回的召回率,但对于 model.predict()
所做的预测,f1 要低得多。有什么想法会发生这种情况吗?
这只发生在评估样本外数据集时。对于训练期间用作验证数据的测试数据,model.evaluate()
和 model.predict()
给出相同的 f1。
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy', tf.keras.metrics.Precision(), tf.keras.metrics.Recall()])
【问题讨论】:
评估与预测?比较它们不是一回事,eval 给出损失值,predict 给出前馈的输出 这可能会有所帮助:***.com/q/44476706/11220884 @datdinhquoc 对不起,我的意思是基于预测结果的 sklearn f1 计算 @Tinu 我不明白在这种情况下如何涉及“批处理”。这是否意味着给出的召回率和准确率是评估的 14879 个数据点的平均值,而不是真正的准确率和召回率。这是否意味着我应该完全忽略 model.evaluate( ) 的结果,只根据 model.predict( ) 手动计算? 【参考方案1】:tf.keras.metrics.Precision()
& tf.keras.metrics.Recall()
:默认情况下,它们具有“微”平均值。
from sklearn.metrics import f1_score
: 这个默认是“宏观”平均值。
如果你有一个不平衡的分类问题,你需要'macro'。
您可以在model.compile
中直接将宏 F1 分数作为度量:
tfa.metrics.FBetaScore(num_classes= 2, average="macro",threshold=0.9, name='f1_score', dtype= None)
例如:
model.compile(loss=tf.keras.losses.BinaryCrossentropy(),
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
metrics=[tf.keras.metrics.Recall(name='Recall'),
tf.keras.metrics.Precision(name='Precision'),
tfa.metrics.FBetaScore(num_classes= 2, average="macro",threshold=0.9, name='f1_score', dtype= None),
keras.metrics.AUC(name='prc', curve='PR'), # precision-recall curve
【讨论】:
以上是关于model.evaluate() 和 model.predict() 的 F1 不同的主要内容,如果未能解决你的问题,请参考以下文章
tensorflow model.evaluate 和 model.predict 非常不同的结果
Keras 中的 model.evaluate() 返回啥值?
tensorflow CNN 模型的 model.evaluate 和 model.predict 之间的准确性差异巨大
Keras:训练和验证集上的 model.evaluate() 与上次训练时期后的 acc 和 val_acc 不同