![cbe1b15e53cf06bc4d11075b033f4e7b.png](https://i-blog.csdnimg.cn/blog_migrate/4bc58f30412f9b501283341d6f1c3567.jpeg)
摘要
SMOTE是一种综合采样人工合成数据算法,用于解决数据类别不平衡问题(Imbalanced class problem),以Over-sampling少数类和Under-sampling多数类结合的方式来合成数据。本文将以Nitesh V. Chawla(2002)的论文为蓝本,阐述SMOTE的核心思想以及实现其朴素算法,在传统分类器(贝叶斯和决策树)上进行对比算法性能并且讨论其算法改进的途径。
1. 引言
类别不平衡是一种在分类器模型训练过程中常见的问题之一,如通过大量胸透图片来学习判断一个人是否有癌症,又如在网络流日志中学习检测可能是攻击行为的数据模式,这一类的任务中都是正常的类多于异常(诊断属于癌症,属于攻击行为)的类,在类别不平衡数据下训练出来的分类器要非常的小心,即使该分类器拥有很高的精度,因为它很可能会习得大部分的都是正常的,而我们可能需要的是它能够最大程度的识别异常行为,哪怕精度低于前者。
为了解决这一问题,业内已经有以下5种公认的方法去扩充数据集[1],以至于类别均匀:
- 随机的增大少数类的样本数量。
- 随机的增大特定少数类样本的数量。
- 随机的减少多数类样本的数量。
- 随机的减少特定多数类样本的数量。
- 修改代价函数,使得少数类出错的代价更高。
本文要介绍的SMOTE算法就是一种综合1,3方法的改进方式,它以每个样本点的k个最近邻样本点为依据,随机的选择N个邻近点进行差值乘上一个[0,1]范围的阈值,从而达到合成数据的目的。这种算法的核心是:特征空间上邻近的点其特征都是相似的。它并不是在数据空间上进行采样,而是在特征空间中进行采样,所以它的准确率会高于传统的采样方式。这也是为什么到目前为止SMOTE以及其派生的算法仍然是较为主流的采样技术的原因。
![ca9b819ca789f5036745e899a929f0ce.png](https://i-blog.csdnimg.cn/blog_migrate/de6887381488516e6da3f41731aca792.png)
Figure 1
在Figure 1中,假设数据点A在特征空间上有4个邻近点,若N为2,则SMOTE会随机选择其中2个邻近点B,C,分别计算A->B, A->C的距离,如图中绿线和红线所示,在绿线或红线上的所有采样点都是合理的,如点A1。为了确保数据点尽可能的多样(不重叠),故乘上一个[0, 1]之间的随机因子。
本文将会在第2章根据SMOTE的核心以及其伪代码实现该算法,并应用在测试数据集上;第3章会使用第三方imbalanced-learn
库中实现的SMOTE算法进行采样,以验证我们实现的算法的准确性,当然这个库中的算法要优于朴素的SMOTE算法,之后我们会以决策树和高斯贝叶斯分类器为工具,对测试原始数据、应用我们所实现的SMOTE采样后产生的数据以及应用第三方库SMOTE产生的数据三者分别产生的数据集进行性能比较;第4章会讨论朴素SMOTE算法更加鲁棒和表现更好的优化途径;第5章是对本文的总结。
2. 算法分析与实现
Fig. 2是在SMOTE论文中提出的伪代码,由两个函数SMOTE(T, N,