类不平衡问题与SMOTE过采样算法

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

什么是类不平衡问题

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

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

为什么类不平衡是不好的

从模型的训练过程来看

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

取经验风险(模型在训练集上的平均损失)作为目标函数,那么模型的学习准则就是最小化经验风险。考虑最极端的情况:1000个训练样本中,正类样本999个,负类样本1个。某次迭代结束后,模型把所有的样本都分为正类,虽然分错了这个负类,但是所带来的损失实在微不足道,因为目标函数的值已经很小了。

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

从模型的预测过程来看

考虑二项逻辑斯蒂回归(Logistic Regression)模型。输入一个样本 $i$ ,模型输出的是其属于正类的概率 $y_i$ 。当 $y_i>0.5$ 时,模型判定该样本属于正类,否则就是属于反类。

为什么是 $0.5$ 呢?

首先,模型在做出决策时,当然要基于真实样本总体的正负类样本分布:设任意一个样本属于正类的概率是 $\theta$ (等于正类样本数除以全部样本数),如果模型给出的样本属于正类的概率 $y_i>\theta$ ,那么就判定这个样本属于正类。

虽然我们无法获悉真实样本总体,但之于训练集,存在这样一个假设:训练集是真实样本总体的无偏采样。正是因为这个假设,所以认为训练集的正负样本比例$\dfrac{\hat\theta}{1-\hat\theta}$就是真实样本总体的正负样本比例 $\dfrac{\theta}{1-\theta}$ 。

所以当训练集的正、负类样本比例大约是 $1:1$ 时,模型认为:真实样本总体的正、负类样本比例也大约是 $1:1$ 。此时,当然要取 $\theta=0.5$ 。

当训练集存在类不平衡时,比如说正、负类样本比例为 $9:1$ ,这个 $0.5$ 就不合适了。

几种解决方案

目前主要有三种办法:

1. 调整 $\theta$ 值

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

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

2. 过采样

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

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

3. 欠采样

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

SMOTE过采样算法

  JAIR‘2002的文章《SMOTE: Synthetic Minority Over-sampling Technique》详细阐述了该算法。概括来说,本算法基于“插值”来为少数类合成新的样本。下面介绍如何合成新的样本。

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

考虑该少数类的一个样本 $i$ ,其特征向量为 $\boldsymbol x_i,i\in{1,...,T}$ :

1. 首先从该少数类的全部 $T$ 个样本中找到样本 $\boldsymbol x_i$ 的 $k$ 个近邻(例如用欧式距离),记为 $\boldsymbol x_{i(near)},near\in{1,...,k}$ ;

2. 然后从这 $k$ 个近邻中随机选择一个样本 $\boldsymbol x_{i(nn)}$ ,再生成一个 $0$ 到 $1$ 之间的随机数 $\zeta_1$ ,从而合成一个新样本 $\boldsymbol x_{i1}$ :

$$\boldsymbol x_{i1}=\boldsymbol x_i+\zeta_1\cdot (\boldsymbol x_{i(nn)}−\boldsymbol x_i)$$

3. 将步骤2重复进行 $N$ 次,从而可以合成 $N$ 个新样本:$\boldsymbol x_{inew},new\in{1,...,N}$。

那么,对全部的 $T$ 个少数类样本进行上述操作,便可为该少数类合成 $NT$ 个新样本。如果样本的特征维数是 $2$ 维,那么每个样本都可以用二维平面上的一个点来表示。SMOTE算法所合成出的一个新样本 $\boldsymbol x_{i1}$ 相当于是表示样本 $\boldsymbol x_i$ 的点和表示样本 $\boldsymbol x_{i(nn)}$ 的点之间所连线段上的一个点。所以说该算法是基于“插值”来合成新样本。  

主要参考资料:

《机器学习》,周志华

《SMOTE: Synthetic Minority Over-sampling Technique》,JAIR‘2002

时间: 2024-11-04 16:26:47

类不平衡问题与SMOTE过采样算法的相关文章

过采样算法之SMOTE

SMOTE(Synthetic Minority Oversampling Technique),合成少数类过采样技术.它是基于随机过采样算法的一种改进方案,由于随机过采样采取简单复制样本的策略来增加少数类样本,这样容易产生模型过拟合的问题,即使得模型学习到的信息过于特别(Specific)而不够泛化(General),SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,具体如下图所示,算法流程如下. (1)对于少数类中每一个样本x,以欧氏距离为标准计算它

spark实现smote近邻采样

一.smote相关理论 (1). SMOTE是一种对普通过采样(oversampling)的一个改良.普通的过采样会使得训练集中有很多重复的样本. SMOTE的全称是Synthetic Minority Over-Sampling Technique,译为“人工少数类过采样法”. SMOTE没有直接对少数类进行重采样,而是设计了算法来人工合成一些新的少数类的样本. 为了叙述方便,就假设阳性为少数类,阴性为多数类 合成新少数类的阳性样本的算法如下: 选定一个阳性样本ss 找到ss最近的kk个样本,

【机器学习算法-python实现】采样算法的简单实现

1.背景 采样算法是机器学习中比较常用,也比较容易实现的(出去分层采样).常用的采样算法有以下几种(来自百度知道): 一.单纯随机抽样(simple random sampling) 将调查总体全部观察单位编号,再用抽签法或随机数字表随机抽取部分观察单位组成样本. 优点:操作简单,均数.率及相应的标准误计算简单. 缺点:总体较大时,难以一一编号. 二.系统抽样(systematic sampling) 又称机械抽样.等距抽样,即先将总体的观察单位按某一顺序号分成n个部分,再从第一部分随机抽取第k

马尔科夫链与蒙特卡洛方法采样算法

马尔科夫链 http://wenku.baidu.com/link?url=26MSlOhtBMPQJz3ta2p3bM6IMdLsvvHQ2mzw8AI2GcSdZAI7Ukdf1rl4KR6VUojnuutXwU5EqHNv-V0acHQn1PlkoyYT0j7DrVRWskg_Kr7&pn=50 蒙特卡洛采样算法 http://cos.name/2013/01/lda-math-mcmc-and-gibbs-sampling/ http://imbinwang.github.io/blog

java笔记--超级类Object多线程的应用+哲学家进餐算法内部类与多线程结合

关于Object类中的线程方法: Object类是所有Java类的 父类,在该类中定义了三个与线程操作有关的方法,使得所有的Java类在创建之后就支持多线程 这三个方法是:notify(),notifyAll(),wait(),这几个方法都是用来控制线程的运行状态的. 方法列表如下: notify() : 唤醒在此对象监视器上等待的单个线程 notifyAll() : 唤醒在此对象监视器上等待的所有线程 wait() : 在其他线程时调用此对象的notify()或者notifyAll()方法前,

机器学习-加权采样算法简介

场景用户画像的构造中,想象一个场景:你经过辛辛苦苦抓数据,清洗数据,收集用户行为,目的就是给用户计算兴趣标签. 这时候你可能会遇到一个两难的问题:如果给用户计算出兴趣标签的权重了,那应该保留多少标签呢?保留太多的话,每次召回候选集时,计算复杂度可不低,只保留少部分吧,那真是手心手背都是肉,生怕丢弃的标签才是用户的真爱. 怎么办?这时候,你需要的一个简单的加权采样算法,每次召回时并不使用全部用户标签,而是按照权重采样一部分标签来使用,这样做的好处当然很明显: 大大减少召回时的计算复杂度:可以保留更

文本主题模型之LDA(二) LDA求解之Gibbs采样算法

本文是LDA主题模型的第二篇,读这一篇之前建议先读文本主题模型之LDA(一) LDA基础,同时由于使用了基于MCMC的Gibbs采样算法,如果你对MCMC和Gibbs采样不熟悉,建议阅读之前写的MCMC系列MCMC(四)Gibbs采样. 1. Gibbs采样算法求解LDA的思路 首先,回顾LDA的模型图如下: 在Gibbs采样算法求解LDA的方法中,我们的α,ηα,η是已知的先验输入,我们的目标是得到各个zdn,wknzdn,wkn对应的整体z? ,w? z→,w→的概率分布,即文档主题的分布和

离散采样算法---Alias采样方法

应用场景:比如一个随机事件包含4种情况,每种情况发生的概率分别为:$\frac{1}{2},\frac{1}{3},\frac{1}{12},\frac{1}{12}$,怎么产生符合这个概率的采样方法? 解决方法:Alias算法,O(1) 参考链接: [1]中文:[数学]时间复杂度O(1)的离散采样算法—— Alias method/别名采样方法 [2]英文:Darts, Dice, and Coins: Sampling from a Discrete Distribution 原文地址:ht

分层贝叶斯模型——采样算法

1. 蒙特卡洛估计 若$\theta$是要估计的参数,$y_{1},...,y_{n}$是从分布$p(y_{1},...,y_{n}|\theta) $中采样的样本值,假定我们从后验分布$p(\theta|y_{1},...,y_{n})$中独立随机采样$S$个$\theta$值,则$$ \theta^{(1)},...,\theta^{(S)}\sim^{i.i.d.}p(\theta|y_{1},...,y_{n}) $$ 那么我们就能够通过样本$\{\theta^{(1)},...,\th