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

现实中,样本(类别)样本不平衡(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对样本的正负样本比例情况是不敏感。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统——Shell脚本——一键安装LNMP

#!/bin/bash #安装nginx echo "安装nginx服务" wget http://nginx.org/download/nginx-1.11.4.tar.gz &>/dev/null if [ $? -eq 0 ] thenecho "nginx-1.11.4安装包下载完成"echo "--开始安装必要的依赖文件--"yum install -y gcc gcc-c…

深度学习--神经网络基础(2)

损失函数 在深度学习中, 损失函数是用来衡量模型参数的质量的函数 , 衡量的方式是比较网络输出和真实输 出的差异: 分类 1.多分类损失函数 在多分类任务通常使用 softmax 将 logits 转换为概率的形式,所以多分类的交叉熵损失也叫做 softmax 损失 &…

嵌入式中有关软件开发的错误观念

从学生转变为职业人的过程是很艰难的,因为我们要与自己积累了多年的“老毛病”作斗争,这些“老毛病”包括:做事拖拉、不守时、不遵守规则、怕吃苦等。 就像发射火箭卫星一样,摆脱重力的束缚所花费的燃料是最多的,一旦…

springcloud:3.1介绍雪崩和Resilience4j

灾难性雪崩效应 简介 服务与服务之间的依赖性,故障会传播,造成连锁反应,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。 原因 1.服务提供者不可用(硬件故障、程序bug、缓存击穿、用户大量请求) 2.重试加大流量(用户重试,代码逻辑重试) 3.服…

STM32标准库开发——BKP备份RTC时钟

备份寄存器BKP(Backup Registers) 由于RTC与BKP关联性较高,所以RTC的时钟校准寄存器以及一些功能都放在了BKP中。TAMPER引脚主要用于防止芯片数据泄露,可以设计一个机关当TAMPER引脚发生电平跳变时自动清除寄存器内数据不同芯片BKP区别,主要体…

【python开发】网络编程(上)

这里写目录标题 一、必备基础(一)网络架构1、交换机2、路由器3、三层交换机4、小型企业基础网络架构5、家庭网络架构6、互联网 (二)网络核心词汇1、子网掩码和IP2、DHCP3、内网和公网IP4、云服务器5、端口6、域名 一、必备基础 &…

小程序配置服务器域名的操作步骤(入门级)

将详细列出小程序配置服务器域名的操作步骤: 服务器选购推荐:腾讯云轻量服务器 点击以下任一云产品链接,跳转后登录,自动享有所有云产品优惠权益: 经过笔者亲测,强烈推荐腾讯云轻量应用服务器作为游戏服…

益生菌不一定全是“益”,也存在一定的安全风险

谷禾健康 益生菌被世界卫生组织定义为“当摄入足够量时,可为宿主带来健康益处的活微生物”。近年来,随着人们发现其可用于预防、减轻或治疗特定疾病以及改善健康,益生菌在食品和临床治疗中的应用越来越广泛。 大量研究表明,益生菌有助于维持肠道菌群的平衡,促进消化和吸收…

【图说】电脑发展史

免责声明:文中有一些图片来源自网络,如有版权请通知我删除,谢谢! “结绳记事”是计算的开端 如果说“结绳记事”仅是计数,那么“算筹”就是真正的计算工具 算盘也是我们老祖宗的杰出发明,最擅长“加减乘除”,包括但不限于乘方、开方、对数等。还能进行开发智力的“珠心算…

MongoDB聚合运算符:$count

文章目录 语法使用举例在$group阶段中使用在$setWindowFields阶段使用 $count聚合运算符返回分组中文档的数量。从5.0开始支持。 语法 { $count: { } }$count不需要参数 使用 $count可以用于下列聚合阶段: $bucket$bucket$group$setWindowFields 在$group阶段中…

Apache Flink连载(三十五):Flink基于Kubernetes部署(5)-Kubernetes 集群搭建-1

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​编辑

List 集合遍历过程中删除元素避坑指南。

文章目录 1. 遍历2. 遍历过程中删除元素2.1 for 简单循环正向遍历方式2.2 for 简单循环反向遍历方式2.3 foreach 方式遍历删除2.4 Iterator的remove()方法2.5 <font color green> removeIf() &#xff08;推荐&#xff09;<green>2.6 Strem 方式 作为一名后端开发…

S1---FPGA硬件板级原理图实战导学

视频链接 FPGA板级实战导学01_哔哩哔哩_bilibili FPGA硬件板级原理图实战导学 【硬件电路设计的方法和技巧-哔哩哔哩】硬件电路设计的方法和技巧01_哔哩哔哩_bilibili&#xff08;40min&#xff09; 【高速板级硬件电路设计-哔哩哔哩】 高速板级硬件电路设计1_哔哩哔哩_bil…

网安播报|开源Xeno RAT特洛伊木马在GitHub上成为潜在威胁

1、开源Xeno RAT特洛伊木马在GitHub上成为潜在威胁 一种“设计复杂”的远程访问特洛伊木马&#xff08;RAT&#xff09;&#xff0c;称为Xeno RAT已在GitHub上提供&#xff0c;使其他参与者可以轻松访问&#xff0c;无需额外费用。开源RAT是用C#编写的&#xff0c;与Windows 10…

【Flutter 面试题】解释 Flutter的热重载(Hot Reload)功能

【Flutter 面试题】解释 Flutter的热重载&#xff08;Hot Reload&#xff09;功能 文章目录 写在前面解答补充说明 写在前面 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家博主&#xff0c;51CTO专家博主。2…

JVM运行时数据区——虚拟机栈

文章目录 1、虚拟机栈概述1.1、StackOverflowError1.2、OOM异常 2、栈的存储单位3、局部变量表3.1、局部变量表简介3.2、Slot 4、操作数栈5、栈顶缓存技术6、动态链接7、方法的调用7.1、方法调用的分类7.2、虚方法与非虚方法7.3、关于invokedynamic指令7.4、方法重写的本质7.5、…

StarRocks——中信建投基于StarRocks构建统一查询服务平台

目录 一、需求背景 1.1 数据加工链路复杂 1.2 大数据量下性能不足&#xff0c;查询响应慢 1.3 大量实时数据分散在各个业务系统&#xff0c;无法进行联合分析 1.4 缺少与预计算能力加速一些固定查询 二、构建统一查询服务平台 三、落地后的效果与价值 四、项目经验总结…

laravel ApiResponse接口统一响应封装

一&#xff0c;新增接口返回码配置文件 在config中新增配置文件apicode.php <?phpreturn [ apicodes>[/*** Message("OK")* 对成功的 GET、PUT、PATCH 或 DELETE 操作进行响应。也可以被用在不创建新资源的 POST 操作上*/HTTP_OK > 200,/*** Message(&qu…

C#,K中心问题(K-centers Problem)的算法与源代码

1 K中心问题&#xff08;K-centers Problem&#xff09; k-centers problem: 寻找k个半径越小越好的center以覆盖所有的点。 比如&#xff1a;给定n个城市和每对城市之间的距离&#xff0c;选择k个城市放置仓库&#xff08;或ATM或云服务器&#xff09;&#xff0c;以使城市…

python实现ElGamal算法

ElGamal公钥密码算法是在密码协议中有着重要应用的一类公钥密码算法&#xff0c;基于公钥密码体制和椭圆曲线加密体系&#xff0c;其安全性是基于有限域上离散对数学问题的难解性。至今仍是一个安全性良好的公钥密码算法。既可用于加密又可用于数字签名的公钥密码体制。 数字签…