不平衡数据在金融风控、反欺诈、广告推荐和医疗诊断中普遍存在。通常而言,不平衡数据正负样本的比例差异极大,如在Kaggle竞赛中的桑坦德银行交易预测和IEEE-CIS欺诈检测数据。对模型而言,不均衡数据构建的模型会更愿意偏向于多类别样本的标签,实际应用价值较低,如下图所示,为在不均衡数据下模型预测的概率分布。

  不平衡数据的处理方法,常见方法有欠采样(under-sampling)和过采样(over-sampling)、在算法中增加不同类别的误分代价等方法。其中,过采样中的SMTOE、Borderline SMOTE和ADASYN是实现简单且常见的处理方法。

1 SMOTE

  论文地址:http://xueshu.baidu.com/usercenter/paper/show?paperid=28300870422e64fd0ac338860cd0010a&site=xueshu_se
  SMOTE(Synthetic Minority Oversampling Technique)合成少数类过采样技术,是在随机采样的基础上改进的一种过采样算法。实现过程如下图所示:

  首先,从少数类样本中选取一个样本xi。其次,按采样倍率N,从xi的K近邻中随机选择N个样本xzi。最后,依次在xzi和xi之间随机合成新样本,合成公式如下:

x n = x i + β × ( x z i − x i ) x_{n}=x_{i}+\beta\times \left ( x_{zi} -x_{i} \right ) xn​=xi​+β×(xzi​−xi​)

  SMOTE实现简单,但其弊端也很明显,由于SMOTE对所有少数类样本一视同仁,并未考虑近邻样本的类别信息,往往出现样本混叠现象,导致分类效果不佳。

SMOTE Python使用
  Python库中Imblearn是专门用于处理不平衡数据,imblearn库包含了SMOTE、SMOTEENN、ADASYN和KMeansSMOTE等算法。以下是SMOTE在Imblearn中使用的案例。

from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE
X, y = make_classification(n_classes=2, class_sep=2,weights=[0.1, 0.9], n_informative=2, n_redundant=0, flip_y=0,n_features=2, n_clusters_per_class=1, n_samples=100,random_state=10)
print('Original dataset shape %s' % Counter(y))sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X, y)
print('Resampled dataset shape %s' % Counter(y_res))

SMOTE采样前后对比

2 Borderline SMOTE

  论文地址:https://sci2s.ugr.es/keel/keel-dataset/pdfs/2005-Han-LNCS.pdf
  Borderline SMOTE是在SMOTE基础上改进的过采样算法,该算法仅使用边界上的少数类样本来合成新样本,从而改善样本的类别分布。
  Borderline SMOTE采样过程是将少数类样本分为3类,分别为SafeDangerNoise,具体说明如下。最后,仅对表为Danger的少数类样本过采样。
  Safe,样本周围一半以上均为少数类样本,如图中点A
  Danger:样本周围一半以上均为多数类样本,视为在边界上的样本,如图中点B
  Noise:样本周围均为多数类样本,视为噪音,如图中点C

  Borderline-SMOTE又可分为Borderline-SMOTE1和Borderline-SMOTE2,Borderline-SMOTE1在对Danger点生成新样本时,在K近邻随机选择少数类样本(与SMOTE相同),Borderline-SMOTE2则是在k近邻中的任意一个样本(不关注样本类别)

Borderline-SMOTE Python使用

from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import BorderlineSMOTE
X, y = make_classification(n_classes=2, class_sep=2,weights=[0.1, 0.9], n_informative=2, n_redundant=0, flip_y=0,n_features=2, n_clusters_per_class=1, n_samples=100, random_state=9)
print('Original dataset shape %s' % Counter(y))
sm = BorderlineSMOTE(random_state=42,kind="borderline-1")
X_res, y_res = sm.fit_resample(X, y)
print('Resampled dataset shape %s' % Counter(y_res))

Borderline SMOTE 采样前后对比

3 ADASYN

  论文地址:https://sci2s.ugr.es/keel/pdf/algorithm/congreso/2008-He-ieee.pdf
  ADASYN (adaptive synthetic sampling)自适应合成抽样,与Borderline SMOTE相似,对不同的少数类样本赋予不同的权重,从而生成不同数量的样本。具体流程如下:

  步骤1:计算需要合成的样本数量,公式如下:

G = ( m l − m s ) × β G=\left ( m_{l}-m_{s} \right )\times \beta G=(ml​−ms​)×β

  其中,ml为多数类样本数量,ms为少数类样本数量,β∈[0,1]随机数,若β等于1,采样后正负比例为1:1。
  步骤2:计算K近邻中多数类占比,公式如下:

r i = Δ i / K r_{i}=\Delta _{i}/K ri​=Δi​/K

  其中,∆i为K近邻中多数类样本数,i = 1,2,3,……,ms
  步骤3:对ri标准化,公式如下:

r ^ i = r i / ∑ i = 1 m s r i \hat{r}_{i}=r_{i}/\sum_{i=1}^{m_{s}}r_{i} r^i​=ri​/i=1∑ms​​ri​

  步骤4:根据样本权重,计算每个少数类样本需生成新样本的数目,公式如下:

g = r ^ i × G g=\hat{r}_{i}\times G g=r^i​×G

  步骤5:根据g计算每个少数样本需生成的数目,根据SMOTE算法生成样本,公式如下:

s i = x i + ( x z i − x i ) × λ s_{i}=x_{i}+\left ( x_{zi}-x_{i} \right )\times \lambda si​=xi​+(xzi​−xi​)×λ

  其中,si为合成样本,xi是少数类样本中第i个样本,xzi是xi的K近邻中随机选取一个少数类样本 λ∈[0,1]的随机数。

ADASYN Python使用

from collections import Counter
from sklearn.datasets import make_classification
from imblearn.over_sampling import ADASYN
X, y = make_classification(n_classes=2, class_sep=2,weights=[0.1, 0.9], n_informative=3, n_redundant=1, flip_y=0,n_features=20, n_clusters_per_class=1, n_samples=1000,random_state=10)
print('Original dataset shape %s' % Counter(y))
ada = ADASYN(random_state=42)
X_res, y_res = ada.fit_resample(X, y)
print('Resampled dataset shape %s' % Counter(y_res))

ADASYN 采样前后对比

不平衡数据处理之SMOTE、Borderline SMOTE和ADASYN详解及Python使用相关推荐

  1. c++ map用法_Pandas数据处理三板斧——map、apply、applymap详解

    在日常的数据处理中,经常会对一个DataFrame进行逐行.逐列和逐元素的操作,对应这些操作,Pandas中的map.apply和applymap可以解决绝大部分这样的数据处理需求.这篇文章就以案例附 ...

  2. Pandas教程 | 数据处理三板斧——map、apply、applymap详解

    公众号:Python读财 如有问题或建议,请公众号留言 在日常的数据处理中,经常会对一个DataFrame进行逐行.逐列和逐元素的操作,对应这些操作,Pandas中的map.apply和applyma ...

  3. python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

    简介 有些 post 的请求参数是 json 格式的,这个前面发送post 请求里面提到过,需要导入 json模块处理.现在企业公司一般常见的接口因为json数据容易处理,所以绝大多数返回数据也是 j ...

  4. 机器学习数据不平衡不均衡处理之SMOTE算法实现

    20201125 当多数类和少数类数量相差太大的时候,少数类不一定要补充到和多数类数量一致 最好的办法就是全部过采样到最大记录数的类别 调参 SMOTE:只是过采样 SMOTEENN:过采样的同时欠采 ...

  5. Imblearn package study(不平衡数据处理之过采样、下采样、综合采样)

    Imblearn package study 1. 准备知识 1.1 Compressed Sparse Rows(CSR) 压缩稀疏的行 2. 过采样(Over-sampling) 2.1 实用性的 ...

  6. 文献记录(part58)--不平衡数据处理的新方法一基于样本相似度的少数合成法

    学习笔记,仅供参考,有错必究 不平衡数据处理的新方法一基于样本相似度的少数合成法 摘要 引言

  7. 数据不平衡(class_weight、评估方法、上采样、下采样)、详解及实战

    数据不平衡(class_weight.评估方法.上采样.下采样).详解及实战 核心学习函数方法: np.random.choice() np.where() np.concatenate() np.v ...

  8. 对python 数据处理中的LabelEncoder 和 OneHotEncoder详解

    对python 数据处理中的LabelEncoder 和 OneHotEncoder详解_起飞的木木的博客-CSDN博客_labelencoder原理

  9. ucos 消息队列代码详解_用python实现 多进程队的列数据处理详解,零基础记得都收藏哦

    今天就为大家分享一篇python 多进程队列数据处理详解,具有很好的参考价值,希望对大家有所帮助.喜欢的话记得点赞转发关注不迷路哦!!! 总之了写到多进程队列数据处理问题,也就不多废话了,直接来上代码 ...

最新文章

  1. 吸引:由《你的知识需要管理》编辑过程想到的
  2. 人人都要学一点深度学习(1)- 为什么我们需要它
  3. HTTP-GET, HTTP-POST and SOAP的比较
  4. 作业帮电脑版在线使用_在线K12赛道六虎争霸:猿辅导、作业帮又宣布新一轮融资...
  5. C和指针之动态内存分配(读取范围在1和标准输入读取的size之前每个数据出现的次数)
  6. SpringBoot +Lombok注解精华篇
  7. 实验吧_Guess Next SessionOnce More(代码审计)
  8. 前端开发框架整理(一些记录给自己看的)
  9. iOS:选择器控件UIPickerView的详解和演示
  10. OpenGL为什么配置GLAD及GLFW
  11. HOUR 13 Developing Advanced References and Pointer
  12. 艰难环境下,面腾讯、美团、商汤科技等七家大厂前端有感
  13. 关于滤镜的使用,使图片默认为全灰色
  14. 解决video更多选项按钮点击无反应以及操控video标签的控制按钮
  15. Python爬虫——Cookie模拟登录
  16. java计算机毕业设计夕阳红养老院系统源代码+数据库+系统+lw文档
  17. 一篇文章了解新发布的Java JDK 11
  18. LintCode 78: Longest Common Prefix
  19. 2010年微软补丁总结
  20. WM8960音频播放

热门文章

  1. react-hooks之useEffect
  2. scilab中文简介
  3. Word控件Spire.Doc 【页面背景】教程(8) ;在 C# 中将文本水印和图像水印添加到 Word 文档
  4. 说一说 ArrayList 的扩容机制
  5. PN结——“耗尽层”?
  6. deepstream c++ rtsp流输出
  7. 知乎视频该如何玩能够赚到一波,5K字揭秘!
  8. Java 汽车租赁管理系统
  9. j2ee使用struts实现用户的登陆及注册
  10. SWOT分析法——进行项目管理的高效方法