欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响

欠采样(undersampling)和过采样(oversampling)

参考:知乎专栏
https://www.zhihu.com/question/269698662

为什么类别不平衡会影响模型输出?

欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响_第1张图片

采样法和类别不平衡有什么关系?

采样法最受人诟病的就是可能会改变原始数据的分布,从而带来偏差。

如何直观理解采样法

undersample了覆盖量不够, oversample了会overfit。undersampling其实很有发挥空间,你如果能找到一个能包含原有数据的大部分信息的subset,那就很棒了。

实验数据是Cardio,1831条数据,每条数据有21个特征。其中正例176个(9.6122%),反例1655个(90.3878%),属于典型的类别不平衡问题。

过采样:
SMOTE: 对于少数类样本a, 随机选择一个最近邻的样本b, 然后从a与b的连线上随机选取一个点c作为新的少数类样本;
ADASYN: 关注的是在那些基于K最近邻分类器被错误分类的原始样本附近生成新的少数类样本。

1 原始数据;
2 欠采样:反例中随机选择176个数据,与正例合并;
3 过采样 从正例中反复抽取并生成1655个数据(势必会重复),并与反例合并;
4 SMOTE,一种过采样方法。SMOTE通过找到正例中数据的近邻,来合成新的1655-176=1479个“新正例”,并与原始数据合并。另外一个相似的算法是ADASYN。

  1. 过采样(右上)只是单纯的重复了正例,因此最大的风险就是对正例过拟合。
  2. 欠采样(左下)抛弃了大部分反例数据。可能会造成偏差很大的模型。
另一种常见的做法是反复做欠采样

生成 1655/176=9 个新的子样本,其中每个样本的正例都使用这176个数据,而反例则从1655个数据中不重复采样。最终对这9个样本分别训练,并集成结果。这样数据达到了有效利用,但也存在风险:
1 训练多个模型造成了过大的开销,合并模型结果需要额外步骤;
2 正例被反复使用,和过采样一样,很容易造成模型的过拟合。

  1. SMOTE(右下)在局部区域通过K-近邻生成了新的正例。
    1 降低了过拟合风险。K近邻在局部合成数据可以被理解为一种集成学习,降低了方差;
    2 缺点也有,比如运算开销加大,同时可能会生成一些“可疑的点”。
采样法归纳总结

1 采样方法一般比直接调整阈值的效果要好;
2 使用采样方法(过采样和欠采样)有一定的过拟合的风险,应搭配使用正则化模型;
3 过采样的结果较为稳定,SMOTE效果最好;
4 过采样大部分时候比欠采样的效果好;
5 实验结果在(L2正则的逻辑回归、随机森林、xgboost)一致,因此和采样法搭配使用的模型最好可以很好的处理过拟合。

使用过采样(或SMOTE)+强正则模型(如XGBoost)可能比较适合不平衡的数据。拿到一个新的数据时,可以不妨直接先试试这个方法,作为基准。
过采样和欠采样结合

由边界的样本与其他样本进行过采样差值时, 很容易生成一些噪音数据. 因此, 在过采样之后需要对样本进行清洗。
用SMOTE过采样,再利用Tomek’s link再控制新的样本空间。

参数修正

欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响_第2张图片

更有趣的讨论

引入先验概率,而不是粗暴的进行采样操作。

例子
https://imbalanced-learn.org/en/stable/combine.html
python库
https://imbalanced-learn.org/en/stable/index.html
Python sklearn 实现过采样和欠采样
https://blog.csdn.net/qq_27802435/article/details/81201357

你可能感兴趣的:(机器学习)