机器学习 —— 类不平衡问题与SMOTE过采样算法

2023-11-15

    在前段时间做本科毕业设计的时候,遇到了各个类别的样本量分布不均的问题——某些类别的样本数量极多,而有些类别的样本数量极少,也就是所谓的类不平衡(class-imbalance)问题。

      本篇简述了以下内容:

      什么是类不平衡问题

      为什么类不平衡是不好的

      几种解决方案

      SMOTE过采样算法

      进一步阅读

什么是类不平衡问题

      类不平衡(class-imbalance)是指在训练分类器中所使用的训练集的类别分布不均。比如说一个二分类问题,1000个训练样本,比较理想的情况是正类、负类样本的数量相差不多;而如果正类样本有995个、负类样本仅5个,就意味着存在类不平衡。

      在后文中,把样本数量过少的类别称为“少数类”。

      但实际上,数据集上的类不平衡到底有没有达到需要特殊处理的程度,还要看不处理时训练出来的模型在验证集上的效果。有些时候是没必要处理的。

为什么类不平衡是不好的

从模型的训练过程来看

      从训练模型的角度来说,如果某类的样本数量很少,那么这个类别所提供的“信息”就太少。

      使用经验风险(模型在训练集上的平均损失)最小化作为模型的学习准则。设损失函数为0-1 loss(这是一种典型的均等代价的损失函数),那么优化目标就等价于错误率最小化(也就是accuracy最大化)。考虑极端情况:1000个训练样本中,正类样本999个,负类样本1个。训练过程中在某次迭代结束后,模型把所有的样本都分为正类,虽然分错了这个负类,但是所带来的损失实在微不足道,accuracy已经是99.9%,于是满足停机条件或者达到最大迭代次数之后自然没必要再优化下去,ok,到此为止,训练结束!于是这个模型……

      模型没有学习到如何去判别出少数类。

从模型的预测过程来看

      考虑二项Logistic回归模型。输入一个样本 xx ,模型输出的是其属于正类的概率 y^y^ 。当 y^>0.5y^>0.5 时,模型判定该样本属于正类,否则就是属于反类。

      为什么是0.5呢?可以认为模型是出于最大后验概率决策的角度考虑的,选择了0.5意味着当模型估计的样本属于正类的后验概率要大于样本属于负类的后验概率时就将样本判为正类。但实际上,这个后验概率的估计值是否准确呢?

      从几率(odds)的角度考虑:几率表达的是样本属于正类的可能性与属于负类的可能性的比值。模型对于样本的预测几率为 y^1−y^y^1−y^ 。

      模型在做出决策时,当然希望能够遵循真实样本总体的正负类样本分布:设 θθ 等于正类样本数除以全部样本数,那么样本的真实几率为 θ1−θθ1−θ 。当观测几率大于真实几率时,也就是 y^>θy^>θ 时,那么就判定这个样本属于正类。

      虽然我们无法获悉真实样本总体,但之于训练集,存在这样一个假设:训练集是真实样本总体的无偏采样。正是因为这个假设,所以认为训练集的观测几率 θ^1−θ^θ^1−θ^ 就代表了真实几率 θ1−θθ1−θ 。

      所以,在这个假设下,当一个样本的预测几率大于观测几率时,就应该将样本判断为正类。

几种解决方案

      目前主要有三种办法:

      1. 调整 θθ 值

      根据训练集的正负样本比例,调整 θθ 值。   

      这样做的依据是上面所述的对训练集的假设。但在给定任务中,这个假设是否成立,还有待讨论。

      2. 过采样

      对训练集里面样本数量较少的类别(少数类)进行过采样,合成新的样本来缓解类不平衡。

      下面将介绍一种经典的过采样算法:SMOTE。

      3. 欠采样

      对训练集里面样本数量较多的类别(多数类)进行欠采样,抛弃一些样本来缓解类不平衡。

SMOTE过采样算法

  JAIR'2002的文章《SMOTE: Synthetic Minority Over-sampling Technique》提出了一种过采样算法SMOTE。概括来说,本算法基于“插值”来为少数类合成新的样本。下面介绍如何合成新的样本。

        设训练集的一个少数类的样本数为 TT ,那么SMOTE算法将为这个少数类合成 NTNT 个新样本。这里要求 NN 必须是正整数,如果给定的 N<1N<1 那么算法将“认为”少数类的样本数 T=NTT=NT ,并将强制 N=1N=1 。

      考虑该少数类的一个样本 ii ,其特征向量为 xi,i∈{1,...,T}xi,i∈{1,...,T} :

      1. 首先从该少数类的全部 TT 个样本中找到样本 xixi 的 kk 个近邻(例如用欧氏距离),记为 xi(near),near∈{1,...,k}xi(near),near∈{1,...,k} ;

      2. 然后从这 kk 个近邻中随机选择一个样本 xi(nn)xi(nn) ,再生成一个 00 到 11 之间的随机数ζ1ζ1 ,从而合成一个新样本 xi1xi1 :

 

xi1=xi+ζ1⋅(xi(nn)−xi)xi1=xi+ζ1⋅(xi(nn)−xi)

      3. 将步骤2重复进行 NN 次,从而可以合成 NN 个新样本:xinew,new∈1,...,Nxinew,new∈1,...,N。

      那么,对全部的 TT 个少数类样本进行上述操作,便可为该少数类合成 NTNT 个新样本。

      如果样本的特征维数是 22 维,那么每个样本都可以用二维平面上的一个点来表示。SMOTE算法所合成出的一个新样本 xi1xi1 相当于是表示样本 xixi 的点和表示样本 xi(nn)xi(nn) 的点之间所连线段上的一个点。所以说该算法是基于“插值”来合成新样本。

进一步阅读

      有两篇翻译自国外博客的文章:

      解决真实世界问题:如何在不平衡类上使用机器学习?

      从重采样到数据合成:如何处理机器学习中的不平衡分类问题?

可以先读中文的了解一下说了哪些事情,如果感兴趣的话就去看英文原文来深入学习。  

 

参考:

《机器学习》,周志华

SMOTE: Synthetic Minority Over-sampling Technique,JAIR'2002

对于原创博文:如需转载请注明出处http://www.cnblogs.com/Determined22/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习 —— 类不平衡问题与SMOTE过采样算法 的相关文章

随机推荐

  • 生成项目树形结构

    当你写博客或者项目描述的时候 想要展示项目的树形结构 怎么办呢 手写 程序员是不可能手写的 win R输入cmd进入dos 输入命令 tree 项目根目录 gt 生成的树形结构文件保存地址 比如 tree E workspace flink
  • ORB-SLAM2:基于可识别特征的自主导航与地图构建

    目录 ORB SLAM2 基于可识别特征的自主导航与地图构建 简介 地图 A 地图特征点或3D ORB B 关键帧 C 可视化图像 位置识别 A 图像识别数据库 B 高效优化的ORB匹配 C 视觉一致性 自主导航追踪 A ORB特征获取 B
  • Vue中使用element-ui使用表单提交时间

    在Vue中使用element ui组件的表单提交 想要上传笔记创建的时间 出现的问题 element ui的源码
  • SQLPub免费的MySQL数据库

    SQLPub免费的MySQL数据库 提供最新版本 甚至是开发者版本的 MySQL 服务器测试服务 您可以轻易地 注册免费账号 测试您的应用 例如 您可以测试在MySQL版本升级后您的应用是否依然能够正常运行 sqlpub com 也是让您学
  • javaWeb数据库连接池,过滤器和监听器

    数据库连接池 JDBC 1 什么是数据库连接池 是一个数据库的工具 能够分配 管理和释放数据库连接 它允许应用程序重复使用一个现有的数据库连接 而不是再重新建立一个 常见数据库连接池 C3P0 是一个开放源代码的JDBC连接池 它在lib目
  • sd模型分类

    标题模型主要分为四类 Checkpoint LoRA Textual Inversion Hypernetwork 分别对应 4 种不同的训练方式 Checkpoint 通过 Dreambooth 训练方式得到的大模型 特点是出图效果好 但
  • 【MySQL】使用Visio绘制E-R图

    使用Visio绘制E R图 1 创建项目 文件 新建 常规 基本框图 2 调整页面方向 纵向或横向 文件 页面设置 3 准备E R图的三个基本形状 实体用矩形 关系用菱形 属性用椭圆 4 绘制E R图 双击形状后可以在形状中编辑文字 通过绘
  • Cursor!!!GPT-4帮我写代码

    首先介绍一款产品 cursor 官网 https www cursor so IDE作者 https twitter com amanrsanger 目前为止应该是第一个免费能够使用GPT4工作的软件 看作者的Twitter 他说自己提前向
  • 由于找不到d3dx9_43.dll无法继续执行此代码怎么修复?这个三个方法可以解决问题

    在运行游戏 软件的时候 计算机提示 由于找不到d3dx9 43 dll无法继续执行此代码 是怎么回事 其实d3dx9 43 dll是Windows操作系统下的DirectX9的一个组件 而DirectX是Windows系统支持游戏和显卡游戏
  • 【Spring Boot 源码学习】OnClassCondition 详解

    Spring Boot 源码学习系列 OnClassCondition 详解 引言 往期内容 主要内容 1 getOutcomes 方法 2 多处理器拆分处理 3 StandardOutcomesResolver 内部类 4 getMatc
  • linux tmux的经验总结

    背景 主要操作实现 安装 概念了解 快捷键 tmux重启后恢复终端layout界面的方法 如果有多个用户比如adminqilei等 新建windows或者pane分屏保留目录路径 复制模式 支持鼠标模式 窗口列表居中否则session和wi
  • 9大最佳知识库软件/文档管理工具

    企业的任何工作流程都离不开文档管理 面对复杂的业务流程 频繁的文档编辑任务和跨区域的文件共享需求 优秀的文档管理体系能够帮助企业实现安全的文档存储 高效的文档搜索 便捷的文档协作和有效的文档权限 版本 行为管控 由于各个产品切入文档管理市场
  • windows下安装cygwin+swoole教程

    swoole下载 http git oschina net swoole swoole cygwin下载 https www cygwin com setup x86 64 exe cygwin镜像地址 http mirrors sohu
  • 如何拯救空间不足的C盘?

    目录 操作步骤 确定软件后期安装的位置 修改注册表 验证 心得 操作步骤 确定软件后期安装的位置 建议选择硬盘内存比较多的一个盘 我选择的是D盘 然后复制D programs 修改注册表 打开注册表编辑器 双击HKEY LOCAL MACH
  • JS操作dom,bom

    属性是 方法里面是可以写参数的 window open 打开窗口 p1 要打开的新窗口地址 p2 窗口名称 p3 窗口特征 open newwindow html width 400px height 400px close 关闭窗口 al
  • STM32外部高速晶振不起振的故障分析

    STM32外部高速晶振不起振的故障分析 一 故障背景 网上售卖的STM32F103C8T6的核心板如图1所示 由于STM32F103C8T6最小系统核心板的采购成本高达20元 块至40元 块 为了降低采购成本 对其STM32F103C8T6
  • oracle sqlldr详解,sqlldr详解

    Oracle 的SQL LOADER可以将外部数据加载到数据库表中 下面是SQL LOADER的基本特点 1 能装入不同数据类型文件及多个数据文件的数据 2 可装入固定格式 自由定界以及可度长格式的数据 3 可以装入二进制 压缩十进制数据
  • codeblocks安装及使用教程详解

    一 官网下载 搜索codeblocks官网 下载最新codeblocks安装包 codeblocks官网 https www codeblocks org downloads 二 安装 1 双击下载好的安装文件 弹出如下界面 点击 Next
  • matlab dct实现代码,基于DCT数字水印算法的Matlab实现源代码

    M 256 原图像长度 N 32 水印图像长度 K 8 I zeros M M II zeros K K B zeros M M Idct zeros K K D zeros M M 读取原图像 I imread 33 png subplo
  • 机器学习 —— 类不平衡问题与SMOTE过采样算法

    在前段时间做本科毕业设计的时候 遇到了各个类别的样本量分布不均的问题 某些类别的样本数量极多 而有些类别的样本数量极少 也就是所谓的类不平衡 class imbalance 问题 本篇简述了以下内容 什么是类不平衡问题 为什么类不平衡是不好