机器学习(II)--样本不平衡

news2024/11/15 17:32:49

现实中,样本(类别)样本不平衡(class-imbalance)是一种常见的现象,如:金融欺诈交易检测,欺诈交易的订单样本通常是占总交易数量的极少部分,而且对于有些任务而言少数样本更为重要。一般地,样本类别比例(Imbalance Ratio)(多数类vs少数类)严重不平衡时,分类算法将开始做出有利于多数类的预测。

一文解决样本不均衡(全)

数据抽样

随机抽样(random sampling)在机器学习领域,是很常见的做法。例如,将原始数据集随机分为训练集和测试集。常用的抽样方法有无放回抽样有放回抽样
针对非平衡的数据集,为了使得模型在这个数据集上学习的效果更加好,通过减少分类中多数类样本的数量(欠采样)或者增加分类中少数类样本的数量(过采样),来实现样本均衡。
过采样(over sampling)和欠采样(under sampling)也叫做上采样和下采样。

SMOTE是一种合成少数类过采样技术,主要策略为

  1. 首先,对每个少数类样本 x i \mathbf x_i xi,从它的最近邻中随机选 k k k 个样本;
  2. 然后,在 x i \mathbf x_i xi和近邻样本之间的连线上随机选一点作为新合成的少数类样本。

除了常用的smote之外,还有自适应合成采样,比如Borderline-SMOTE、Adaptive Synthetic Sampling(ADA-SYN)等,都包含在 imblearn Python 库中。

数据增强

数据增强(Data Augmentation)是指从原始数据中加工出更多的数据表示,提高原数据的数量和质量,从而提高模型的学习效果。

基于样本变换的数据增强

  • 单样本增强:主要用于图像,比如几何操作、颜色变换、随机查出、剪切旋转等等,可参见imgaug开源库。
  • 多样本增强:是指通过组合及转换多个样本的方式,比如刚刚提到的smote,还有SamplePairing、Mixup等方法在特征空间内构造已知样本的邻域值样本。

基于深度学习的数据增强
生成模型,如变分自编码网络(VAE)和生成生成对抗网络(GAN),其生成样本的方法也可以用于数据增强,这种基于网络合成的方法相比于传统的数据增强技术虽然过程复杂,但是生成的样本更加多样。

损失函数

损失函数层面的主流就是常用的代价敏感(cost-sensitive)学习,为不同的分类错误给予不同惩罚力度(权重),在调解类别平衡的同时,也不会增加计算复杂度。即对少数类样本给更大的权重系数,对多数类样本给更小的权重系数,通过这种方式可以在一定程度上解决样本不均衡的问题。

class weight 可以为不同类别的样本提供不同的权重,少数类的样本有更高的权重,从而模型可以平衡各类别的学习。如sklearn提供的class_weight参数,可以作为超参调试,避免决策边界偏重多数类的现象。

OHEM(Online Hard Example Mining)算法的核心是选择一些难样本(多样性和高损失的样本)作为训练的样本,针对性地改善模型学习效果。对于数据的类别不平衡问题,OHEM的针对性更强。
Focal loss的核心思想是在交叉熵损失函数(CE)的基础上增加了类别的不同权重以及困难(高损失)样本的权重(如下公式),以改善模型学习效果。

Focal Loss的核心思想是在交叉熵损失函数(CE)的基础上增加了类别的不同权重以及困难(高损失)样本的权重,以改善模型学习效果。

对于二元分类问题,交叉熵(cross entropy)损失函数定义为
CE ( p t ) = − log ⁡ p t \text{CE}(p_t)=-\log p_t CE(pt)=logpt
其中 P t P_t Pt 为正样本概率函数,用来简化公式:
p t = { p if  y = 1 1 − p otherwise p_t=\begin{cases} p & \text{if } y=1 \\ 1-p & \text{otherwise} \end{cases} pt={p1pif y=1otherwise

Focal Loss 函数定义如下:
FL ( p t ) = − a t ( 1 − p t ) γ log ⁡ p t \text{FL}(p_t)=-a_t(1-p_t)^{\gamma}\log p_t FL(pt)=at(1pt)γlogpt
其中权重因子 a t a_t at 根据正负样本的分布设置,用来平衡损失函数分布
a t = { a if  y = 1 1 − a otherwise a_t=\begin{cases} a & \text{if } y=1 \\ 1-a & \text{otherwise} \end{cases} at={a1aif y=1otherwise

( 1 − p t ) γ (1-p_t)^{\gamma} (1pt)γ 称为调制因子(modulating factor),

分解开来
FL ( p t ) = a t ( 1 − p t ) γ CE ( p t ) = { − a ( 1 − p ) γ log ⁡ p if  y = 1 − ( 1 − a ) p γ log ⁡ ( 1 − p ) otherwise \text{FL}(p_t)=a_t(1-p_t)^{\gamma}\text{CE}(p_t) =\begin{cases} -a(1-p)^{\gamma}\log p & \text{if }y=1 \\ -(1-a)p^{\gamma}\log(1-p) & \text{otherwise} \end{cases} FL(pt)=at(1pt)γCE(pt)={a(1p)γlogp(1a)pγlog(1p)if y=1otherwise

调制因子减少了易于分类(概率高)的样本的贡献。

  1. p t → 0 p_t\to 0 pt0 的时候,调制因子趋于1,对于总的loss的贡献很大。当 p t → 1 p_t\to 1 pt1的时候,调制因子趋于0,也就是对于总的loss的贡献很小。
  2. γ = 0 \gamma=0 γ=0 的时候,focal loss就是传统的交叉熵损失,可以通过调整 γ \gamma γ 实现调制因子的改变。

引用作者的话:当 γ = 2 \gamma=2 γ=2 时,与 CE 相比,分类为 p t = 0.9 p_t = 0.9 pt=0.9 的示例的损失将降低 100 倍,而当 p t ≈ 0.968 p_t ≈ 0.968 pt0.968 时,其损失将降低 1000 倍。减少易于分类的示例的损失,可以让训练更多地关注难以分类的示例。

focal-loss

模型层面

解决不均衡问题,更为优秀的是基于采样+集成树模型等方法,可以在类别不均衡数据上表现良好。采样+集成学习这类方法简单来说,通过重复组合少数类样本与抽样的同样数量的多数类样本,训练若干的分类器进行集成学习。

EasyEnsemble 是利用模型集成(Ensemble)的方法多次欠采样。核心思路就是将多数类样本集随机分成 N 个子集,且每一个子集样本与少数类样本相同,然后分别将各个多数类样本子集与少数类样本进行组合,产生多个不同的训练集,进而训练多个不同的基分类器,最后bagging集成各基分类器,得到最终模型。

BalanceCascade 是利用增量训练的思想(Boosting)。核心思路就是在每一轮训练时都使用多数类与少数类数量上相等的训练集,然后使用该分类器对全体多数类进行预测,对于那些分类正确的多数类样本不放回,然后对这个更小的多数类样本欠采样产生训练集,然后进入下一轮迭代继续降低多数类数量。

通常,在数据集噪声较小的情况下,可以用BalanceCascade,可以用较少的基分类器数量得到较好的表现(基于串行的集成学习方法,对噪声敏感容易过拟合)。噪声大的情况下,可以用EasyEnsemble,基于串行+并行的集成学习方法,bagging多个Adaboost过程可以抵消一些噪声影响。

评估指标

分类常用的指标precision、recall、F1、混淆矩阵,对于样本不均衡的不同程度,都会明显改变这些指标的表现。可以采用AUC、AUPRC(更优)评估模型表现,AUC对样本的正负样本比例情况是不敏感。

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

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

相关文章

Linux系统中的高级多线程编程技术

在Linux系统中,多线程编程是一种常见的并发编程模型,通过利用多线程可以实现程序的并发执行,提高系统的性能和响应速度。在Linux系统中,开发人员通常使用 pthread 库来进行多线程编程,同时需要掌握线程同步技术以避免并…

代码随想录第二十五天 78.子集 90.子集II 491.非递减子序列

LeetCode 78 子集 题目描述 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出&…

使用git的小笔记

平时工作中使用git存储项目代码, 常用的命令 拉取仓库代码 git clone http://100.100.100.100:9080/my_test/test.git 拉取到以后, 先切换到自己的分支 git checkout my_name 一顿魔改代码 然后 add 新增的文件或者修改的文件 git add * 然后提交 并写…

IDEA创建Sping项目只能勾选17和21,却无法使用Java8

报错信息 The required java version 17 is not supported by the project SDK 1.8.The maximum supported Java version is 8. 想创建一个springboot项目,本地安装jdk版本为1.8,但是在使用 Spring Initializr创建项目时,版本只能选择21或17,…

02、MongoDB -- MongoDB 的安全配置(创建用户、设置用户权限、启动安全控制、操作数据库命令演示、mongodb 的帮助系统介绍)

目录 MongoDB 的安全配置启动 mongodb 服务器 和 客户端 :1、启动单机模式的 mongodb 服务器2、启动 mongodb 的客户端 MongoDB 的安全配置启动演示用到的 mongodb 服务器 和 客户端启动单机模式的 mongodb 服务器:启动 mongodb 的客户端 MongoDB 操作数…

Spring Boot与Docker部署

系列文章目录 文章目录 系列文章目录前言一、开启Docker远程访问二、新建Maven工程三、创建Java类四、创建Dockerfile五、完整目录结构如下所示:六、Docker启动镜像前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,…

Linux/Centos 部署静态IP,解决无法访问目标主机、Destination Host Unreachable、无法ping通互联网的问题

Linux/Centos 部署IP,解决无法访问目标主机、Destination Host Unreachable、无法ping通互联网的问题 Linux/Centos 部署静态IP查物理机/自身电脑的IP设置VMware上的虚拟网络编辑器设置网卡IP,激活至此就可访问百度了 Linux/Centos 部署静态IP 需要注意…

小程序自定义组件

自定义组件 1. 创建-注册-使用组件 组件介绍 小程序目前已经支持组件化开发,可以将页面中的功能模块抽取成自定义组件,以便在不同的页面中重复使用; 也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护。 开发中常见的…

数通HCIE和云计算HCIE哪个好一点?

数通是网络的基础知识,也是入门人员必学的方向,相对也会简单些,学习数通,可以很好的学习其他的方向。数通的就业范围也比较广,运营商、企业、政府还是互联网公司,都需要大量的数通工程师来搭建和维护网络&a…

Sora引发安全新挑战

文章目录 前言一、如何看待Sora二、Sora加剧“深度伪造”忧虑三、Sora无法区分对错四、滥用导致的安全危机五、Sora面临的安全挑战总结前言 今年2月,美国人工智能巨头企业OpenAI再推行业爆款Sora,将之前ChatGPT以图文为主的生成式内容全面扩大到视频领域,引发了全球热议,这…

MATLAB练习题:排队论问题的模拟

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 下面我们来看一道排队论的题目。假设某银行工作时间内只有一个…

生成式人工智能治理:入门的基本技巧

GenAI 以前所未有的速度调解并扰乱了“一切照旧”,同时带来了令人难以置信的力量,但也带来了不可否认的责任。当然,现代企业非常熟悉技术进步。然而,人工智能的到来(和实施)无疑引起了相当大的冲击&#xf…

性能优化篇(二) 静态合批步骤与所有注意事项\游戏运行时使用代码启动静态合批

静态合批步骤: 1.开启Project Settings —>Player–>Other Setting里勾选Static Batching选项(一般情况下unity都是默认勾选状态) 2.勾选需要合批的静态物体上的Batching Static项,勾选后此物体下的所有子物体都默认参与静态合批(勾选后物体不能进行移动/旋转/缩放操作,…

Zookeeper4:Java客户端、应用场景以及实现、第三方客户端curator工具包

文章目录 Java连接Zookeeper服务端依赖代码使用 应用场景统一命名服务统一配置管理统一集群管理服务器节点动态上下线理解实现模拟服务提供者【客户端代码】-注册服务模拟服务消费者【客户端代码】-获取服务信息进行请求消费 软负载均衡分布式锁理解实现 生产集群安装N台机器合…

事务Transaction简写为tx的原因

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Transaction简写的由来 数据库事务Transaction通常被简写为tx。让人疑惑的是:这个单词本身没有字母x为何又将其简写成了tx呢? 第一种可能 Transac…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:背景设置)

设置组件的背景样式。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 background10 background(builder: CustomBuilder, options?: { align?: Alignment }) 设置组件背景。 系统能力: …

java 正则表达式介绍

Java正则表达式是一种强大的文本处理工具,它允许你进行模式匹配、搜索和文本操作。正则表达式提供了一种简洁、灵活的方式来处理字符串,可以用于各种应用场景,如数据验证、文本解析、搜索和替换等。 正则表达式的基础知识 正则表达式…

PaddleOCR 高精度文字识别:丰富多样的前沿算法 | 开源日报 No.187

PaddlePaddle/PaddleOCR Stars: 34.1k License: Apache-2.0 PaddleOCR 是一个丰富、领先和实用的 OCR 工具库,旨在帮助开发者训练更好的模型并将其应用到实际场景中。该项目具有以下特点和优势: 支持多种 OCR 相关前沿算法提供产业级特色模型 PP-OCR、…

CentOS系统上安装幻兽帕鲁/Palworld服务端的详细步骤是什么?

CentOS系统上安装幻兽帕鲁/Palworld服务端的详细步骤是什么? 首先,需要确认Docker是否已经安装。如果未安装,则需要进行安装。接下来,运行Docker容器。这一步是为了创建一个可以运行幻兽帕鲁服务端的环境。然后,在容器…

顺序表基础

⽬录 1. 课前准备 2. 顺序表概念及结构 3. 顺序表分类 4. 实现动态顺序表 正⽂开始 课前预备 1. 课程⽬标 C语⾔语法基础到数据结构与算法,前⾯已经掌握并具备了扎实的C语⾔基础,为什么要学习数据结构 课程?⸺通讯录项⽬ 2. 需要…