一文助你解决数据倾斜问题

开发 前端
虽然本文讨论了概率问题,但最终的性能指标才是对业务最重要的指标。如果离线测试表明某个模型能增加价值,那么就在生产中进行测试。

在处理文本分类任务时,基准测试流行的自然语言处理架构的性能是建立对可用选项的理解的重要步骤。在这里,本文将深入探讨与分类相关的最常见的挑战之一——数据倾斜。如果你曾经将机器学习(ML)应用于真实世界的分类数据集,那么你可能已经很熟悉这个问题了。

了解数据分类中的不平衡问题

在数据分类中,我们经常关注数据点在不同类别中的分布情况。平衡的数据集在所有类别中的数据点数大致相同,因此更易于处理。然而,现实世界中的数据集往往是不平衡的。

不平衡数据可能会导致问题,因为模型可能会学习用最常见的类来标注所有内容,而忽略实际输入。如果主要类别非常普遍,以至于模型不会因为将少数类别错误分类而受到太多惩罚这种情况。此外,代表性不足的类别可能没有足够的数据供模型学习有意义的模式。

不平衡是否需要纠正?不平衡是数据的一个特征,一个很好的问题是,我们是否要对其采取任何措施。有一些技巧可以让模型的训练过程变得更容易。我们可以选择对训练过程或数据本身进行操作,让模型知道哪些类对我们来说特别重要,但这应该以业务需求或领域知识为依据。接下来,我们将详细讨论这些技巧和操作。

为了说明解决数据不平衡的不同技术的效果,我们将使用包含747条垃圾短信和4827条正常短信的sms-spam数据集。虽然只有两类,但为了更好地泛化,我们将把该任务视为多类分类问题。我们将使用roberta-base模型。

【sms-spam数据集】:https://huggingface.co/datasets/sms_spam

请记住,这些技术在其他数据中可能会产生不同的结果。在特定数据集上测试它们至关重要。

在不做任何调整的情况下训练分类模型时,我们会得到以下分类报告:

图片图片

“Safe” 技巧偏置初始化

本文的第一项技术是从一开始就让模型了解数据分布。我们可以通过相应地初始化最终分类层的偏置来传播这一知识。Andrej Karpathy在他的《训练神经网络的秘诀》(A Recipe for Training Neural Networks)中分享了这一技巧,它有助于模型从知情的角度出发。在我们的多分类案例中,我们使用softmax作为最终激活函数,我们希望模型在初始化时的输出能够反映数据分布。为了实现这一目标,我们需要解决以下问题:

【A Recipe for Training Neural Networks】:http://karpathy.github.io/2019/04/25/recipe/#2-set-up-the-end-to-end-trainingevaluation-skeleton--get-dumb-baselines:~:text=Huber%20losses%2C%20etc.-,init%20well.,-Initialize%20the%20final

图片图片

作为提醒,

图片图片

然后,

图片图片

其中,b0和b1分别为负类和正类的偏置,neg和pos分别为负类和正类中元素的数量。

通过这种初始化,所有指标都得到了简单的改善!

图片图片

在贝叶斯术语中,这意味着手动设置先验,并允许模型在训练过程中学习调整它们。

下采样和上加权/上采样和下加权

这些技术也能有效解决类不平衡问题。二者的概念相似,但执行方式不同。下采样和上加权涉及减少主要类的规模以平衡分布,同时在训练过程中为该类的示例分配更大的权重。上加权可确保输出概率仍然代表观察到的数据分布。相反,上采样和下加权则需要增加代表性不足的类别的规模,并按比例降低其权重。

下采样和上加权的结果:

图片图片

上采样和下加权的结果:

图片图片

在这两种情况下,“垃圾邮件”的召回率都有所下降,这可能是因为“正常邮件”的权重是“垃圾邮件”权重的两倍。

Focal loss

【Focal loss】:https://arxiv.org/abs/1708.02002

Focal loss是一种“动态缩放交叉熵损失”,是为了解决不平衡数据的训练问题而引入的。它只适用于二元情况,幸运的是,我们的问题只涉及两个类别。请看下面的公式:

图片图片

在该公式中,p是真实类别的概率,ɑ是加权系数,𝛾控制着根据置信度(概率)对损失的惩罚程度。

这种设计可以确保概率较低的示例获得指数级更大的权重,从而推动模型学习更具挑战性的示例。α参数允许不同类别的示例获得不同的权重。

通过调整α和𝛾的组合,可以找到最佳配置。要消除明确的类别偏好,可将α设为0.5;但是,使用这一平衡因子会有微小的改进。

以下是使用Focal loss方法获得的最佳结果:

图片图片

所有指标都优于基线,但需要调整一些参数。请记住,不一定总是这么顺利。

“Not-so-safe”的技巧

众所周知,存在着方法可以故意改变输出概率分布,从而给代表性不足的类别带来优势。通过使用这些技术,我们明确地向模型发出信号,表明某些类别至关重要,不应被忽视。这通常是由业务需求驱动的,比如检测金融欺诈或攻击性评论,这比意外地错误标记好的示例更重要。当目标是提高特定类别的召回率时,即使牺牲其他指标也要应用这些技术。

加权

加权法是为不同类别的样本损失值分配不同的权重。这是一种有效且适应性强的方法,因为它可以让你指出每个类别对模型的重要性。以下是单个训练样本的多类别加权交叉熵损失公式:

图片图片

其中,pytrue表示真实类别的概率,wytrue是该类别的权重。

确定权重的一个很好的默认方法是使用类别频率倒数:

图片图片

其中,N是数据集的总条目数,c是类别计数,ni是第i个类别的元素计数

权重计算如下:{'ham': 0.576, 'spam': 3.784}

以下是使用这些权重得出的指标:

图片图片

指标超过基线方案。虽然这种情况可能会发生,但并非总是如此。

不过,如果避免特定类的漏检至关重要,可以考虑增加类别的权重,这样可能会提高类别的召回率。让我们尝试使用权重{"ham": 0.576, "spam": 10.0}来查看结果。

结果如下:

图片图片

正如预期的那样,“垃圾邮件”的召回率提高了,但精确度却下降了。与使用类别频率倒数权重相比,F1分数有所下降。这证明了基本损失加权的潜力。即使对于平衡数据,加权也可能有利于召回关键类别。

上采样和下采样。

虽然与前面讨论的方法类似,但它们不包括加权步骤。下采样可能会导致数据丢失,而上采样可能会导致过度拟合上采样类别。虽然这两种方法都有帮助,但加权通常是更有效、更透明的选择。

概率比较

本文将用一个很明显的垃圾邮件示例来评估各种模型版本的可信度:“Call to claim your prize!”,结果见下表。

图片图片

正如预期的那样,与基线相比,加权模型显示出过度自信,而“下采样+上加权”模型则信心不足(由于上加权的“正常邮件”)。值得注意的是,偏置初始化会增加模型对“垃圾邮件”类别的可信度,而焦点丢失则会降低模型对“垃圾邮件”类别的可信度。

总结

总之,必要时可以解决数据不平衡问题。请记住,有些技术会有意改变数据分布,只有在必要时才可使用。不平衡是一种特征,而不是错误!

虽然本文讨论了概率问题,但最终的性能指标才是对业务最重要的指标。如果离线测试表明某个模型能增加价值,那么就在生产中进行测试。

在实验中,本文使用了Toloka ML平台。它提供了一系列随时可用的模型,可以为ML项目提供一个良好的开端。

总的来说,考虑到训练ML模型的数据分布至关重要。训练数据必须代表真实世界的分布,模型才能有效工作。如果数据本身不平衡,模型应考虑到这一点,以便在实际场景中表现良好。

责任编辑:武晓燕 来源: Python学研大本营
相关推荐

2020-05-12 15:40:06

MySQ数据库索引

2022-08-18 09:00:00

自动驾驶合成控制迈阿密

2021-08-04 07:21:31

Hive 数据排查

2017-10-22 06:05:28

语音识别深度学习ASR

2022-12-12 08:13:27

Redis数据倾斜

2022-10-20 08:01:23

2022-08-27 10:37:48

电子取证信息安全

2022-04-11 10:56:43

线程安全

2018-07-18 11:23:02

2018-04-03 13:08:31

2020-10-08 14:32:57

大数据工具技术

2020-05-15 16:37:13

PowerBI数据分析

2022-05-04 17:43:28

元数据大数据

2022-04-12 14:54:52

Rediskey

2022-02-23 12:07:20

分布式Spark数据倾斜

2020-10-26 09:18:50

RedisCluste

2022-03-24 08:51:48

Redis互联网NoSQL

2021-08-04 16:06:45

DataOps智领云

2023-12-22 19:59:15

2018-05-25 10:51:50

数据保护进
点赞
收藏

51CTO技术栈公众号