SMOTE算法实现过程中应注意的一个问题

SMOTE是大家在机器学习任务中经常使用的处理非平衡数据的方法,其全称是Synthetic Minority Over-sampling Technique,论文的链接是:https://www.jair.org/index.php/jair/article/view/10302,其PDF版本的直接下载链接是:https://www.jair.org/index.php/jair/article/download/10302/24590。SMOTE的应用非常广泛,例如这篇文章:

Agrawal, Amritanshu, and Tim Menzies. "Is better data better than better data miners?: on the benefits of tuning SMOTE for defect prediction." Proceedings of the 40th International Conference on Software Engineering. ACM, 2018.

里统计,软件工程领域缺陷预测研究方向近些年的工作中有85%的论文使用SMOTE处理非平衡训练数据问题。不过我简单看了看大家实现SMOTE的代码,发现很多朋友都理解错了一个步骤,所以这里总结一下,也给相关朋友提个醒。

先看看SMOTE的伪代码:

SMOTE算法实现过程中应注意的一个问题_第1张图片

其实这个伪代码写得很清楚了,但是我注意到大家出问题的主要是20到22行,在基于一个sample生成synthetic sample的时候,对于每一维特征,生成的gap都是重新计算的,而很多博客中写的方法,都是对所有特征统一生成一个gap(也就是对所有维度统一生成一个随机数),这样的确是误解了这个算法!

例如这些博客中写的:https://blog.csdn.net/panda_zjd/article/details/79200493,https://blog.csdn.net/jiede1/article/details/70215477,话说,这种错误,实在是不应该啊!

我参考原论文和ICSE 2018这篇论文,以及这里:https://github.com/kaushalshetty/SMOTE/blob/master/smote.py,和这里:https://blog.csdn.net/jiede1/article/details/70215477 的代码,重新实现了一下smote代码,个人认为这是和原论文最接近的实现(同时加入了ICSE 2018论文中介绍的幂指数r)

# -*- coding:utf-8 -*-
'''
Created on 2018年9月21日

@author: Yu Qu
'''

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

class Smote(object):
    '''
    classdocs
    '''


    def __init__(self,samples,N=50,k=5,r=2):
        '''
        Constructor
        '''
        self.samples=samples
        self.T,self.numattrs=self.samples.shape
        self.N=N
        self.k=k
        self.r=r#这个r是计算Minkowski距离时的幂指数
        self.newindex=0
        
            
        
    def generate_synthetic_points(self):
        if(self.N<100):
            np.random.shuffle(self.samples)
            self.T=int(self.N*self.T/100)
            print self.T
            self.samples=self.samples[0:self.T,:]
            print self.samples
            self.N=100
        if(self.T

 

你可能感兴趣的:(论文点评)