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 不同

Keras:model.evaluate vs model.predict 多类 NLP 任务中的准确率差异

Keras model.evaluate_generator结果几乎是真实准确度的两倍?