我在python中使用BERT执行多类文本分类。我用来重新训练模型的数据集是高度不平衡的。现在,我很清楚,类的不平衡会导致一个糟糕的模型,在模型训练之前应该通过欠采样、过采样等来平衡训练集。
然而,训练集的分布应该与生产数据的分布相似也是一个事实。
现在,如果我确定在生产环境中扔给我的数据也将是不平衡的,也就是说,要分类的样本可能属于一个或多个类,而不是其他一些类,我应该平衡我的训练集吗?
或
当我知道训练集的分布与我在生产中遇到的数据分布相似时,我是否应该保持训练集的原样?
请给我一些想法,或者提供一些博客或论文来理解这个问题。
类不平衡本身不是问题,问题是少数类的样本太少,使得描述其统计分布变得更加困难,这对于高维数据尤其如此(BERT嵌入有768维IIRC)。
此外,逻辑函数倾向于低估罕见事件的概率(参见机制中的https://gking.harvard.edu/files/gking/files/0s.pdf),这可以通过选择分类阈值以及重新采样来抵消。
CrossValidated对此有相当多的讨论(如https://stats.stackexchange.com/questions/357466)。TL;博士:
- 虽然太少的类样本可能会降低预测质量,但重采样不能保证给出整体改进;至少,没有一个完美的重新采样比例的通用配方,你必须自己测试一下;
- 然而,现实生活中的任务通常不平等地权衡分类错误:重新采样可能有助于以整体准确性为代价提高某些类的指标。同样适用于分类阈值的选择。
这取决于您的分类目标:
- 你想要一个随机样本被正确分类的高概率吗?→不要平衡你的训练集。
- 你想要一个高概率的随机样本从一个稀有类分类是否正确?→平衡你的训练集或在训练期间应用加权,增加稀有类的权重。
例如,在客户端看到的web应用程序中,重要的是大多数样本被正确分类,忽略罕见的类,而在异常检测/分类的情况下,罕见的类被正确分类是非常重要的。
请记住,高度不平衡的数据集往往总是预测大多数类,因此增加稀有类的数量或权重可能是一个好主意,即使没有完美平衡训练集。
P(label | sample)
和P(label)
不一样。
P(label | sample)
是你的训练目标。
在对具有大参数空间的模型进行基于梯度的小批量学习的情况下,稀有标签对模型训练的占用很小。因此,您的模型适合P(label)
。
为了避免符合P(label)
,你可以平衡批次。在一个时代的整体批次中,数据看起来像是上采样的少数族裔。目标是得到一个更好的损失函数,它的梯度将参数移动到更好的分类目标。
我没有任何证据来证明这个。这也许不是一个准确的说法。有足够的训练数据(关于特性的复杂性)和足够的训练步骤你可能不需要平衡。但大多数语言任务都相当复杂,而且没有足够的数据进行训练。这就是我在上面的语句中所想象的情况。