机器学习中类别不平衡问题的解决方案

news2024/11/17 3:41:41

类别不平衡问题

  • 解决方案
    • 简单方法
      • 收集数据
      • 调整权重
      • 阈值移动
    • 数据层面
      • 欠采样
      • 过采样
      • 采样方法的优劣
    • 算法层面
      • 代价敏感
      • 集成学习:EasyEnsemble
    • 总结

类别不平衡(class-imbalance)就是指分类任务中不同类别的训练样例数目差别很大的情况

解决方案

当问题的指标是ROC或者AUC等对类别不平衡不敏感的指标,那么此时不处理和处理的差别没那么大;但是对于召回率为评判指标的模型则需要进行处理

简单方法

收集数据

针对少量样本数据,可以尽可能去扩大这些少量样本的数据集,或者尽可能去增加他们特有的特征来丰富数据的多样性

调整权重

可以简单的设置损失函数的权重,更多的关注少数类。在python的scikit-learn中我们可以使用class_weight参数来设置权重。为了权衡不同类型错误所造成的不同损失,可为错误赋予“非均等代价”

阈值移动

直接基于原始训练集进行学习,但在用训练好的分类器进行预测时,将原本默认为0.5的阈值调整为 正例数 正例数 + 负例数 \frac{正例数}{正例数+负例数} 正例数+负例数正例数

如果正负样本数量相同,对于正样本预测为 y y y,那么分类决策规则为:
y 1 − y > 1 \frac{y}{1-y}>1 1yy>1
预测为正例,当正负样本数量不同时,分别为 m + , m − m^{+},m^{-} m+,m,则观测几率为 m + m − \frac{m^{+}}{m^{-}} mm+,那么当分类器预测几率大于观测几率即为正例:
y 1 − y > m + m − \frac{y}{1-y}>\frac{m^{+}}{m^{-}} 1yy>mm+
可以变化为以下形式:
y ′ 1 − y ′ = y 1 − y ⋅ m − m + > 1 \frac{y'}{1-y'}=\frac{y}{1-y}\cdot \frac{m^{-}}{m^{+}}>1 1yy=1yym+m>1
也可以称为“再缩放”

数据层面

欠采样

对训练集中多数类样本进行“欠采样”(undersampling),即去除一些多数类中的样本使得正例、反例数目接近,然后再进行学习。

  • 随机欠采样
    随机欠采样顾名思义即从多数类中随机选择一些样本组成样本集 。然后将新样本集与少数类样本集合并。
  • Edited Nearest Neighbor (ENN)
    遍历多数类的样本,如果他的大部分k近邻样本都跟他自己本身的类别不一样,我们就将他删除;

过采样

对训练集里的少数类进行“过采样”(oversampling),即增加一些少数类样本使得正、反例数目接近,然后再进行学习。

  • 随机过采样
    随机过采样是在少数类S中随机选择一些样本,然后通过复制所选择的样本生成样本集E,将它们添加到S中来扩大原始数据集从而得到新的少数类集合S+E。
  • SMOTE(Synthetic Minority Oversampling,合成少数类过采样)
    SMOTE是对随机过采样方法的一个改进算法,通过对少数类样本进行插值来产生更多的少数类样本。基本思想是针对每个少数类样本,从它的k近邻中随机选择一个样本 (该样本也是少数类中的一个),然后在两者之间的连线上随机选择一点作为新合成的少数类样本。

采样方法的优劣

  • 优点:
  1. 平衡类别分布,在重采样后的数据集上训练可以提高某些分类器的分类性能。
  2. 欠采样方法减小数据集规模,可降低模型训练时的计算开销。
  • 缺点:
  1. 采样过程计算效率低下,通常使用基于距离的邻域关系(k近邻)来提取数据分布信息,计算开销大。
  2. 易被噪声影响,最近邻算法容易被噪声干扰,可能无法得到准确的分布信息,从而导致不合理的重采样策略。
  3. 过采样方法生成过多数据,会进一步增大训练集的样本数量,增大计算开销,并可能导致过拟合。
  4. 不适用于无法计算距离的复杂数据集,如用户ID。

算法层面

代价敏感

可用于多分类问题,代价敏感学习方法的核心要素是代价矩阵,如表所示。其中 c o s t i j cost_{ij} costij表示将第 i i i 类样本预测为第 j j j 类样本的代价。若将第0类判别为第1类所造成的损失更大,则 c o s t 01 > c o s t 10 cost_{01}>cost_{10} cost01>cost10;损失程度相差越大, c o s t 01 , c o s t 10 cost_{01},cost_{10} cost01,cost10的值差别越大。当
c o s t 01 = c o s t 10 cost_{01}=cost_{10} cost01=cost10时为代价不敏感的学习问题。
图1

集成学习:EasyEnsemble

在这里插入图片描述
1:数据中,少数标签的为P,多数标签的N,
为P与N在数量上的比例,T为需要采集的subset份数,也可以说是设置的基分类器的个数。
为训练基分类器i (默认使用AdaBoost,也可以设置为其他,例如XGBoost)的训练循环次数(iteration)。

2-5: 根据少数标签的为P的数量,对多数标签的N进行随机采样产生
,使得采样出来的数量和P的数量一样。

6: 把
和P结合起来,然后给基分类器i学习。这里的公式只单个基分类器的训练过程。论文里用的基分类器是AdaBoost,而AdaBoost是由N个弱分类器组成的,j就是表示Adaboost基分类器里的第j个弱分类器.

7: 重复采样,训练T个这样的基分类器。

8: 对T个基分类器进行ensemble。而这里并非直接取T个基分类的结果(0,1)进行投票,而是把n个基分类器的预测概率进行相加,最后再通过sign函数来决定分类,sgn函数就是sign函数,sgn就是把结果转成两个类,小于0返回-1,否则返回1。.

总结

  • 通过某种方法使得不同类别的样本对于模型学习中的Loss(或梯度)贡献是比较均衡的

    • 样本层面
      1. 欠采样、过采样
      2. 数据增强:从原始数据加工出更多数据的表示,提高原数据的数量及质量,包括几何操作、颜色变化、随机裁剪、添加噪声
    • 损失函数层面:代价敏感学习(cost-sensitive),为不同的分类错误给予不同惩罚力度(权重)
      1. class weight:为不同类别的样本提供不同的权重(少数类有更高的权重),从而模型可以平衡各类别的学习
      2. Focal loss的核心思想是在交叉熵损失函数(CE)的基础上增加了类别的不同权重以及困难(高损失)样本的权重
      3. OHEM(Online Hard Example Mining)算法的核心是选择一些hard examples(多样性和高损失的样本)作为训练的样本,针对性地改善模型学习效果
    • 模型层面:
      1. 选择对类别不均衡不敏感的模型:采样+集成树模型(树模型按照特征增益递归地划分数据
      2. 采样+集成学习:通过重复组合少数类样本与抽样的同样数量的多数类样本,训练若干的分类器进行集成学习
    • 决策及评估指标
      1. 分类阈值移动,以调整模型对于不同类别偏好的情况
      2. 采用AUC、AUPRC(更优)评估模型表现。AUC的含义是ROC曲线的面积;AUC对样本的正负样本比例情况是不敏感

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

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

相关文章

解决Excel客户端中的Copilot灰色不可用

很多小伙伴已经用上了office套件中的copilot功能 Copilot for Microsoft 365账号介绍与相关问题的解答 Copilot for Microsoft 365账号登录指南 Copilot for Microsoft 365功能使用指南 问题发现 大部分人使用的都是Word和PowerPoint功能,但是也有部分小伙伴使…

Vue项目的快速搭建

Vue项目的快速搭建 一、下载并安装node.js二、安装Vue脚手架三、创建vue项目四、项目启动五、VS Code下载安装 一、下载并安装node.js 首先确保已经安装了Node.js。如果没有安装,可以去官网(https://nodejs.org/)下载并安装最新版本的Node.j…

第16章-DNS

目录 1. 域名 1.1 产生背景 1.2 概述 1.3 域名的树形层次化结构 2. DNS 2.1 概述 2.2 工作机制 3. DNS查询模式 3.1 递归查询: 3.2 迭代查询: 4. 相关知识点 4.1 集中式DNS 4.2 国内通用DNS 4.3 配置DNS代理 1. 域名 1.1 产生背景 ① IP…

rhcsa(rh134)

shell 查看用户shell a、如下查看/etc/shells文件列出了系统上所有可用的 shell(具体的可用的 shell 列表可能会因不同的红帽版本和配置而有所不同) (如下图/etc/shells文件包含/bin/tmux并不意味着tmux是一个shell。实际上,/etc/…

通过多进程并发方式(fork)实现服务器(注意要回收子进程)

以下内容为视频学习记录。 1、父进程accept后返回的文件描述符为cfd以及用于创建连接的lfd; 调用fork()创建子进程后,子进程继承cfd,lfd,通过该cfd与连接过来的客户端通信,lfd对子进程来说没用,可以直接close(lfd); 对于父进程来说&#x…

web基础03-JavaScript

目录 一、JavaScript基础 1.变量 2.输出 3.变量提升 4.区块 5.JavaScript数据类型 6.查看数值类型 7.undefined和null 8.布尔值 9.和的区别 10.算数/三元/比较/逻辑/赋值运算符 11.特殊字符 12.字符串 (1)获取字符串长度 (2&am…

C# Open Vocabulary Object Detection 部署开放域目标检测

目录 介绍 效果 模型信息 owlvit-image.onnx owlvit-post.onnx owlvit-text.onnx 项目 代码 Form1.cs OWLVIT.cs 下载 C# Open Vocabulary Object Detection 部署开放域目标检测 介绍 训练源码地址:https://github.com/google-research/scenic/tree/…

flink重温笔记(九):Flink 高级 API 开发——flink 四大基石之WaterMark(Time为核心)

Flink学习笔记 前言:今天是学习 flink 的第 9 天啦!学习了 flink 四大基石之 Time的应用—> Watermark(水印,也称水位线),主要是解决数据由于网络延迟问题,出现数据乱序或者迟到数据现象&…

九州金榜|导致孩子厌学的家庭因素有哪些?

造成孩子厌学的因素有很多,其中家庭因素是非常重要的因素,而家庭因素造成孩子厌学的原因主要是因为家长在教育中,更多的不懂如何正确教育孩子,就会造成孩子厌学,下面九州金榜家庭教育从以下几个方面分析因为家庭因素造…

C/C++工程师面试题(数据库篇)

索引的优缺点 索引是一种支持快速查找特定行的数据结构,如果没有索引,就需要遍历整个表进行查找。用于提高数据检索的速度和效率。 好处: 提高检索速度: 索引可以加快数据的检索速度,因为它们允许数据库系统直接定位到…

枚举法实例以及试题

题目 1 因子个数 思路: 从因子1找到它本身,其中我们发现因子都是成对出现的,除非它是完全平方数,因此我们采用for循环一个一个找出来就行,查找它因子的个数。 题目 2 阶乘因子 思路: 创建一个【n+1】的数组,初始值全都为0,用来存放它的质数因子个数。用两个for循环,…

mTLS: openssl创建CA证书

证书可以通过openssl或者keytool创建,在本篇文章中,只介绍openssl。 openssl 生成证书 申请操作流程 生成ca证书私钥, 文件名:ca.key生成ca证书,文件名:ca.crt生成Server/Client 证书私钥,文件名&#x…

8、IBOScms代码审计

一、sql注入 1、sql注入(Ⅰ) 限制 rreport/api/getlist {"offset":0,"type":"send","keyword":{"subject":"111) AND (updatexml(1,concat(0x7e,(select user()),0x7e),1))-- qw"}}复现 POST /?rreport/api/…

项目-论坛系统

基于Spring前后端分离版本的论坛系统。 1、构建项目结构 common公共类:统一返回结果、全局变量、异常枚举信息config配置类:Swagger,用于自动生成CRUD和基本对象controller控制器类:用于接受前端信息和控制路由dao数据库访问类&…

uniapp聊天记录本地存储(详细易懂)

目录 目录 1、通过websocket拿取数据 2、获取聊天数据 3、聊天信息存储 、更新 4、读取聊天记录 5、发送信息,信息获取 6、最终效果 1.聊天信息的存储格式 2、样式效果 写聊天项目,使用到了本地存储。需要把聊天信息保存在本地,实时获…

synchrosized 的可重入特性、死锁、哲学家就餐问题以及解决死锁的方法等干货

文章目录 💐synchrosized的可重入特性关于死锁:哲学家就餐问题💡如何避免/解决死锁 💐synchrosized的可重入特性 可重入特性:当一个线程针对一个对象同时加锁多次,不会构成死锁,这样的特性称为…

flynn发布服务小结

背景 flynn是一个基于容器的paas平台,可以快速的发布运行新的应用,用户只需要提交代码到git上,flynn就会基于提交的代码进行发布和部署,本文就简单看下flynn发布部署的流程 flynn发布服务 1.首先flynn会基于用户的web代码构建一…

二叉树的右视图,力扣

目录 题目: 我们直接看题解吧: 快速理解解题思路小建议: 审题目事例提示: 解题方法: 解题分析: 解题思路: 代码实现(DFS): 代码1: 补充说明: 代码2&#xff1…

LeetCode---【链表的操作】

目录 206反转链表【链表结构基础】21合并两个有序链表【递归】我的答案【错误】自己修改【超出时间限制】在官方那里学到的【然后自己复写,错误】对照官方【自己修改】 160相交链表【未理解题目目的】在b站up那里学到的【然后自己复写,错误】【超出时间限制】对照官方【自己修改…

Mybatis插入数据时有外键怎么办?

今天在写代码的时候遇到了一个问题: 比方说我的数据库如下: 其中work_position和auth都是外键,关联了另一张表。 但我现在要往mysql里插入一条数据,如下: insert into t_employee_info(salary, work_time, work_posi…