数据不平衡之SMOTE算法

数据不平衡之SMOTE算法在企业的数据分析中,很少会遇到正负样本数据比例平衡的状况。通常情况是,绝大多数为正样本,而只有极少数(几个或者十几个)负样本。在这种情况下,不论是用LR,SVM或者基于提升方法的随机森林,直接用该数据集进行学习的效果都不会太好,原因是这些方法的学习结果都会偏向于样本较多的一类。另一个方面,对学习结果进行评估时,假如正样本占95%,负样本仅占5%,这样甚至不需要学习,直接把所有新样本预测为正,准确率

大家好,又见面了,我是你们的朋友全栈君。

在企业的数据分析中,很少会遇到正负样本数据比例平衡的状况。通常情况是,绝大多数为正样本,而只有极少数(几个或者十几个)负样本。在这种情况下,不论是用LR,SVM或者基于提升方法的随机森林,直接用该数据集进行学习的效果都不会太好,原因是这些方法的学习结果都会偏向于样本较多的一类。另一个方面,对学习结果进行评估时,假如正样本占95%,负样本仅占5%,这样甚至不需要学习,直接把所有新样本预测为正,准确率就可以达到95%,而召回率却很低。因此,在学习一个模型前,处理不平衡的数据是十分必要的。

怎么让不平衡的数据变平衡呢?主要有两个方法,一是欠抽样,顾名思义就是删除正样本(以正样本占绝大多数为例)中的样本,删除的数量根据负样本的数量而定,这种方法的缺点也很明显,会删除正样本所带的信息,当正负样本的比例悬殊时,需要删除较多的正样本数量,这会减少很多正样本携带的信息。因此,最常用的方法是第二种——过抽样。

一种过抽样的方法是随机采样,采用简单随机复制样本来增加负样本的数量。这样容易产生模型的过拟合问题,即使得模型学习到的信息过于特别而不够泛化。另一种过抽样的方法就是要介绍的SMOTE算法,其基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,算法流程如下。

(1)对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集中所有样本的距离,得到其k近邻。 
(2)根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的
近邻为o。 

(3)对于每一个随机选出的近邻o,分别与原样本按照公式o(new)=o+rand(0,1)*(x-o)构建新的样本。


一个简单的python代码如下

# %load smote.py

import random
from sklearn.neighbors import NearestNeighbors
import numpy as np

class Smote:
    def __init__(self,samples,N=1,k=5):
        self.n_samples,self.n_attrs=samples.shape
        self.N=N
        self.k=k
        self.samples=samples
        self.newindex=0
       # self.synthetic=np.zeros((self.n_samples*N,self.n_attrs))

    def over_sampling(self):
        N=int(self.N)
        self.synthetic = np.zeros((self.n_samples * N, self.n_attrs))
        neighbors=NearestNeighbors(n_neighbors=self.k).fit(self.samples)
        print(‘neighbors’,neighbors)
        for i in range(len(self.samples)):
            nnarray=neighbors.kneighbors(self.samples[i].reshape(1,-1),return_distance=False)[0]
            #print nnarray
            self._populate(N,i,nnarray)
        return self.synthetic
    
    # for each minority class samples,choose N of the k nearest neighbors and generate N synthetic samples.
    def _populate(self,N,i,nnarray):
        for j in range(N):
            nn=random.randint(0,self.k-1)
            dif=self.samples[nnarray[nn]]-self.samples[i]
            gap=random.random()
            self.synthetic[self.newindex]=self.samples[i]+gap*dif
            self.newindex+=1
a=np.array([[1,2,3],[4,5,6],[2,3,1],[2,1,2],[2,3,4],[2,3,4]])
s=Smote(a,N=2)              #a为少数数据集,N为倍率,即从k-邻居中取出几个样本点
print(s.over_sampling())

数据不平衡之SMOTE算法


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151097.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python3列表_python tuple

    Python3列表_python tuple列表列表特点:是一种序列结构,与元组不同,列表具有可变性,可以追加、插入、删除、替换列表中的元素新增元素appendappend添加一个对象,可以是任意类型a=['zhangsa

    2022年7月31日
    3
  • bat脚本执行命令_实用bat代码

    bat脚本执行命令_实用bat代码注意:编辑bat文件请使用ANSI编码(不然会出现中文乱码)1、语句注释rem命令行注释,可以回显(语句会在命令行中显示);::两个冒号,效果同上,但不会回显。(冒号后加任意非字母数字字符都可起到注释作用)2、暂停pause暂停,命令行中出现”请按任意键继续…”自定义暂停时的文本,如下:::pause>nul,隐藏原暂停文本echo这里是自定义文本!&…

    2022年9月24日
    0
  • 织梦php调用底部,dede底部出现织梦官方版权链接”Power by DedeCms”

    织梦php调用底部,dede底部出现织梦官方版权链接”Power by DedeCms”显示结果:自从dedecms织梦系统更新到6.7日的版本,底部版权信息调用标签{dede:global.cfg_powerby/}会自动加上织梦官方的链接[PowerbyDedeCms],想必很多新用户使用中都想去除这个官方的链接,由于这是官方的作为,本文只是提供一个技术的交流,并不鼓励大家去除底部的链接。好了,回归正题,大家知道,进入后台在后台的系统-系统参数有个网站版权信息,在这里并不能…

    2022年7月13日
    12
  • 2022新UI美观发卡网源码下载+功能强大且齐全

    2022新UI美观发卡网源码下载+功能强大且齐全正文:程序没有更多的介绍,总的来说就是2022最新版本的,美观功能齐全无BUG,上传程序后,运行目录public,伪静态thinkPHP,域名/install.php进行安装,就是这么简单哈,程序没有马赛克的演示图我就放压缩包了,大家自行去查看吧。程序:lanzou.com/ieWX005hj7dc图片:…

    2022年7月14日
    20
  • 全家桶激活码3月最新在线激活

    全家桶激活码3月最新在线激活,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    45
  • mysql索引b树b+树_索引为什么用b+树而不是b树

    mysql索引b树b+树_索引为什么用b+树而不是b树第一篇引用第二篇引用第三篇引用第四篇引用

    2022年8月8日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号