类别不平衡问题之SMOTE算法(Python imblearn极简实现)
类别不平衡问题
注1:x均转为为float类型才行
注:自己电脑上,做以下改动方可用
fit_sample 改为 fit_resample
ratio={1: 300 } 改为 sampling_strategy={1:300} #是将1升为300条的意思,而不是0-1的比例
类别不平衡问题,顾名思义,即数据集中存在某一类样本,其数量远多于或远少于其他类样本,从而导致一些机器学习模型失效的问题。例如逻辑回归即不适合处理类别不平衡问题,例如逻辑回归在欺诈检测问题中,因为绝大多数样本都为正常样本,欺诈样本很少,逻辑回归算法会倾向于把大多数样本判定为正常样本,这样能达到很高的准确率,但是达不到很高的召回率。
类别不平衡问题在很多场景中存在,例如欺诈检测,风控识别,在这些样本中,黑样本(一般为存在问题的样本)的数量一般远少于白样本(正常样本)。
上采样(过采样)和下采样(负采样)策略是解决类别不平衡问题的基本方法之一。上采样即增加少数类样本的数量,下采样即减少多数类样本以获取相对平衡的数据集。
最简单的上采样方法可以直接将少数类样本复制几份后添加到样本集中,最简单的下采样则可以直接只取一定百分比的多数类样本作为训练集。
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})
转自https://blog.csdn.net/nlpuser/article/details/81265614
类别不平衡问题之SMOTE算法(Python imblearn极简实现)相关推荐
- smoteenn算法_类别不平衡问题之SMOTE算法(Python imblearn极简实现)
https://blog.csdn.net/weixin_35275162/article/details/112955985?utm_medium=distribute.pc_relevant.no ...
- [转载] 【数据处理】 python 极速极简画图——频数(率)分布直方图
参考链接: Python | 使用XlsxWriter模块在Excel工作表中绘制面积图 说明 当我们拿到数据的时候,第一时间就是想知道数据的特点,然鹅单个的数值如平均数.中位数仍不够直观,我们更 ...
- 30个Python常用极简代码,拿走就用
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨Fatos Morina 来源丨Python 技术 编辑丨极市 ...
- python1000个常用代码-30个Python常用极简代码,拿走就用
学 Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则.本文是 30 个极简任务,初学者可以尝试着自己实现:本文同样也是 30 段代码,Python 开发者也可以看看是不是 ...
- 零基础python必背代码-30个Python常用极简代码,拿走就用
学 Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则.本文是 30 个极简任务,初学者可以尝试着自己实现:本文同样也是 30 段代码,Python 开发者也可以看看是不是 ...
- 30个Python常用极简代码
学 Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则.本文是 30 个极简任务,初学者可以尝试着自己实现:本文同样也是 30 段代码,Python 开发者也可以看看是不是 ...
- 30个Python常用极简代码,拿走就用,赶紧收藏!
学 Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则.本文是 30 个极简任务,初学者可以尝试着自己实现:本文同样也是 30 段代码,Python 开发者也可以看看是不是 ...
- python极简应用_30个Python常用极简代码,拿走就用
学 Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则.本文是 30 个极简任务,初学者可以尝试着自己实现:本文同样也是 30 段代码,Python 开发者也可以看看是不是 ...
- python基础30个常用代码-30个Python常用极简代码,拿走就用
学 Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则.本文是 30 个极简任务,初学者可以尝试着自己实现:本文同样也是 30 段代码,Python 开发者也可以看看是不是 ...
- python 30个小代码_30个Python常用极简代码,拿走就用
点击上方"测试开发社区",关注并"星标" 每日接收Python&测试开发干货! 学 Python 怎样才最快,当然是实战各种小项目,只有自己去想与写,才 ...
最新文章
- SQL case when
- mac apache 配置
- python中的二进制、八进制、十六进制的相互转换
- bfc和haslayout
- PKG_CONFIG_PATH错误提示解决办法
- rsa实现js前台加密java后台解密
- LAMP部署脚本--安装篇
- [leetcode周赛] 1349. 参加考试的最大学生数
- 固定dll的加载基址的方法
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_9 spring的依赖注入
- 小米手机怎么打不开云服务器错误,为什么小米云服务打不开页面?
- 4. 木马病毒和免杀技术,另一种免杀思路
- 信号的带宽、传输速率、采样率的关系
- 密码的输入问题(do while()和st1.equals(st2)的使用)
- C2 - Skyscrapers (hard version),Codeforces Round #622 (Div. 2),单调栈
- windows7系统的时间服务器,win7系统搭建ntp服务器的操作方法
- 入职第一天,我接手了号称【屎山】的祖传代码,这还能卷吗???
- Android实现有声计算器代码,有声语音计算器效果与代码
- 超声波测距1602显示程序
- 图片怎么做雕刻路径_迷你字雕刻路径怎么做