类别不平衡问题

类别不平衡问题,顾名思义,即数据集中存在某一类样本,其数量远多于或远少于其他类样本,从而导致一些机器学习模型失效的问题。例如逻辑回归即不适合处理类别不平衡问题,例如逻辑回归在欺诈检测问题中,因为绝大多数样本都为正常样本,欺诈样本很少,逻辑回归算法会倾向于把大多数样本判定为正常样本,这样能达到很高的准确率,但是达不到很高的召回率。

类别不平衡问题在很多场景中存在,例如欺诈检测,风控识别,在这些样本中,黑样本(一般为存在问题的样本)的数量一般远少于白样本(正常样本)。

上采样(过采样)和下采样(负采样)策略是解决类别不平衡问题的基本方法之一。上采样即增加少数类样本的数量,下采样即减少多数类样本以获取相对平衡的数据集。

最简单的上采样方法可以直接将少数类样本复制几份后添加到样本集中,最简单的下采样则可以直接只取一定百分比的多数类样本作为训练集。

SMOTE算法详解

SMOTE全称是Synthetic Minority Oversampling Technique即合成少数类过采样技术,它是基于随机过采样算法的一种改进方案,SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中。

SMOTE 算法是利用特征空间中现存少数类样本之间的相似性来建立人工数据的,也可以认为SMOTE算法假设了在相距较近的少数类样本之间的样本仍然是少数类,
具体过程如下:

随机选择一个少数类样本,计算它到少数类样本集中所有样本的距离,得到它k近邻。
根据样本不平衡比例设置一个采样比例以确定采样倍率n,对于每一个少数类样本x,从其k近邻中随机选择若干个样本
对于每一个随机选出的近邻,选择一个在[0,1]之间的随机数乘以随机近邻和x的特征向量的差,然后加上一个x,
用公式表示:

SMOTE算法摒弃了随机过采样复制样本的做法,可以防止随机过采样易过拟合的问题,而这些多出来的样本本身不带有信息,而且SMOTE 算法对于每个原少数类样本产生相同数量的合成数据样本,这就使得类间发生重复的可能性加大。

SMOTE算法调用

SMOTE算法是用的比较多的一种上采样算法,SMOTE算法的原理并不是太复杂,用python从头实现也只有几十行代码,但是python的imblearn包提供了更方便的接口,在需要快速实现代码的时候可直接调用imblearn。

imblearn类别不平衡包提供了上采样和下采样策略中的多种接口,基本调用方式一致,主要介绍一下对应的SMOTE方法和下采样中的RandomUnderSampler方法。imblearn可使用pip install imblearn直接安装。

代码示例
生成类别不平衡数据

#使用sklearn的make_classification生成不平衡数据样本
from sklearn.datasets import make_classification
#生成一组0和1比例为9比1的样本,X为特征,y为对应的标签
X, y = make_classification(n_classes=2, class_sep=2,weights=[0.9, 0.1], n_informative=3, n_redundant=1, flip_y=0,n_features=20, n_clusters_per_class=1, n_samples=1000, random_state=10)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

查看数据分布

from collections import Counter
#查看所生成的样本类别分布,0和1样本比例9比1,属于类别不平衡数据
print(Counter(y))
#Counter({0: 900, 1: 100})
  • 1
  • 2
  • 3
  • 4

SMOTE算法核心语句

#使用imlbearn库中上采样方法中的SMOTE接口
from imblearn.over_sampling import SMOTE
#定义SMOTE模型,random_state相当于随机数种子的作用
smo = SMOTE(random_state=42)
X_smo, y_smo = smo.fit_sample(X, y)
  • 1
  • 2
  • 3
  • 4
  • 5

查看经过SMOTE之后的数据分布

print(Counter(y_smo))
#Counter({0: 900, 1: 900})
  • 1
  • 2

从上述代码中可以看出,SMOTE模型默认生成一比一的数据,如果想生成其他比例的数据,可以使用radio参数。不仅可以处理二分类问题,同样适用于多分类问题

#可通过radio参数指定对应类别要生成的数据的数量
smo = SMOTE(ratio={1: 300 },random_state=42)
#生成0和1比例为3比1的数据样本
X_smo, y_smo = smo.fit_sample(X, y)
print(Counter(y_smo))
#Counter({0: 900, 1: 300})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

imblearn中上采样接口提供了随机上采样RandomOverSampler,SMOTE,ADASYN三种方式,调用方式和主要参数基本一样。下采样接口中也提供了多种方法,以RandomUnderSampler为例。

from imblearn.under_sampling import RandomUnderSampler
#同理,也可使用ratio来指定下采样的比例
rus = RandomUnderSampler(ratio={0: 500 }, random_state=0)
X_rus, y_rus = rus.fit_sample(X, y)
print(Counter(y_smo))
Counter({0: 500, 1: 300})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

欠采样代码
如果数据类别不平衡高达200:1,可将其比例调整为10:1,

from imblearn.under_sampling import RandomUnderSampler
from collections import Counter
def ratio_multiplier(y):multiplier = {0: 0.05, 1: 1}target_stats = Counter(y)for key, value in target_stats.items():target_stats[key] = int(value * multiplier[key])return target_stats

rus = RandomUnderSampler(random_state=100,ratio=ratio_multiplier)#100
X_res, y_res = rus.fit_sample(X_train_all, y_train_all)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

参考:https://blog.csdn.net/nlpuser/article/details/81265614

                                </div>

SMOTE算法代码实现-机器学习相关推荐

  1. SMOTE算法代码是什么

    SMOTE算法(Synthetic Minority Over-sampling Technique)是一种用于解决数据集不平衡问题的算法.它主要是通过生成新的数据点来增加少数类的样本数量,以提高分类 ...

  2. 神经网络变学习率算法代码_机器学习算法之神经网络

    点击蓝字关注我哦 人工神经网络(Artificial Neural Networks,ANN)系统是 20 世纪 40 年代后出现的.它是由众多的神经元可调的连接权值连接而成,具有大规模并行处理.分布 ...

  3. 样本不均衡SMOTE算法代码实列

    https://www.cnblogs.com/ykit/p/12374427.html

  4. python过采样代码实现_过采样中用到的SMOTE算法

    平时很多分类问题都会面对样本不均衡的问题,很多算法在这种情况下分类效果都不够理想.类不平衡(class-imbalance)是指在训练分类器中所使用的训练集的类别分布不均.比如说一个二分类问题,100 ...

  5. 算法代码[置顶] 机器学习实战之KNN算法详解

    改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了     前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用 ...

  6. Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题

    ML岗位面试:上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点-斐波那契数列.八皇后问题.两种LCS问题 Interview:算法岗位面试-上海某公司算法岗位(偏机器学 ...

  7. Interview:算法岗位面试—10.11下午—上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点、python的可变不可变的数据类型、赋值浅拷贝深拷贝区别

    ML岗位面试:10.11下午-上海某公司算法岗位(偏机器学习,互联网数字行业)技术面试考点之XGBoost的特点.python的可变不可变的数据类型.赋值浅拷贝深拷贝区别 Interview:算法岗位 ...

  8. 算法代码_Python进化算法之多目标优化与代码实战

    前言 自从上三篇博客详细讲解了Python遗传和进化算法工具箱及其在带约束的单目标函数值优化中的应用.利用遗传算法求解有向图的最短路径.利用进化算法优化SVM参数之后,这篇不再局限于单一的进化算法工具 ...

  9. adaboost算法java代码_04-04 AdaBoost算法代码(鸢尾花分类)

    [TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/p ...

最新文章

  1. Jumpserver:跳板机
  2. linux mysql 卸载,安装,測试全过程
  3. Spring_Boot 简单例子
  4. 高等数学:第十二章 微分方程(2)一阶线性非齐次微分方程、全微分方程、可降阶的微分方程
  5. JQueryEasyUI validatebox 扩展其自带验证方法
  6. 旅游景点人流量代码php,用 PHP 爬虫做旅游数据分析
  7. JS中setInterval、setTimeout不能传递带参数的函数的解决方法
  8. vivo X Fold屏幕规格揭晓:搭载2K/120Hz E5折叠屏幕
  9. 曾经我对python shutil很迷茫,直到我看完这篇实操目录……
  10. linux分布式文件部署,Linux的企业-分布式文件系统mfs(moosefs)搭建与配置
  11. 攀枝花学院计算机专业单身率,重磅 | 攀枝花学院2018届毕业生就业质量年度报告...
  12. android的密码是多少,Android图形密码中 你最常用的是哪一个呢?
  13. 正则表达式基础语法大全
  14. Redis的配置文件详解
  15. 笔记本锁定计算机功能键,笔记本电脑键盘锁定键是哪个
  16. p1904 p1903
  17. 依图在实时音视频中语音处理的挑战丨RTC Dev Meetup
  18. 17.文件操作(1)----初识文件操作
  19. LeetCode---2021/8/30
  20. Python语言程序设计基础科学计算与可视化小练习

热门文章

  1. Dockerfile 入门看这篇就够了
  2. nginx介绍及常用功能
  3. 2022-2028年中国液晶电视市场投资分析及前景预测报告
  4. Go 知识点(13) — 如何判断变量类型
  5. shell快速将同一名称的不同类型文件自动划分到一个文件中
  6. 快速删除c/c++语言中的注释
  7. python 通过队列实现栈
  8. 三层交换机原理:02怎么用三层交换机?
  9. Python3:ImportError: No module named 'compiler.ast'
  10. 系统芯片(SOC)架构- Aviral Mittal