解决分类任务中数据倾斜问题

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

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

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

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

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

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

 

 “Safe” 技巧

偏置初始化

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

然后有 :

 其中,b0b1分别为负类和正类的偏置,negpos分别为负类和正类中元素的数量。通过这种初始化,所有指标都得到了简单的改善。

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

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

下采样和上加权的结果:

图片

 上采样和下加权的结果:

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

“Not-so-safe”的技巧 

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

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

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

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

 

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

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

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

 

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

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

结果如下:

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

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

必要时可以解决数据不平衡问题,有些技术会有意改变数据分布,只有在必要时才可使用。虽然本文讨论了概率问题,但最终的性能指标才是对业务最重要的指标。如果离线测试表明某个模型能增加价值,那么就在生产中进行测试。在实验中,本文使用了Toloka ML平台,它提供了一系列随时可用的模型,可以为ML项目提供一个良好的开端。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/12758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React Native RN state props

state: 是RN 专门用来标识是否重新渲染,通过属性的值来更新数据,React 内部会监听 state 的变化,一旦发生变化就会主动触发组件的 render() 方法来更新 Dom 结构,另外state是组件私有的,是没有办法通过其他…

VS+QT+PCL点云显示转网格表面体窗体实现

程序示例精选 VSQTPCL点云显示转网格表面体窗体实现 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<VSQTPCL点云显示转网格表面体窗体实现>>编写代码&#xff0c;代码整洁&…

正则表达式常用字符及案例

引言 正则表达式是一种强大而灵活的工具&#xff0c;它在文本搜索和处理中起到了至关重要的作用。熟练掌握正则表达式的常用字符和使用方法&#xff0c;将能帮助开发者更加高效地进行模式匹配和字符串操作。本文将介绍一些常见的正则表达式字符&#xff0c;并给出一些实际案例…

watch避坑,使用computed进行处理数据

业务场景&#xff1a;在vue中监听el-input 中的字数有没有超过60&#xff0c;如果超过60字时将60后面的字变为 “>>” 符号&#xff0c;以此实现预览苹果手机推送摘要场景。 错误&#xff1a;开始的逻辑是使用watch监听&#xff0c;检查length超过60直接 加上符号&#x…

python 网络编程

TCP编程 客户端 创建TCP连接时&#xff0c;主动发起连接的叫做客户端&#xff0c;被动响应的叫做服务端。当定义一个Socket表示打开一个网络连接&#xff0c;创建一个Socket需要知道目标计算机的IP地址和端口号和对应的协议类型。 # 导入socket库: import socket# 创建一个s…

基于MSP432P401R爬坡小车【2020年电赛C题】

文章目录 一、任务清单1. 硬件部分2. 软件部分 二、OpenMV巡线三、舵机转向四、停止线识别五、技术交流 一、任务清单 1. 硬件部分 主控板&#xff1a; MSP432P401R数据显示&#xff1a; OLED电机&#xff1a; 霍尔编码器电机电池&#xff1a; 7.3V航模电池巡线&#xff1a; …

图像中不规则物体的长轴与短轴:OpenCV实现指南

1.首先&#xff0c;读取图像并将其转换为灰度图像。 2.进行图像预处理&#xff0c;包括使用高斯模糊和阈值化&#xff0c;以便更好地处理图像。 3.通过使用OpenCV的cv2.findContours()函数&#xff0c;找到图像中的所有轮廓。 4.遍历所有轮廓&#xff0c;如果轮廓点的数量大…

使用ajax进行前后端交互的方法

使用ajax进行前后端交互的方法&#xff1a;&#xff08;我只测试通了json对象作为参数的方式&#xff0c;其他方式我没有测试通过&#xff09; 1、前端方法&#xff1a; 传参方式&#xff1a;POST 请求类型&#xff1a;json对象 响应类型&#xff1a;json对象 function test() …

idea 里 controller service impl mapper xml 切换跳转快捷键

首先在controller层&#xff0c;对着接口点方法的方法上按着ctrl和鼠标左键&#xff0c;你会进入service层。 对着方法ctrlaltb不按鼠标&#xff0c;你会进入impl层。service层的方法上按ctrl和鼠标左键会回到controller&#xff0c;ctrlaltb不按鼠标也会进入到impl层,impl上的…

[Linux]线程基本知识

概念 进程 一个正在执行的程序&#xff0c;它是资源分配的最小单位 进程中的事情需要按照一定的顺序逐个进行 进程出现了很多弊端: 一是由于进程是资源拥有者&#xff0c;创建、撤消与切换存在较大的时空开销&#xff0c;因此需要引入轻型进程&#xff1b; 二是由于对称多…

localhost和127.0.0.1一样吗?

学习笔记&#xff0c;如有错误&#xff0c;感谢指出&#xff01; 文章目录 1. 对比方式一1.1 表示方式&#xff1a;1.2 主机名解析&#xff1a;1.3 IPv6 支持&#xff1a;1.4 可读性和易用性&#xff1a;1.5 小总结 2. 对比方式二2.1 原理不同2.2 概念不同2.3 指向不同 1. 对比…

C++:类和对象(下)---对类和对象深入一些的理解

文章目录 构造函数&#xff1f;初始化列表explicit关键字 匿名对象 构造函数&#xff1f; 初始化列表 前面已然介绍过构造函数&#xff0c;但并未完全结束&#xff0c;构造函数有很多种写法&#xff0c;有带缺省参数的&#xff0c;有全缺省的&#xff0c;不带缺省参数的…但用…

未来的算法备案法规:创新和安全如何兼顾?

随着科技的快速发展&#xff0c;算法正逐步渗透到我们生活的各个方面&#xff0c;从推荐引擎到自动驾驶&#xff0c;从医疗诊断到金融交易&#xff0c;这一现象既充满希望&#xff0c;也充满了挑战。其中一个关键的挑战就是如何设计和实施有效的算法备案法规&#xff0c;以促进…

Linux下查找python路径

本地目前装了几个版本的python&#xff0c;这里记录下查找python路径的方法。 1&#xff1a;whereis命令 whereis python2&#xff1a;which命令 which python与whereis相似&#xff0c;但which会返回第一个找到的执行文件的位置。 3&#xff1a;find命令 find命令可以搜索系…

web流程自动化详解

今天给大家带来Selenium的相关解释操作 一、Selenium Selenium是一个用于自动化Web浏览器操作的开源工具和框架。它提供了一组API&#xff08;应用程序接口&#xff09;&#xff0c;可以让开发人员使用多种编程语言&#xff08;如Java、Python、C#等&#xff09;编写测试脚本&…

题目:2206.将数组划分成相等数对

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2206. 将数组划分成相等数对 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 先对数组进行排序&#xff0c;然后判断从第 2i 个 与 第 2i1 个元素是否全部相等即可&#xff08;i0,1,2,3,4..…

需求分析案例:消息配置中心

本文介绍了一个很常见的消息推送需求&#xff0c;在系统需要短信、微信、邮件之类的消息推送时&#xff0c;边界如何划分和如何设计技术方案。 1、需求 一个系统&#xff0c;一般会区分多个业务模块&#xff0c;并拆分成不同的业务系统&#xff0c;例如一个商城的架构如下&am…

webpack基础配置

webpack基础 webpack 处理css兼容问题webpack 处理css闪屏问题webpack 优化压缩css代码总结webpack 两种开发模式webpack 基本的功能webpack配置 5概念devServer 生产环境webpack配置实例开发环境webpack配置实例webpack优化 webpack 处理css兼容问题 下载loader 引入 package…

day45-Netflix Mobile Navigation(左边侧边栏动态导航)

50 天学习 50 个项目 - HTMLCSS and JavaScript day45-Netflix Mobile Navigation&#xff08;左边侧边栏动态导航&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name&…

k8s集群安装v1.20.9

参考网上资料并将异常问题解决&#xff0c;经测试可正常安装集群。 1.我的环境准备 本人使用vmware pro 17新建三个centos7虚拟机&#xff0c;每个2cpu&#xff0c;20GB磁盘存储&#xff0c;内存2GB&#xff0c;其中主节点的内存3GB&#xff0c;可使用外网. 2.所有节点安装D…