类别不平衡问题

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

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

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

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

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)

查看数据分布

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

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)

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

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

从上述代码中可以看出,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})

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})

欠采样代码
如果数据类别不平衡高达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_statsrus = RandomUnderSampler(random_state=100,ratio=ratio_multiplier)#100
X_res, y_res = rus.fit_sample(X_train_all, y_train_all)

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

SMOTE算法代码实现相关推荐

  1. SMOTE算法代码实现-机器学习

    类别不平衡问题 类别不平衡问题,顾名思义,即数据集中存在某一类样本,其数量远多于或远少于其他类样本,从而导致一些机器学习模型失效的问题.例如逻辑回归即不适合处理类别不平衡问题,例如逻辑回归在欺诈检测问 ...

  2. SMOTE算法代码是什么

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

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

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

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

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

  5. smote算法_SMOTE过采样框架+逻辑回归模型案例

    一.SMOTE SMOTE(Synthetic Minority Oversampling Technique)是一种常用于缓解数据不均衡的算法.但是很多小伙伴表示在实际应用中有强烈的过拟合倾向.大多 ...

  6. Python:SMOTE算法

    17.11.28更新一下:最近把这个算法集成到了数据预处理的python工程代码中了,不想看原理想直接用的,有简易版的python开发:特征工程代码模版 ,进入页面后ctrl+F搜smote就行,请自 ...

  7. smote算法_海量样本无从下手?这五种抽样算法分分钟搞定

    全文共1854字,预计学习时长4分钟 数据科学是研究算法的学科.本文介绍了一些常见的用于处理数据的抽样技术. 图片来源:unsplash.com/@gndclouds 简单随机抽样 假设要从一个群体中 ...

  8. 刘知远:近年来开源的算法代码、工具包列表

    来源:知乎 作者:刘知远 本文多图,建议阅读5分钟. 本文为你分享刘知远老师和学生整理的三十来项算法代码和工具包列表. 刚花半天功夫整理了最近几年和同学努力开源的三十来项算法代码和工具包列表( htt ...

  9. c 语言乘法代码,C++实现大数乘法算法代码

    C++实现大数乘法算法代码 //大数乘法算法 #include #include #include using namespace std; int main() { string num1,num2 ...

  10. Python:SMOTE算法——样本不均衡时候生成新样本的算法

    Python:SMOTE算法 直接用python的库, imbalanced-learn imbalanced-learn is a python package offering a number ...

最新文章

  1. Linux监控工具dstat
  2. Python爬虫之Scrapy框架使用selenium
  3. NLP的一些学习资料
  4. php ip重复注册,php中表单的重复提交怎么通过记录IP来防止
  5. 代码一致性 java_java实现一致性hash算法实例代码
  6. Shortest Prefixes(poj 2001)
  7. TwinCAT3中台达A2增量编码器伺服使用PDO方式回零
  8. Linux服务器校准时间
  9. multisim二极管_每日干货——光敏二极管传感器
  10. 华为java面试题目,含面试题+答案
  11. 交换机端口镜像配置大全【汇集22个各种品牌交换机】
  12. Python爬取B站柯南弹幕+Gephi梳理主线剧情
  13. 揭秘玛雅预言--根本没这回事
  14. c语言泊松分酒编码,泊松分酒原理
  15. 004永磁同步电机的工作原理:大白话详细讲解从最简单的直流有刷电机到永磁同步电机是如何转动起来的
  16. 查询2021年天柱二中高考成绩喜报,凯里一中2013年高考喜报教学内容(11页)-原创力文档...
  17. sql中return/break/continue解释
  18. 计算机精品免费视频下载 收藏
  19. 安全产品设计的重要性
  20. 116.s1-黑名单设置的优化(封装BaseAdapter的方法)

热门文章

  1. VBM法MRI图像处理——记第一次使用cat12
  2. python和R的区别
  3. 微信小程序框架主体快速开发教程
  4. 黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署---b站视频跟学
  5. 英特尔核显驱动hd630_全新CPU性能天梯图,十代英特尔与R3 3100/3300X定位讲解
  6. 最新JCR期刊IF及分区情况(中科院SCI期刊分区表)
  7. Java开发中的命名规范
  8. 用ImDisk在Windows 10中创建内存虚拟盘
  9. Spring Cloud Alibaba 基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)
  10. python pyhook_python pyHook安装