【问题标题】:F1 different for model.evaluate() and model.predict()model.evaluate() 和 model.predict() 的 F1 不同
【发布时间】: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 给出前馈的输出
  • 这可能会有所帮助:stackoverflow.com/q/44476706/11220884
  • @datdinhquoc 对不起,我的意思是基于预测结果的 sklearn f1 计算
  • @Tinu 我不明白在这种情况下如何涉及“批处理”。这是否意味着给出的召回率和准确率是评估的 14879 个数据点的平均值,而不是真正的准确率和召回率。这是否意味着我应该完全忽略 model.evaluate( ) 的结果,只根据 model.predict( ) 手动计算?

标签: keras deep-learning time-series classification


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-09-06
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2020-09-19
    • 2020-08-07
    • 2020-10-14
    • 2020-05-04
    • 2021-05-21
    相关资源
    最近更新 更多