欠采样和过采样
什么是样本不平衡
对于二分类问题,如果两个类别的样本数目差距很大,那么训练模型的时候会出现很严重的问题。举个简单的例子,猫狗图片分类,其中猫有990张,狗有10张,这时候模型只需要把所有输入样本都预测成猫就可以获得99%的识别率,但这样的分类器没有任何价值,它无法预测出狗。
类别不平衡(class-imbalance)就是指分类任务中正负样本数目差距很大的情况。生活中有很多类别不平衡的例子,如工业产品次品检测,次品样本数目远小于正品样本;欺诈问题,欺诈类观测在样本集中也只占据少数。因此,有必要了解解决类别不平衡的常用方法。
在实际的项目当中,数据往往是不平衡的,那么我们一半采用欠采样(undersampling)或者过采样(oversampling)来处理。
欠采样就是从多数类中删除样本,过采样就是向少数类中添加更多示例。
imbalanced-learn(imblearn)是一个用于解决不平衡数据集问题的 python 包,它提供了多种方法来进行欠采样和过采样。
a. 使用 Tomek Links 进行欠采样:
imbalanced-learn 提供的一种方法叫做 Tomek Links。Tomek Links 是邻近的两个相反类的例子。
在这个算法中,我们最终从 Tomek Links 中删除了大多数元素,这为分类器提供了一个更好的决策边界。
1 from imblearn.under_sampling import TomekLinks 2 tl = TomekLinks(return_indices=True, ratio= majority ) 3 X_tl, y_tl, id_tl = tl.fit_sample(X, y)
b. 使用 SMOTE 进行过采样:
对训练集中少数类进行“过采样”(oversampling),简单来说就是少数类中一个样本抽取多次,从而使正负样本数目接近,再进行学习。
在 SMOE(Synthetic Minority Oversampling Technique)中,我们在现有元素附近合并少数类的元素。
1 from imblearn.over_sampling import SMOTE 2 smote = SMOTE(ratio= minority ) 3 X_sm, y_sm = smote.fit_sample(X, y)
imbLearn 包中还有许多其他方法,可以用于欠采样(Cluster Centroids, NearMiss 等)和过采样(ADASYN 和 bSMOTE)。
参考资料
1、https://mp.weixin.qq.com/s/Qz4qNa5AoSluyyLC_ZSJdA
2、欠采样和过采样解决分类样本不平衡问题 - Js2Hou - 博客园 (cnblogs.com)
3、python数据预处理 :样本分布不均的解决(过采样和欠采样)_python_脚本之家 (jb51.net)
4、(15 封私信 / 41 条消息) 如何解决兼具类不平衡,类别较多的多分类,样本不足的问题? - 知乎 (zhihu.com)