SMOTE原理及实现

Smote算法原理:
这里写图片描述
python2.7 算法实现: 原算法只能针对N采样率小于100%或者N为100%整数的参数进行采样。我实现的代码可对任意N>0的采样率从进行SMOTE。详情见源码

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from sklearn.neighbors import NearestNeighbors
import numpy as np
import warnings
from sklearn.datasets import load_iris
warnings.filterwarnings("ignore")

class Smote(object):
    """data为少数类"""
    def __init__(self,data,N=100,k=5):
        self.data = data
        self.N = N 
        self.k = k+1
        self.n_attrs = data.shape[1]

    def oversample(self):

        # 1.获取要插值的对象 sample 
        index = set()          #当插值的倍率<1时 存储用来存储smote的样本序列 
        sample = list()        #用来存储进行smote的样本
        newsample = list()     #用来存储插值的样本

        N_inter = int(self.N/100)            #N大于100%的部分(整数的采样倍数)
        N_decimal = self.N- 100*N_inter      #N小于100%的部分

        #N小于100的部分 随机选择N*len(data)进行插值
        while(len(index)<int(len(self.data)*N_decimal/100.0)):
            term = np.random.randint(len(self.data))
            if term in index:
                continue
            else:
                index.add(term)
                sample.append(self.data[term])

        #N大于100%的部分 (整数的采样倍数)        
        if N_inter>0:
                for i in xrange(N_inter):
                    sample.extend(self.data)  
        #2进行插值
        knn = NearestNeighbors(n_neighbors=self.k).fit(self.data)
        for j in sample:
            nnarray = knn.kneighbors(j, return_distance=False)[0][1:] #选择少数类中最近的K个样本 【1:】表示去除自己
            #根据公式  xnew = x +rand(0,1)*(x近邻-x) 计算插值样本 并将其存储在newsample中
            select = np.random.choice(nnarray)
            dif = self.data[select] - j
            gap = np.random.rand(1,self.n_attrs)
            newsample.append(j + gap.flatten() * dif)

        return newsample

if __name__ == "__main__":
    #随机生成100个高斯分布数据
    iris = load_iris()
    data = iris.data
    i_label = iris.target
    data = np.random.randn(100,2)
    i_label = np.ones(100)
    i_label[0:50] = 0
    data = np.column_stack([data,i_label])
    #初始化smote的参数
    K= 3
    N =120
    smote = Smote(data=data[:50],N=N,k=K)
    new = smote.oversample()    #new 为新生成的样本
    print len(new)
### 回答1: SMOTE (Synthetic Minority Over-sampling Technique) 是一种过采样方法,它通过在少数类样本之间生成新的样本来增加样本数量。它会在少数类样本之间找到最近邻样本,然后在这些最近邻样本之间生成新的样本。因此,使用 SMOTE 算法对样本过采样处理后,样本数量会翻倍,因为新生成的样本是在原来的样本数量上增加的。 ### 回答2: 使用SMOTE(Synthetic Minority Over-sampling Technique)算法对样本进行过采样处理后,样本数量会翻倍的原因如下: SMOTE算法是一种基于合成方法的过采样技术。该方法通过合成新的少数类样本来增加整体样本的数量,从而平衡不平衡数据集。具体步骤如下: 1. 对于少数类样本中的每一个样本,计算其与所有少数类样本之间的欧式距离。 2. 从k个最近邻中随机选择一个样本,并以线性插值的方式在该样本与选取样本之间产生新的合成样本。 3. 重复步骤2,直到合成样本数量达到预设值或该样本的所有最近邻都已经被使用。 在这个过程中,每个少数类样本生成了k个合成样本。假设原始数据集中的少数类样本数量为N,每个少数类样本生成k个合成样本,那么最终生成的合成样本数量为N * k。 因此,当使用SMOTE算法对样本进行过采样处理时,每个少数类样本会生成新的合成样本,这导致原始数据集的样本数量翻倍。这种方法的目的是通过合成样本来增加少数类样本的样本数,从而更好地训练模型,并提高分类性能。 ### 回答3: SMOTE(Synthetic Minority Over-sampling Technique)算法是一种常用的用于处理不平衡数据集的过采样方法。在样本通过SMOTE算法过采样处理后,样本数量会翻倍的原因是因为该算法通过合成新的少数类样本实现过采样SMOTE算法的基本原理是通过插值方法生成合成样本,增加少数类样本的数量。具体步骤如下:首先,通过计算少数类样本之间的相邻样本,确定一组相邻样本对;然后,随机选择一个相邻样本对,并在这对样本之间生成一个新的合成样本;最后,重复这个过程,生成指定数量的合成样本。 因此,假设原始数据集中少数类样本的数量为N,经过SMOTE算法过采样处理后,将针对每个少数类样本生成k个合成样本,其中k的取值可以由用户指定。因此,经过SMOTE算法后,少数类样本的数量会增加k倍,即翻倍为kN。 通过SMOTE算法生成的合成样本是根据少数类样本之间的线性插值来生成的,因此新生成的样本是在少数类样本的特征空间内进行的。这样可以有效地增加少数类样本的数量,从而改善数据集的平衡性,使得训练模型更具有代表性和泛化能力。 综上所述,使用SMOTE算法对样本进行过采样处理后,样本数量翻倍是因为算法通过合成新的少数类样本来增加少数类样本的数量,从而改善数据集的平衡性,提高模型的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值