`class_weight` 和 `balanced_accuracy_score` 可以并且应该一起用于不平衡数据吗?

问题描述

如果我在 scikit-learn 中使用参数 LogisticRegression() 训练我的分类器(比如 class_weight='balanced'),那么我应该使用常规准确度度量(即 accuracy_score)还是平衡准确度(即,balanced_accuracy_score) 当我的类在数据集中不平衡时?

换句话说,使用这两个参数中的一个(在训练或测量时)会避免还是必须使用另一个

解决方法

这两件事,即使用 class_weight=balanced,以及您将选择评估结果的特定准确度度量(平衡与否),实际上它们之间无关。

从后者开始:分类性能指标,如准确性(在任何版本中)以任何方式参与模型拟合——只有损失;您可能会发现我在 Loss & accuracy - Are these reasonable learning curves? 中的回答有助于阐明这两个量之间的关系(尽管那里的讨论是关于 Keras,但其基本原理实际上是普遍适用的)。要选择的确切性能指标取决于您的实际业务问题,它实际上不是建模问题的一部分。而且,如前所述,它不会以任何方式影响训练

另一方面,使用class_weight会影响算法在训练期间如何对属于不同类别的样本进行加权以计算损失,仅此而已;它既不适用于推理(当类实际上未知时),也不适用于我们将如何(即使用什么指标)进行性能评估(这又是业务的一部分 em> 问题而不是建模)。

总而言之,所有组合原则上在这里都有效:使用 class_weight='balanced'(单独使用或可能与 sample_weight 结合使用)或不使用精度的两个版本(简单或平衡)中的任何一个。或者,回答标题中提出的问题 - 可以,但不需要

说到 sample_weight:如果您选择将其与逻辑回归的 fit() 方法一起使用,并且您进一步选择使用平衡准确度(requires 是 {{1} } 论点),对两者使用共同的值听起来肯定是合理的;但同样,这只是 - 一种合理的方法,而不是规则或严格的要求,如果您有理由不这样做,您应该随意不这样做。

让我明确说明,上述内容来自非常基本的原则;因此它是普遍适用的,并且它与任何 scikit-learn 内部结构特别没有任何关系。