如何使用类别权重改善机器学习中的类别不平衡?

2025年2月28日 | 阅读 6 分钟

引言

分类中的主要问题之一是类别不平衡,尤其是在二元分类中,这几乎在所有情况下都会导致预测不佳。这种情况发生在数据集被一个类别主导时,会促使模型偏向于数据集中占主导地位的那个类别。在处理此问题并已在文献中得到揭示的方法中,我们可以包括使用类别权重。

由于少数类样本的概率具有更高的权重,因此模型从中学习的能力得到了显著增强,可以解决偏向多数类的问题。在本文中,作者将解释类别权重,为什么它在处理类别不平衡方面很有用,以及它如何有效地提高模型在处理不平衡数据集方面的表现。

理解类别不平衡

现在我们对类别权重技术有了一定的了解,有一些背景信息需要理解关于类别不平衡问题。在分类问题中,类别不平衡是指一个类别比其他一个或多个类别拥有更多的样本。例如,在类别 A 占数据 90%,类别 B 占数据 10% 的二元问题中,就会出现类别不平衡的问题。

为什么类别不平衡很重要

当存在类别不平衡时,机器学习中类别的使用会以多种方式对模型的性能产生负面影响。这意味着多数类可能会主导模型,导致模型难以很好地泛化到少数类。这尤其危险,因为少数类具有重要意义,例如在欺诈检测、对孤立疾病的识别中,不平衡会导致严重的误判。

类别权重作为处理类别不平衡的方法

通过为类别分配权重,可以显示出处理类别不平衡的简单方法。这种方法包括在训练期间优先考虑少数类样本的重要性,同时降低多数类样本的重要性。通过这样做,可以更清晰地关注少数类,以期提高其预测能力。

如何有效实施类别权重

  1. 理解数据不平衡:第一步是识别少数类和多数类,并开始分析数据集中类别的分布。
  2. 计算类别权重:通过使用相等权重,或使用与感兴趣类别比例的倒数相等的权重,或由领域专家给出的权重,为您的模型选择合适的类别权重。
  3. 在模型中实现类别权重:在构建模型时,将“class_weight”参数添加到模型的 Compile 函数中。实际上,在大多数可用的机器学习库中进行此调整相当容易。
  4. 训练模型:应该使用加权的损失函数来训练模型,以便通过高度重视少数类来处理类别不平衡。
  5. 评估结果:训练完成后,在另一个验证集或测试集上验证模型的性能,并在此过程中,确保所有类都具有高精确率、召回率和 F1 分数。

带有类别权重的逻辑回归损失函数

在逻辑回归中,默认的二元交叉熵损失函数可以通过包含类别加权来修改。假设有两个类别,分别是类别 0(权重为 w0)和类别 1(权重为 w1)。修改后的损失函数可以表示为

L(y, p) = -(y * w0 • log(p) + (1 - y) * w1 • log(1 - p))

  • 当 y = 0(真实负类)时,损失可以定义为 w1 * log(1-p)。w_1 值的增加会导致模型在误分类正类时受到更大的惩罚,这使得模型在分类少数类时更加谨慎。
  • 当 y = 1(真实正类)时,损失为 -w0 * log(1 - p),其中 1 - p 是类别 0 的概率。同样,当 w_0 增加时,误分类负类也会受到更大的惩罚,以便为少数类提供足够的关注。

如何获得 w0 和 w1

当应用程序需要更复杂的标准来将记录分类为正常或异常时,会使用类别权重(w0 和 w1)。

确定类别权重在处理机器学习中的类别不平衡问题方面非常重要。目的是设计权重,以增强少数类在训练过程中的作用,从而减弱多数类的作用。有许多方法可用于确定这些权重,其中最常见的方法之一是反类别频率法。

反类别频率法

该方法与类别频率法识别类别的方式相反。

这种对类别进行加权的方法取决于每个特定类别中的样本数量。对于具有类别 0 和 1 的二元分类问题,可以使用以下公式计算类别权重

  • weight_0 = total_samples/(2 * class_0_samples)
  • weight_1 = total_samples / (2 * class_1_samples)

其中

  • total_samples 是数据集中使用的样本的总数。
  • class_0_samples 是属于类别 0 的样本数量,它是最大的类别。
  • class_1_samples 是少数类(也称为类别 1)的样本大小。
  • 2 是类别的数量

在此方法中,将样本的总计数除以每个类别脉冲计数的两倍;这样,它通过使模型训练期间两个类别的总权重相等来帮助克服类别不平衡问题。

代码片段

说明

在上面的代码中,calculate_class_weights 函数以数组 y 作为输入,在二元分类问题的情况下,该数组包含类别标签(0 和 1)。该函数采用频率倒数法来获取类别权重,然后返回一个包含权重及其所属类别的字典。total_samples 存储数据集中样本的数量,unique_classes 存储数据集中不同的标签,class_counts 存储每个标签的样本数量。

类别权重估算过程在机器学习系统中的类别不平衡情况下很重要。因此,尽管反类别频率法并不复杂,但它在考虑类别频率的性质方面可以准确地确定权重。在训练模型时,确保模型更关注少数类,从而提高准确率。

在执行逻辑回归时引入类别权重

在将类别权重应用于逻辑回归时,应该利用 TensorFlow/Keras 或 Scikit-learn 等著名的机器学习框架。

代码片段

在 Scikit-learn 中使用类别权重

代码片段

结论

传统的机器学习算法的一个常见问题是类别不平衡,尽管这仍然是一个普遍存在的问题,但可以使用类别权重来解决。为训练模型设计的一些技术包括优先考虑属于少数类的实例,希望模型能够以更平衡的准确率进行预测。但同样重要的是,要尝试不同的方法来找出最适合给定问题的方法。