在分类问题中常常遇到一个比较头疼的问题,即目标变量的类别存在较大偏差的非平衡问题。这样会导致预测结果偏向多类别,因为多类别在损失函数中所占权重更大,偏向多类别可以使损失函数更小。
处理非平衡问题一般有两种方法,欠抽样和过抽样。欠抽样方法可以生成更简洁的平衡数据集,并减少了学习成本。但是它也带来了一些问题,它会删掉一些有用的样本,尤其当非平衡比例较大时,删掉更多的样本会导致原始数据的分布严重扭曲,进而影响分类器的泛化能力。
因此,后来发展出了过抽样方法,它不会删除多类别的样本,而是通过复制少类别样本的方法处理非平衡问题。但是,应用随机过抽样方法复制少类别样本意味着对少类别样本赋予更高的权重,容易产生过拟合问题。
2002年,研究者提出了SMOTE(Synthetic Minority Oversampling Technique)方法来替代标准的随机过抽样方法,可以一定程度克服随机过抽样带来的过拟合问题,提高分类器的泛化能力。SMOTE方法通过在少类别样本的近邻中应用插值法创造新的少类别样本,而不再是简单的复制或赋予权重。
SMOTE算法的步骤如下
(1)选取第i个少类别样本在所有少类别样本中的K个近邻
(2)从K个近邻中随机选择N个样本,和第i个样本通过插值法获取N个新样本
(3)重复步骤(1)和(2)直到所有少类别样本被遍历一遍
见下图:
SMOTE算法的伪代码
SMOTE算法的python实现
下面用python实现一个SMOTE的最简单的版本:
python中imblearn模块对SMOTE算法的封装
python 中有封装好的SMOTE方法,在实践中可以直接调用该方法,具体参数可以查看官方文档。简单应用举例:
当然SMOTE算法还有很多变种和改进,SMOTE算法的相关文献查找网址:
https://www.jair.org/index.php/jair
领取专属 10元无门槛券
私享最新 技术干货