tensorflow 评估和预测的不同结果(F1-Score)

Posted

技术标签:

【中文标题】tensorflow 评估和预测的不同结果(F1-Score)【英文标题】:Different results for tensorflow evaluate and predict (F1-Score) 【发布时间】:2021-09-11 09:39:55 【问题描述】:

我正在使用 tf 2.5 来评估多类分类问题。我正在使用 F1 分数,因为我的数据集高度不平衡。我使用的 F1 指标来自 tensorflow-addons 包。 当我将它与二元模型一起使用时,一切正常,但当我使用多类模型时,结果和训练变得很奇怪。

在多类问题的训练和评估过程中,F1 分数远高于应有的水平。为了检查分数是否正确,我使用了 scikit-learns F1 分数指标,它给出了更合理的结果。有趣的是,当使用 update_states() 手动评估 tfa F1 指标的预测时,分数与 scikit-learns 相同。我不确定其原因。可能是因为 evaluate() 和 fit() 使用批处理?但是我怎么能克服这个问题呢?对于评估,这不是什么大问题,因为我可以使用预测。但是如何才能显示有效的 F1 训练分数。

示例 我的 7 类问题的 F1 分数定义

tfa.metrics.F1Score(num_classes=7, average='macro', threshold=0.5)

培训

model.fit(ds.train_ds,validation_data=ds.val_ds,epochs=EPOCHS)
F1: 0.4163

评估结果

model.evaluate(ds.test_ds)
F1: 0.44059306383132935

预测

pred = model.predict(ds.test_ds)
metric = tfa.metrics.F1Score(num_classes=7, average='macro', threshold=0.5)
metric.update_state(y_true, y_pred)
result = metric.result()
result.numpy()
F1: 0.1444352

Scikit 评估

from sklearn.metrics import f1_score
print(f1_score(y_true, y_pred, average='macro'))
F1: 0.1444351874222774

【问题讨论】:

【参考方案1】:

问题在于,测试数据集在每次完整迭代后都会打乱。禁用它会导致所有评估方法之间的分数保持一致

我只是为我的数据集调整功能添加了一个附加参数:

def __configureperformance__(self,ds,shuffle=True):
    ds = ds.cache()
    if shuffle:
        ds = ds.shuffle(buffer_size=1000)
    ds = ds.batch(self.batch_size)
    ds = ds.prefetch(buffer_size=self.AUTOTUNE)
    return ds

【讨论】:

以上是关于tensorflow 评估和预测的不同结果(F1-Score)的主要内容,如果未能解决你的问题,请参考以下文章

分类模型的评估和模型选择与调优

tensorflow 使用混淆矩阵进行评估

Tensorflow - 断言失败:[预测必须在 [0, 1]]

Tensorflow r.1.1 中的 TrainingHelper 和 GreedyEmbeddingHelper 有啥区别(预测结果不同)?

TensorFlow MNIST 评估预测

使用 Tensorflow 识别错误分类的图像