最近在进行一个产品推荐课题时,由于产品的特性导致正负样本严重失衡,远远大于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=Falserandom_state=Nonereplacement=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算法的基本思想是对少数类样本进行分 析并根据少数类样本人工合成新样本添加到数据集中,从而改进了随机过采样技术造成的过拟合问题.

算法流程:

  

  1. 对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集Sm中所有样本的距离,得到其k近邻。
  2. 根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为x^。
  3. 对于每一个随机选出的近邻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的更多相关文章

  1. 文本分类需要CNN?No!fastText完美解决你的需求(后篇)

    http://blog.csdn.net/weixin_36604953/article/details/78324834 想必通过前一篇的介绍,各位小主已经对word2vec以及CBOW和Skip- ...

  2. 机器学习实战4:Adaboost提升:病马实例+非均衡分类问题

    Adaboost提升算法是机器学习中很好用的两个算法之一,另一个是SVM支持向量机:机器学习面试中也会经常提问到Adaboost的一些原理:另外本文还介绍了一下非平衡分类问题的解决方案,这个问题在面试 ...

  3. 统计学习方法 AdaBoost

    提升方法的基本思路 在概率近似正确(probably approximately correct,PAC)学习的框架中, 一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,那 ...

  4. 机器学习 —— 类不平衡问题与SMOTE过采样算法

    在前段时间做本科毕业设计的时候,遇到了各个类别的样本量分布不均的问题——某些类别的样本数量极多,而有些类别的样本数量极少,也就是所谓的类不平衡(class-imbalance)问题. 本篇简述了以下内 ...

  5. ML.NET 示例:二元分类之信用卡欺诈检测

    写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...

  6. 用R语言实现对不平衡数据的四种处理方法

    https://www.weixin765.com/doc/gmlxlfqf.html 在对不平衡的分类数据集进行建模时,机器学**算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带 ...

  7. [转]类不平衡问题与SMOTE过采样算法

    在前段时间做本科毕业设计的时候,遇到了各个类别的样本量分布不均的问题——某些类别的样本数量极多,而有些类别的样本数量极少,也就是所谓的类不平衡(class-imbalance)问题. 本篇简述了以下内 ...

  8. 用R处理不平衡的数据

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自云+社区翻译社,作者ArrayZoneYour 在分类问题当中,数据不平衡是指样本中某一类的样本数远大于其他的类别样本数.相比于多分 ...

  9. 易百教程人工智能python修正-人工智能监督学习(分类)

    分类技术或模型试图从观测值中得出一些结论. 在分类问题中,我们有分类输出,如“黑色”或“白色”或“教学”和“非教学”. 在构建分类模型时,需要有包含数据点和相应标签的训练数据集. 例如,如果想检查图像 ...

随机推荐

  1. 使用JSon实现三级联动

    JSon实现三级联动 我觉得我这个方法比较麻烦,但是目前技术还比较弱,所以先做个笔记自己理解.目前没有和后台交互,只是在前台页面实现了 jQuery和JSon数据实现的,代码如下: <!DOCT ...

  2. is-A继承?Has-A?

    教程把is-A和Has-A放在一起,我还以为java支持简单的方法能把Has对象的方法导出呢..   extents  implements 要试一下. 不知道狗和汽车为什么总是被选出来举例.   p ...

  3. 《剑指offer》---左旋转字符串与右旋转字符串

    本文算法使用python3实现 1. 问题1 1.1 题目描述:   汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S, ...

  4. 爬虫学习之-git拉取远程错误

    本文讲的是把git在最新2.9.2,合并pull两个不同的项目,出现的问题如何去解决 如果合并了两个不同的开始提交的仓库,在新的 git 会发现这两个仓库可能不是同一个,为了防止开发者上传错误,于是就 ...

  5. 用iptables做代理

    出于安全考虑,Linux系统默认是禁止数据包转发的.配置Linux系统的ip转发功能,打开系统转发功能:echo "1" > /proc/sys/net/ipv4/ip_fo ...

  6. 小记IptabLes和IptabLex病毒清理过程

    去年有台Linux服务器被黑了,看了500万行日志(现在觉得当时好厉害呀),反正当时的日志文件有700Mb以上大.前两天师兄告诉我,信息中心的老师给他说我们有台服务器应该是被人入侵了,当作内网的跳板, ...

  7. Collections带有的排序方法 传入的元素类型 需是子类或者这个类的实例

  8. 用CSS实现3D 滚动的立方体

    用css3写3D立方体用到的属性不多,就那么几个:perspective,transform-style,以及transform. 目前来说能完美支持3D的浏览器有chrome.safari,火狐也支 ...

  9. 导出ORACLE表结构到SQL语句(含CLOB)

      转自:http://blog.itpub.net/84738/viewspace-442854/ 先用exp导出空表 exp username/password rows=n file=expor ...

  10. C/C++语言中让电脑随机的在某个范围中的任一随机数

    这是我在笔试中碰见的一题中一部分,这就就记录下来.举例,输出[1,3]中任一随机数. #include<iostream> #include<cstdlib> #include ...