不平衡分类学习方法 --Imbalaced_learn
最近在进行一个产品推荐课题时,由于产品的特性导致正负样本严重失衡,远远大于3:1的比例(个人认为3:1是建模时正负样本的一个临界点),这样的样本不适合直接用来建模,例如正负样本的比例达到了50:1,就算算法全部预测为另一样本,准确率也会达到51/50=98%.具有很大的局限性.
处理不平衡样本的方法
解决方法主要分为两个方面。
- 第一种方案主要从数据的角度出发,主要方法为抽样,既然我们的样本是不平衡的,那么可以通过某种策略进行抽样,从而让我们的数据相对均衡一些;
- 第二种方案从算法的角度出发, 考虑不同误分类情况代价的差异性对算法进行优化,使得我们的算法在不平衡数据下也能有较好的效果。
这里我们主要从数据的角度进行讨论--采样技术
1.随机采样
随机采样技术是最直接,最简单易理解的处理方式,顾名思义,就是从已有样本中进行抽样,随机采样主要分为两种:(1)随机欠采样,(2)随机过采样.
随机欠采样就是从样本数量的多的类别S1中选择随机少量样本在和原有的少量样本合成作为新的数量级,使得两个样本的比例大致相同;
类似的,过采样就是从样本少的类别中多次采样少数类,采样的数量要大于原来的少数类的数量.随机过采样又分为有放回过采样和无放回过采样,这个和概率学上抽样是一个含义.
很明显,随机采样通过随机选取一些样本来改变样本分类分布的比例,这种方法比较简单,但是也存在诸多问题.
(1).欠采样技术:随机选取一部分数据,会导致数据的信息缺失,无法保证未被采样的数据不具有重要特征
(2).过采样技术:随机的扩大的了数据集,但是可能(极大的可能)会导致过拟合现象.
<<Python实现>>
Python有一个强大的处理不平衡数据的包--imblearn,该包依赖sklearn(>=0.19),numpy,six等相关包,可以通过pip install 进行安装.
实现随机欠采样:imblearn.under_sampling.RandomUnderSampler(ratio='auto', return_indices=False, random_state=None, replacement=False)
随机过采样:imlearn.over_sampling.RandomOverSampler(ratio='auto',random_state=None)
例子:
from collections import Counter
from sklearn.datasets import make_classification ###生成不平衡样本,比例9:1
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 {}".format(Counter(y))) >>original dataset shape Counter({1: 900, 0: 100}) ###随机欠采样
from imblearn.under_sampling import RandomUnderSampler
rus=RandomUnderSampler(random_state=42)
X_res,y_res=rus.fit_sample(X,y)
print('Under Resampled dataset shape {}'.format(Counter(y_res))) >>Under Resampled dataset shape Counter({0: 100, 1: 100}) ##随机过采样
from imblearn.over_sampling import RandomOverSampler
ros=RandomOverSampler(random_state=42)
X_res,y_res=ros.fit_sample(X,y)
print('Over Resampled dataset shape {}'.format(Counter(y_res))) >>Over Resampled dataset shape Counter({0: 900, 1: 900})
2.SMOTE算法
SMOTE算法又称为合成少数类过采样方法,SMOTE算法的基本思想是对少数类样本进行分 析并根据少数类样本人工合成新样本添加到数据集中,从而改进了随机过采样技术造成的过拟合问题.
算法流程:
- 对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集Sm中所有样本的距离,得到其k近邻。
- 根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为x^。
- 对于每一个随机选出的近邻x^,分别与原样本按照如下的公式构建新的样本。

<<Python_实现>>
同样我们可以利用Python的第三方包imbalanced_learn实现SMOTE算法;如其官网给出的例子所"""
@author:Dylan;
@desc:imbalanced_learn
2018/5/21
"""
#-*- encoding:utf-8 -*-
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.decomposition import PCA
from imblearn.over_sampling import SMOTE print(__doc__) def plot_resampling(ax,X,y,title):
c0=ax.scatter(X[y==0,0],X[y==0,1],label="Class #0",alpha=0.5)
c1=ax.scatter(X[y==1,0],X[y==1,1],label="Class #1",alpha=0.5)
ax.set_title(title)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()
ax.spines['left'].set_position(('outward',10))
ax.spines['bottom'].set_position(('outward',10))
ax.set_xlim([-6,8])
ax.set_ylim([-6,6]) return c0,c1 if __name__=='__main__':
X,y=make_classification(n_classes=2,class_sep=2,weights=[0.3,0.7],
n_informative=3,n_redundant=1,flip_y=0,
n_features=20,n_clusters_per_class=1,n_samples=80,random_state=10)
##使用PCA降维到两维,方便进行可视化
pca=PCA(n_components=2)
X_vis=pca.fit_transform(X) ###运用SMOTE算法
kind=['regular','borderline1','borderline2','svm']
sm=[SMOTE(kind=k) for k in kind]
X_resampled=[]
y_resampled=[]
X_res_vis=[]
for method in sm:
X_res,y_res=method.fit_sample(X,y)
X_resampled.append(X_res)
y_resampled.append(y_res)
X_res_vis.append(pca.fit_transform(X_res)) f,((ax1,ax2),(ax3,ax4),(ax5,ax6))=plt.subplots(3,2) ##展示结果
ax2.axis('off')
ax_res=[ax3,ax4,ax5,ax6] c0,c1=plot_resampling(ax1,X_vis,y,'original_set') for i in range(len(kind)):
plot_resampling(ax_res[i],X_res_vis[i],y_resampled[i],'smote{}'.format(kind[i])) ax2.legend((c0,c1),('Class #0','Class #1'),loc='center',ncol=1,labelspacing=0.)
plt.tight_layout()
plt.show()
这段代码中,使用了sklearn简单是生成了一个不平衡的样本,使用了imblearn.over_sampling的SMOTE算法进行了过采样处理.生成结果如下图所示:

上图中.图1是原始数据的分布,图3-6分别是采样 'regular','borderline1','borderline2','svm'这四种类型处理方法的结果.个人倾向于使用svm.
使用SMOTE算法可以解决随机复制样本带来的问题,但是也可能会存在重叠的问题,因此基于smote算法提出了Borderline算法.
2.Borderline-SMOTE算法
该算法对SMOTE算法中的少数类的最近邻加以限制,在Borderline-SMOTE中,若少数类样本的每个样本xi求k近邻,记作Si−knn,且Si−knn属于整个样本集合
S而不再是少数类样本,若满足 k/2<|si−knn∩smax|<k.即k近邻中超过一般是多数样本.那么就将xi加入到DANGER集合.显然该集合代表了接近分类边界的样本.
将DANGER当作SMOTE种子样本的输入生成新样本.特别地,当上述条件取右边界,即k近邻中全部样本都是多数类时此样本不会被选择为种样本生成新样本,
此情况下的样本为噪音。


当然还有一些其他的算法,例如ensemble,Informed InderSampling等,可以才有.Imblearn都对这些算法进行了实现.
参考自:https://blog.csdn.net/shine19930820/article/details/54143241;
http://contrib.scikit-learn.org/imbalanced-learn/stable/api.html
不平衡分类学习方法 --Imbalaced_learn的更多相关文章
- 文本分类需要CNN?No!fastText完美解决你的需求(后篇)
http://blog.csdn.net/weixin_36604953/article/details/78324834 想必通过前一篇的介绍,各位小主已经对word2vec以及CBOW和Skip- ...
- 机器学习实战4:Adaboost提升:病马实例+非均衡分类问题
Adaboost提升算法是机器学习中很好用的两个算法之一,另一个是SVM支持向量机:机器学习面试中也会经常提问到Adaboost的一些原理:另外本文还介绍了一下非平衡分类问题的解决方案,这个问题在面试 ...
- 统计学习方法 AdaBoost
提升方法的基本思路 在概率近似正确(probably approximately correct,PAC)学习的框架中, 一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,那 ...
- 机器学习 —— 类不平衡问题与SMOTE过采样算法
在前段时间做本科毕业设计的时候,遇到了各个类别的样本量分布不均的问题——某些类别的样本数量极多,而有些类别的样本数量极少,也就是所谓的类不平衡(class-imbalance)问题. 本篇简述了以下内 ...
- ML.NET 示例:二元分类之信用卡欺诈检测
写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...
- 用R语言实现对不平衡数据的四种处理方法
https://www.weixin765.com/doc/gmlxlfqf.html 在对不平衡的分类数据集进行建模时,机器学**算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带 ...
- [转]类不平衡问题与SMOTE过采样算法
在前段时间做本科毕业设计的时候,遇到了各个类别的样本量分布不均的问题——某些类别的样本数量极多,而有些类别的样本数量极少,也就是所谓的类不平衡(class-imbalance)问题. 本篇简述了以下内 ...
- 用R处理不平衡的数据
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自云+社区翻译社,作者ArrayZoneYour 在分类问题当中,数据不平衡是指样本中某一类的样本数远大于其他的类别样本数.相比于多分 ...
- 易百教程人工智能python修正-人工智能监督学习(分类)
分类技术或模型试图从观测值中得出一些结论. 在分类问题中,我们有分类输出,如“黑色”或“白色”或“教学”和“非教学”. 在构建分类模型时,需要有包含数据点和相应标签的训练数据集. 例如,如果想检查图像 ...
随机推荐
- iOS开发 常见错误
一.NSAppTransportSecurity 错误提示:NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL ...
- 软工实践-Alpha 冲刺 (6/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成了主界面的基本布局 ...
- lintcode-439-线段树的构造 II
439-线段树的构造 II 线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间.start和end都是整数,并按照如下的方式赋值: 根节点的 start ...
- 发布vue插件到npm上
总体分为2个步骤 一,先写好插件 二,发布到npm上面 一,写vue插件 vue有一个开放的方法install,在vue插件需要写在这个方法里面,在vue官网,里面说的很清楚,这个方法里面可以是全局方 ...
- windows系统,可以ping通IP但是不能ping通网址的解决方法
之前慌忙之中遇到过一次,当时是客户比较着急使用就没有怎么折腾,什么数据当时都没留下反正是各种方法都尝试过了,但是就是ping IP是可以通的,但是域名就是不解析,后来有个群友也是遇见了这个问题(我当时 ...
- mysql 慢查询,查询缓存,索引,备份,水平分割
1.开启慢查询 在mysql的配置文件my.ini最后增加如下命令 [mysqld]port=3306slow_query_log =1long_query_time = 1 2.查看慢查询记录 默认 ...
- Linux 常用指令【持续更新】
在学校的时候学过一些简单的 Linux 命令,主要是文件的创建拷贝解压等操作,最近在电脑上安装了一个CentOS6.8版本的基本版,纯命令行操作. ../ 代表上一级目录 ./ 代表本级目录 / 代表 ...
- 第88天:HTML5中使用classList操作css类
在HTML5 API里,页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增.删除.修改节点上的CSS类.使用classList,程序员还可以用它来判断某个节点是否被赋 ...
- CIR,CBS,EBS,PIR,PBS 名词解释 令牌桶应用
为了达到上述目的,我们需要对进入网络的流量进行监督,实现CAR(Committed Access Rate). CAR:将进入网络的用户流量的速率限制在约定的范围之内,从而避免引起网络拥塞. CIR( ...
- [SHOI2011]双倍回文 manacher
题面: 洛谷:[SHOI2011]双倍回文‘ 题解: 首先有一个性质,本质不同的回文串最多O(n)个. 所以我们可以对于每个i,求出以这个i为结尾的最长回文串,然后以此作为长串,并判断把这个长串从中间 ...