一、不平衡数据集的定义

所谓的不平衡数据集指的是数据集各个类别的样本量极不均衡。以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下通常情况下把多数类样本的比例接近100:1这种情况下的数据称为不平衡数据。不平衡数据的学习即需要在分布不均匀的数据集中学习到有用的信息。

不平衡数据集的处理方法主要分为两个方面:

1、从数据的角度出发,主要方法为采样,分为欠采样和过采样以及对应的一些改进方法。

2、从算法的角度出发,考虑不同误分类情况代价的差异性对算法进行优化,主要是基于代价敏感学习算法(Cost-Sensitive Learning),代表的算法有adacost;

另外可以将不平衡数据集的问题考虑为一分类(One Class Learning)或者异常检测(Novelty Detection)问题,代表的算法有One-class SVM。

本文主要介绍从数据角度出发的不平衡数据集的处理方法以及对应的python库(imblearn)。

二、从数据角度出发的不平衡数据集的处理方法

2-1、随机采样

2-1-1、朴素随机过采样(上采样)

针对不平衡数据, 最简单的一种方法就是生成少数类的样本, 这其中最基本的一种方法就是: 从少数类的样本中进行随机采样来增加新的样本,对应Python库中函数为RandomOverSampler:

from imblearn.over_sampling

import RandomOverSampler

ros = RandomOverSampler(random_state=0)

X_resampled, y_resampled = ros.fit_sample(X, y)

2-1-2、朴素随机欠采样(下采样)

与过采样相反,欠采样是从多数类样本中随机选择少量样本,再合并原有少数类样本作为新的训练数据集。

随机欠采样有两种类型分别为有放回和无放回两种,无放回欠采样在对多数类某样本被采样后不会再被重复采样,有放回采样则有可能。

对应Python库中函数为RandomUnderSampler,通过设置RandomUnderSampler中的replacement=True参数, 可以实现自助法(boostrap)抽样。

2-1-3、随机采样的优缺点

随机采样最大的优点是简单,但缺点也很明显。上采样后的数据集中会反复出现一些样本,训练出来的模型会有一定的过拟合;而下采样的缺点显而易见,那就是最终的训练集丢失了数据,模型只学到了总体模式的一部分。

上采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点。

为了解决这一问题,可以在每次生成新数据点时加入轻微的随机扰动,经验表明这种做法非常有效,但是这一方式会加重过拟合。

2-2、过采样的改进:SMOTE与ADASYN

相对于采样随机的方法进行过采样, 还有两种比较流行的过采样的改进方式:

(1)、Synthetic Minority Oversampling Technique(SMOTE)

(2)、Adaptive Synthetic (ADASYN)

2-2-1、SMOTE

SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,具体下图所示,算法流程如下:

1、对于少数类中每一个样本x,计算该点与少数类中其他样本点的距离,得到最近的k个近邻(即对少数类点进行KNN算法)。

2、根据样本不平衡比例设置一个采样比例以确定采样倍率,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为x'。

3、对于每一个随机选出的近邻x',分别与原样本按照如下的公式构建新的样本:

xnew=x+rand(0,1) ∗ (x′−x)

但是SMOTE算法缺点也十分明显:一方面是增加了类之间重叠的可能性(由于对每个少数类样本都生成新样本,因此容易发生生成样本重叠(Overlapping)的问题),

另一方面是生成一些没有提供有益信息的样本。

SMOTE算法图

对应Python库中函数为SMOTE:

from imblearn.over_sampling import SMOTE

X_resampled_smote, y_resampled_smote = SMOTE().fit_sample(X, y)

2-2-2、SMOTE的改进:Borderline-SMOTE

Borderline-SMOTE与原始SMOTE不同的地方在于,原始的SMOTE是对所有少数类样本生成新样本。而改进的方法则是先根据规则判断出少数类的边界样本,再对这些样本生成新样本。

判断边界的一个简单的规则为:K近邻中有一半以上多数类样本的少数类为边界样本。直观地讲,只为那些周围大部分是多数类样本的少数类样本生成新样本。

假设a为少数类中的一个样本,此时少数类的样本分为三类,如下图所示:

(i) 噪音样本(noise), 该少数类的所有最近邻样本都来自于不同于样本a的其他类别:

(ii) 危险样本(in danger), 至少一半的最近邻样本来自于同一类(不同于a的类别);

(iii) 安全样本(safe), 所有的最近邻样本都来自于同一个类。

Borderline-SMOTE算法

对应的Python库中的实现有三种可以选择的规则:

SMOTE函数中的kind参数控制了选择哪种规则:

borderline1:最近邻中的随机样本与该少数类样本a来自于不同的类;

borderline2:最近邻中的随机样本可以是属于任何一个类的样本;

svm:使用支持向量机分类器产生支持向量然后再生成新的少数类样本。

具体实现如下:

from imblearn.under_sampling

import ClusterCentroids

cc = ClusterCentroids(random_state=0)

X_resampled, y_resampled = cc.fit_sample(X, y)

2-2-3、ADASYN

这种改进方法的主要思想是根据数据分布情况为不同的少数类样本生成不同数量的新样本。首先根据最终的平衡程度设定总共需要生成的新少数类样本数量 ,然后为每个少数类样本x计算分布比例。

对应Python库中函数为ADASYN:

from imblearn.over_sampling import ADASYN

X_resampled_adasyn, y_resampled_adasyn = ADASYN().fit_sample(X, y)

2-2-4、基于聚类的过采样方法

以二分类为例,该方法是首先分别对正负例进行聚类,在聚类之后进行再进行上述的过采样方法。例如:有一个二分类数据集,其正负类比例为:1000:50。首先通过kmeans算法对正负类分别聚类,

得到正类:600,300,100;负类:30,20。然后使用过采样的方法分别对所有类别进行过采样得到正类:600,600,600;对于负类的上采样个数为:(600+600+600)/2 = 900,即负类为:900,900。

最终得到的数据集为正类1800,负类1800。基于聚类的过采样方法的优点是不仅可以解决类间不平衡问题,而且还能解决类内部不平衡问题。

2-3、欠采样的改进:EasyEnsemble、BalanceCascade与NearMiss

随机欠采样的问题主要是信息丢失,为了解决信息丢失的问题提出了以下几种改进的方式:

1、EasyEnsemble,利用模型融合的方法(Ensemble):

多次过采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。简单的最佳实践是建立n个模型,每个模型使用少数类的所有样本和多数类的n个不同样本。假设二分类数据集的正负类比例为50000:1000,最后要得到10个模型,那么将保留负类的1000个样本,并随机采样得到10000个正类样本。

然后,将10000个样本成10份,每一份与负类样本组合得到新的子训练集,训练10个不同的模型。

2、BalanceCascade,利用增量训练的思想(Boosting):

先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的多数类样本不放回,然后对这个更小的多数类样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。

3、NearMiss,利用KNN试图挑选那些最具代表性的多数类样本:

首先计算出每个样本点之间的距离,通过一定规则来选取保留的多数类样本点。因此该方法的计算量通常很大。

2-3-1、上述方法的Python实现

EasyEnsemble:

EasyEnsemble方法对应Python库中函数为EasyEnsemble,有两个很重要的参数: (i) n_subsets控制的是子集的个数 ;(ii) replacement决定是有放回还是无放回的随机采样。

from imblearn.ensemble

import EasyEnsemble

ee = EasyEnsemble(random_state=0, n_subsets=10)

X_resampled, y_resampled = ee.fit_sample(X, y)

BalanceCascade:

BalanceCascade方法对应Python库中函数为BalanceCascade,有三个很重要的参数: (i) estimator是选择使用的分类器;(ii) n_max_subset控制的是子集的个数;(iii)  bootstrap决定是有放回还是无放回的随机采样。

from imblearn.ensemble

import BalanceCascade

from sklearn.linear_model

import LogisticRegression

bc = BalanceCascade(random_state=0,

estimator=LogisticRegression(random_state=0),

n_max_subset=4)

X_resampled, y_resampled = bc.fit_sample(X, y)

NearMiss:

NearMiss方法对应Python库中函数为NearMiss,通过version来选择使用的规则:

NearMiss-1:选择离N个近邻的负样本的平均距离最小的正样本;

NearMiss-2:选择离N个负样本最远的平均距离最小的正样本;

NearMiss-3:是一个两段式的算法。 首先,对于每一个负样本, 保留它们的M个近邻样本;接着, 那些到N个近邻样本平均距离最大的正样本将被选择。

from imblearn.under_sampling

import NearMiss nm1 = NearMiss(random_state=0, version=1)

X_resampled_nm1, y_resampled = nm1.fit_sample(X, y)

所有方法的简单实验效果可以见:不平衡数据分类算法介绍与比较

2-4、不平衡问题其他的处理方式

除了上述提到的过采样与欠采样的方法之外,还可以将多种方法进行组合使用。

另外还可以通过为不同的样本点赋予不同的权重的方式来处理不平衡问题(与改进损失函数的方式有所类似)。

在算法层面除了对算法本身的改进之外,还需要关注模型的评价指标,来确认使用的方法是否有效。

个人实践发现,组合方法的结果会比单一某种方法会好很多,例如SMOTEENN和SMOTETomek。

参考文献:

python 过采样 权重实现_不平衡数据集的处理 - osc_sqq5osi1的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. python编程代码执行漏洞_代码执行漏洞 - 安全先师的个人空间 - OSCHINA - 中文开源技术交流社区...

    0x00 前言 最近发现的一个新站,不妨试试手. 0x01 基础信息 漏洞点:tp5 method 代码执行,payload如下 POST /?s=captcha_method=__construct ...

  2. python 加权随机算法_加权随机算法 - 飞儿飞的个人空间 - OSCHINA - 中文开源技术交流社区...

    加权随机算法一般应用在以下场景:有一个集合S,里面比如有A,B,C,D这四项.这时我们想随机从中抽取一项,但是抽取的概率不同,比如我们希望抽到A的概率是50%,抽到B和C的概率是20%,D的概率是10 ...

  3. python倒排索引实现_倒排索引原理和实现 - uncle_LLD的个人空间 - OSCHINA - 中文开源技术交流社区...

    关于倒排索引 搜索引擎通常检索的场景是:给定几个关键词,找出包含关键词的文档.怎么快速找到包含某个关键词的文档就成为搜索的关键.这里我们借助单词--文档矩阵模型,通过这个模型我们可以很方便知道某篇文档 ...

  4. python读写磁盘扇区数据有什么用_磁盘存放数据原理 - osc_v8xs2czi的个人空间 - OSCHINA - 中文开源技术交流社区...

    磁盘结构作用数据原理 拓扑图 盘面(side) 模型: 1.磁盘圆形盘面,一个磁盘内含有多个盘面. 2.层叠关系,每个盘面之间不会贴着. 3.第一个盘的正面成为0面,反面为1面:第二个盘正面为2面,反 ...

  5. python编程题说句心里话_说句心里话 A - osc_6kxooi0n的个人空间 - OSCHINA - 中文开源技术交流社区...

    说句心里话 A ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬ ...

  6. 利用mysql建立随机森林_随机森林算法实例 - osc_4imme0wh的个人空间 - OSCHINA - 中文开源技术交流社区...

    根据成年人数据集来预测一个人的收入 1.准备数据集 我下载好了一个成年人数据集,从百度云下载 链接:https://pan.baidu.com/s/10gC8U0tyh1ERxLhtY8i0bQ 提取 ...

  7. python变量无需指定类型对吗_Python变量类型 - osc_3rgq3dae的个人空间 - OSCHINA - 中文开源技术交流社区...

    变量存储在内存中的值,这就意味着在创建变量时会在内存开辟一个空间. 基于变量的数据类型,解析器会分配指定内存,并决定什么数据可以被存储在内存中. 因此变量可以指定不同的数据类型,这些变量可以存储整数. ...

  8. flutter 刷脸_支付宝刷脸认证 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    去支付宝下载sdk  这里引用我就不多说了 Loader::import('ali.wappay.service.AlipayTradeService',EXTEND_PATH,'.php'); Lo ...

  9. python生成日历书上哪里错了_python生成日历 - osc_a5pzxo31的个人空间 - OSCHINA - 中文开源技术交流社区...

    日历是以1900年1月1日 为基础的 那天的星期1是 # 判断是否是闰年 def rn(i): # 判断是不是闰年 if (i % 400 == 0) or (i % 4 == 0 and i % 1 ...

最新文章

  1. linux钟java运行命令,在java中运行linux命令
  2. c++刷题(18/100)树
  3. python中StringIO和BytesIO
  4. zabbix 3.0.7 for Centos 7.2 安装
  5. Chromeedge好用扩展插件分享
  6. unity 彩带粒子_随机四处散发的粒子光带效果unity3d源码下载!Unity3D Particle Ribbon粒子带源码下载...
  7. 域名前缀和后缀html,域名常用前缀和后缀
  8. htpasswd小工具生成密码
  9. 简单系统U盘制作 / 安装系统
  10. 工欲善其事必先利其器
  11. 监督学习、无监督学习、半监督学习和强化学习
  12. 中文分词后去除停用词
  13. edge扩展下载失败解决办法
  14. KETTLE8.2在linux(rehl)6.6中安装部署并配置公共数据库链接
  15. 5G时代,云计算发展的五大新趋势
  16. 1BIT,1BYTE,1KB,1MB,1GB,1TB等计量单位换算
  17. 范德堡大学计算机,范德堡大学计算机专业博士成功申请案例
  18. Linux 音频驱动(三) ASoC音频驱动之Codec驱动
  19. 62%中国AI毕业生赴美,机器学习人才最高产大学出炉
  20. 2022-09-08 mysql/stonedb-慢SQL-记录

热门文章

  1. 技术前沿与经典文章15:历史上54位伟大物理学家、科学家的专属LOGO(一)
  2. Ansible自动化运维的安装及常用模块详解
  3. 三个维度拆解国货品牌的爆款逻辑!
  4. 2022年最新的Android面试大厂必考174题(附带详细答案)
  5. 零基础入门黑客教程(普通人成为黑客的10个步骤)
  6. 山西经济林栽培技术章节考试题
  7. 全球及中国半导体环氧模塑料产业前景预测及供需分析报告2021~2026年
  8. oracle客户端怎么变成中文,如何让Oracle客户端显示中文
  9. 星座高考成绩查询2021,2021年能金榜题名的星座,2021年学业运势旺盛的星座
  10. 亚马逊ERP系统是什么?他有什么用