我是 ML 领域的新手。我认为我在测试/验证阶段正确理解了信息泄漏问题,但我很难理解我现在将报告的一些 François Chollet 陈述。出于实际原因,此讨论将基于 Keras。
- 首先:Keras 最初支持现在删除的各种指标,例如精度、召回率、f1、fbeta。如此处所述,仅出于明确的原因将它们删除:它们被计算为本地指标,因此它们(几乎)毫无意义。
- 这些指标清楚地使用了要计算的标签/类别。然而在那篇文章中没有人抱怨这个问题
- 现在是困难的部分:Keras 允许在训练期间指定类权重和样本权重(使用
class_weight
和sample_weight
参数)。这些都会影响训练损失和中列出的指标weighted_metrics
。 - 但是,
class_weight
不会影响weighted_metrics
验证期间列出的指标,也不能在evaluate
方法中使用,其中只能指定sample_weight
参数,但不能指定参数class_weight
。
François Chollet 清楚地解释了这种设计选择(引用):
您会注意到 evaluate 有一个 sample_weight 参数,但没有 class_weight 参数。拟合中的验证评估遵循相同的模式。原因是类权重是为了帮助训练(通过调节不同类的贡献),而不是影响评估。评估,因为它反映了生产限制,意味着在进行预测时标签不可用,因此不能用于调整评估指标。 (关联)
此外,我注意到在使用 validation_split 的情况下,class_weight 应用于验证数据,这不是预期的行为(当然,对于验证数据来说,类是未知的)。我也在解决这个问题。 (关联)
我的意思是在测试设置中按类加权是标签信息泄漏的一种形式,因为它无法在真实的测试情况下重现(当您没有标签时,例如使用 model.predict() 时)。根据定义,它在训练期间是可以接受的,但不应在测试时进行。 (关联)
我无法理解为什么在验证阶段会出现这种情况:
- 像这样的类泄漏并不是一个严重的问题:在验证阶段没有反向传播,因此潜在的泄漏非常有限。另外我认为这并不比标准泄漏更严重,因为在同一验证集上进行了连续的模型调整
- 如果不使用类,在验证期间我们无法计算出有趣的量,例如精度、召回率、混淆矩阵等。在训练集上计算它们会产生有偏差的估计。
- 因此,使用类信息对于获得良好的估计非常有用。
- 此外,如前所述,这些指标是可用的,没有人抱怨它们。
我知道我们可以通过玩这个sample_weight
论点来获得类似的效果,但我对理解这个问题更感兴趣。我知道在测试阶段(理论上)这些类将不可用,但我认为在开发和调整期间,这些信息和统计数据可以帮助更好地理解模型造成的错误。