最近在进行一个产品推荐课题时,由于产品的特性导致正负样本严重失衡,远远大于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. 人生苦短,我用Python!

    一.程序分析 1.读取文件到缓冲区 def process_file(): # 读文件到缓冲区 try: # 打开文件 f = open("C:\\Users\\panbo\\Desktop ...

  2. python 动态获取当前运行的类名和函数名的方法

    一.使用内置方法和修饰器方法获取类名.函数名 python中获取函数名的情况分为内部.外部,从外部的情况好获取,使用指向函数的对象,然后用__name__属性 复制代码代码如下: def a():pa ...

  3. 用P4对数据平面进行编程

    引言 SDN架构强调了对控制平面的可编程,数据平面只负责转发,导致数据平面很大程度上受制于功能固定的包处理硬件. P4语言的特性: 目标无关性:P4语言不受制于具体设备,所有可编程芯片都可以使用P4编 ...

  4. HDU 5154 Harry and Magical Computer 有向图判环

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5154 题解: 有向图判环. 1.用dfs,正在访问的节点标记为-1,已经访问过的节点标记为1,没有访 ...

  5. Redis的sentinel机制(sentinel节点IP为:192.168.23.10) “哨兵”

    万一主节点打击,主从模型将会停止工作,为了解决这个问题,Redis提供了一个sentinel(哨兵),以此来实现主从切换的功能,一旦主节点宕机了,sentinel将会在从节点中挑一个作为主节点.与zo ...

  6. RPM 方式安装 Oracle18c 的方法

    1. 云和恩墨公众号介绍了 18c 通过rpm方式的安装包. 所以需要先下载一下. 地址. https://www.oracle.com/technetwork/database/enterprise ...

  7. SQL SERVER SA密码忘记,windows集成身份验证都登录不了不怎么办

    有时候SQL SERVER 的SA强密码策略真的很烦人,不同的系统密码策略又不一样,导致经常会忘记密码,这不,这回我本机的SQL SERVER很久不用了,彻底忘了密码是什么.查了一下资料还是找到了解决 ...

  8. 【前端学习笔记】call、apply、bind方法

    1.call()方法: // move函数实现移动平面图上一个点位置功能 var move = function(x,y){ this.x += x; this.y += y; } // 定一个点p ...

  9. WebClient的使用

    1.下载网页源码: private void button1_Click(object sender, EventArgs e) { string url = textBox1.Text; strin ...

  10. python的N个小功能(高斯模糊原理及实践)

    原理: 二维高斯函数 1)         为了计算权重矩阵,需要设定σ的值.假定σ=1.5,则模糊半径为1的权重矩阵如下: 2)         这9个点的权重总和等于0.4787147,如果只计算 ...