SMOTE算法:
过采样和欠采样是处理非平衡分类问题时的常用手段。
拿二分类为例,如果训练集中阳性样本有1000个,阴性样本有10万个,两者比例为1:100严重失衡。为了一些模型的性能考虑,我们需要进行一些处理使得两者的比例尽可能接近。
过采样:对少的一类进行重复选择,比如我们对1000个阳性样本进行有放回的抽样,抽5万次(当然其中有很多重复的样本),现在两类的比例就变成了1:2,比较平衡。
欠采样:对多的一类进行少量随机选择,比如我们对10万个阴性样本进行随机选择,抽中2000个(当然原样本中很多样本未被选中),现在两类的比例就变成了1:2,比较平衡。
SMOTE:SMOTE算法的基本思想就是对少数类别样本进行分析和模拟,并将人工模拟的新样本添加到数据集中,进而使原始数据中的类别不再严重失衡。该算法的模拟过程采用了KNN技术。
做法:
它以每个样本点的k个最近邻样本点为依据,随机的选择N个邻近点进行差值乘上一个[0,1]范围的阈值,从而达到合成数据的目的。这种算法的核心是:特征空间上邻近的点其特征都是相似的。它并不是在数据空间上进行采样,而是在特征空间中进行采样。
SMOTE
负责接受要采样的类数据集X,返回一个经过SMOTE采样后的数据集,大小为(N/100)*T
,函数有三个参数,分别是T:
需要处理的数据集X的样本数量; N: 采样比例,一般为100, 200, 300等整百数,对应即1倍,2倍,3倍;K: 为采样的最近邻数量,论文中默认为5
。SMOTE
代码思想非常简单,扫描每一个样本点,计算每一个样本点的K个最近邻,将每一个最近邻样本点的索引记录在nnarray
中,之后传入Populate(N, i, nnarray)
中即完成一个样本点的采样。
Populate
则负责根据nnarray
中的索引去随机生成N
个与观测样本i
相似的样本。该函数会计算随机邻近点nn
与观测样本i
点的每一个特征之间的差距dif
,将其差距乘上一个[0, 1]随机因子gap
,再将dif*gap
的值加上观测点i
即完成了一个特征的合成。