构建模型通常是一个迭代过程,给定数据集:
训练模型
评估模型
改进,直到满意为止
你的改进策略不一定徒劳无功!
如何评估模型是否进步了呢?通常会使用某些性能指标来评估改进策略的有效性。
然而,在多分类问题中,当使用“Accuracy”指标评估改进策略有效性时,通常带有欺骗性。
换句话,某些改进策略其实已经提升模型性能了,但通过“Accuracy”这个指标没有反映出来。
“Accuracy”陷阱
这里的“Accuracy”其实应该是“Top-1 Accuracy”。
在多分类问题中,Accuracy由具有最高概率值的标签决定。
实际的标签虽然可能并不是模型预测概率最高的标签,但它位于模型输出的前“k”个标签之中。
如下面图,实际的标签(类别C)并不是概率最高的标签,但它至少在前2个预测概率最高的标签之中(类别B和类别C):
如果上一个版本中,类别C的输出概率是最低的,就像下面所示:
虽然在这两种情况下,最终的预测结果都是错误的(模型预测标签C不是最高概率)。
但是,在从“版本1”迭代到“版本2”的过程中,通过使用一些模型改进技术,我们确实取得了实质性的进步(从倒数第一上升到第二)。
尽管如此,准确率(Accuracy)完全忽略了这一点,因为它只关注概率最高的标签。
解决办法:top-k Accuracy
在模型迭代过程中,“top-k Accuracy”可能会持续提高,这反映了性能的提升。然而,准确率可能会在一段时间内保持不变,如下所示:
所以,top-k Accuracy常用于评估模型改进策略,模型最终性能仍然要通过top-1 Accuracy评估。
在Scikit-learn中也提供了top-k Accuracy评估指标。
在二分类问题中,因为只有两个类别,模型的输出通常只是一个概率值,用于表示正样本的概率,使用准确率、精确率、召回率就够用了。
性能指标vs损失函数
最后再说一下模型性能评估指标和损失值的区别。
损失值用于训练过程中,衡量模型预测结果与真实标签之间的差异,指导模型的参数更新。
模型性能指标主要用于评估模型的泛化能力,即模型在未见过的数据上的表现。通常衡量模型的预测准确性、精确率、召回率、F1 分数等。