不平衡数据集(变压器):如何确定类权重?

数据挖掘 阶级失衡 伯特 迁移学习 不平衡
2022-02-19 10:12:57

SimpleTranformers用来训练和评估模型。

由于我使用的数据集严重不平衡,因此建议我为每个标签分配权重。这里SimpleTranformers给出了一个分配权重的例子

然而,我的问题是:我该如何每个班级选择合适的权重?是否有特定的方法,例如使用标签比率的公式?

后续问题:用于同一数据集的权重是否“通用”?即,如果我使用完全不同的模型,我可以使用相同的权重还是应该根据模型分配不同的权重。

ps1。如果有任何区别,我正在使用roBERTa.

ps2。这里有一个类似的问题,但是,我相信我的问题不是重复的,因为 a)附加的问题是关于 Keras,而我的问题是关于变形金刚的,并且 b)我也在询问关于权重值如何的一般建议决定所附问题不在哪里。

3个回答

我不确定您使用的模型,但我可能会解释一般的 ML 程序。您有三个“普通”解决方案来应对不平衡的监督数据集。

  1. 重新加权类标签,以便每个标签有相同数量的样本(计算为给定标签的权重总和)。例如,如果具有最大样本数的标签有个样本,而其他一些类有个样本,那么您将分配权重nmaxniwi=nmaxni
  2. 欠采样 - 消除所有额外样本的基本过程,以便您最终获得平衡的数据集。
  3. 过采样 - 创建不平衡类的副本(样本少于)希望有所帮助,nmax

最大限度

设置类权重的目的是操纵损失函数,将更多的注意力放在次要标签上。事实上,传递给你的学习算法的每个数据点都会提供信息来帮助你的损失函数。通过使次要实例的权重更大,您对损失函数说它应该更多地关注该特定实例(特征、标签)。以这种方式产生影响的类权重最直观的方法是将归因于该观察的损失乘以相应的权重。

因此,假设您的训练数据中有 2 个类。A 类有 100 个观察值,而 B 类有 1000 个观察值。为了弥补不平衡,您将 A 类的权重设置为 B 类的权重 (1000 / 100 = 10 倍),即 [1.0, 0.1]。

一般来说,对于多类问题,您希望设置类权重,以便为每个类:

此类的观察次数 * 类权重 = 常数 A。

如果您选择 A = 1,则类的类权重 = 1 / 该类的观察数。

以下引自doc

权重(可选):长度为 num_labels 的列表,其中包含要分配给每个标签以进行损失计算的权重。


关于设置班级权重的特定方法,就像根据您的准确度指标尝试和评估有效的方法一样简单。

假设您的训练数据集包含具有四 (4) 个类别的目标,您可以按如下方式分配权重:

model = ClassificationModel("roberta","roberta-base",num_labels=4,
                            weight=[1, 0.5, 1, 2])

检查此链接