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 - 断言失败:[预测必须在 [0, 1]]
Tensorflow r.1.1 中的 TrainingHelper 和 GreedyEmbeddingHelper 有啥区别(预测结果不同)?