应该使用什么损失函数来获得高精度或高召回率的二元分类器?

机器算法验证 物流 分类 不平衡类 损失函数
2022-01-30 17:26:07

我正在尝试对很少出现(在图像中)的对象进行检测,并计划在滑动/调整大小的窗口中使用 CNN 二元分类器。我已经构建了平衡的 1:1 正负训练和测试集(顺便说一句,在这种情况下这样做是正确的吗?),并且分类器在测试集的准确性方面做得很好。现在我想控制我的分类器的召回/精度,例如,它不会错误地标记太多的多数类出现。

明显的(对我来说)解决方案是使用现在使用的相同逻辑损失,但是通过将两种情况之一的损失乘以某个常数,权重类型 I 和类型 II 错误不同,可以调整。这样对吗?

PS 再想一想,这相当于对某些训练样本的权重大于其他样本。我认为只需添加更多的一类就可以达到同样的效果。

4个回答

人工构建一个平衡的训练集是有争议的,实际上颇有争议。如果你这样做了,你应该凭经验验证它确实比让训练集不平衡更有效。人为地平衡测试集几乎从来都不是一个好主意。测试集应该代表没有标签的新数据点。您希望它们不平衡,因此您需要知道您的模型是否可以处理不平衡的测试集。(如果您不期望新记录不平衡,为什么所有现有记录都不平衡?)

关于你的绩效指标,你总是会得到你所要求的。如果在一个不平衡的集合中准确度不是你最需要的,因为不仅类别而且错误分类成本都是不平衡的,那么不要使用它。如果您使用准确度作为度量标准,并始终采用具有最佳准确度的模型选择和超参数调整,那么您正在优化准确度。

我把少数类作为正类,这是命名他们的常规方式。因此,下面讨论的精度和召回率是少数类的精度和召回率。

  • 如果唯一重要的是识别所有少数类记录,你可以回忆一下。因此,您接受了更多的误报。
  • 只优化精度将是一个非常奇怪的想法。你会告诉你的分类器,对少数类的检测不足不是问题。获得高精度的最简单方法是在声明少数类时过于谨慎。
  • 如果您需要精确度和召回率,您可以采取 F-measure。它是准确率和召回率之间的调和平均值,因此会惩罚两个指标不同的结果。
  • 如果您知道两个方向的具体错误分类成本(以及正确分类的利润,如果每个类别不同),您可以将所有这些放入损失函数并优化它。

你做了几个假设。最好笼统地考虑最终目标,然后制定满足该目标的策略。例如,您真的需要强制选择分类吗?信噪比是否足够大以支持该分类(很好的例子:声音和图像识别)?还是信噪比低或者您对趋势感兴趣?对于后者,风险评估适合您。选择是关键,它决定了您选择的预测准确性指标。有关这一切的更多想法,请参阅http://www.fharrell.com/2017/01/classification-vs-prediction.htmlhttp://www.fharrell.com/2017/03/damage-caused-by-classification .html

大多数问题都与决策有关,而最佳决策来自风险估计以及损失/成本/效用函数。

风险(概率)估计方法的最佳方面之一是它可以处理灰色区域,在这些区域中,在没有获取更多数据的情况下做出分类或决策是错误的。然后是概率估计不需要(甚至不允许)通过人为操纵样本来“平衡”结果的事实。

在您提出这个问题后不久,有一篇有趣的研究论文,题为Scalable Learning of Non-Decomposable Objectives,我偶然发现了StackOverflow 的一个问题,该问题找到了构建几个有趣的损失函数的方法:

  • 固定召回的精度
  • 以固定精度召回
  • AUCROC 最大化

这里有一个 TF 1.x 的实现不幸的是,它似乎没有引起太多关注,因此没有得到积极维护但是,我认为在尝试构建现实世界的二元分类器时,这是一种非常有价值的方法。

关于您关于重新加权训练样本是否等同于将两种情况之一的损失乘以常数的问题:是的,是的。编写逻辑回归损失函数的一种方法是 其中分别表示正例和负例,构建的逻辑分类器例如,如果您想给负面实例更多的权重,您可能希望将损失修改为

j=1Jlog{1+exp[f(xj)]}+k=1Klog{1+exp[f(xk)]}
jkf()x
j=1Jlog{1+exp[f(xj)]}+k=1Kwlog{1+exp[f(xk)]}
对于某些通过加权逻辑回归的软件实现可以最小化此损失函数,但您也可以通过将负实例加权并拟合标准逻辑回归来得出相同的答案(例如,如果,那么您创建每个负面实例的 2 个副本并适合)。关于这种方法的一些进一步细节在这里这里有一个关于参数标准错误会发生什么的一般警告,但如果你只是做预测,这可能不是那么大的问题。w>1ww=2